13d8536b4Sopenharmony_ci/* 23d8536b4Sopenharmony_ci * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. 33d8536b4Sopenharmony_ci * Copyright (c) 2020-2022 Huawei Device Co., Ltd. All rights reserved. 43d8536b4Sopenharmony_ci * 53d8536b4Sopenharmony_ci * Redistribution and use in source and binary forms, with or without modification, 63d8536b4Sopenharmony_ci * are permitted provided that the following conditions are met: 73d8536b4Sopenharmony_ci * 83d8536b4Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright notice, this list of 93d8536b4Sopenharmony_ci * conditions and the following disclaimer. 103d8536b4Sopenharmony_ci * 113d8536b4Sopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright notice, this list 123d8536b4Sopenharmony_ci * of conditions and the following disclaimer in the documentation and/or other materials 133d8536b4Sopenharmony_ci * provided with the distribution. 143d8536b4Sopenharmony_ci * 153d8536b4Sopenharmony_ci * 3. Neither the name of the copyright holder nor the names of its contributors may be used 163d8536b4Sopenharmony_ci * to endorse or promote products derived from this software without specific prior written 173d8536b4Sopenharmony_ci * permission. 183d8536b4Sopenharmony_ci * 193d8536b4Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 203d8536b4Sopenharmony_ci * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 213d8536b4Sopenharmony_ci * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 223d8536b4Sopenharmony_ci * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 233d8536b4Sopenharmony_ci * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 243d8536b4Sopenharmony_ci * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 253d8536b4Sopenharmony_ci * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 263d8536b4Sopenharmony_ci * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 273d8536b4Sopenharmony_ci * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 283d8536b4Sopenharmony_ci * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 293d8536b4Sopenharmony_ci * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 303d8536b4Sopenharmony_ci */ 313d8536b4Sopenharmony_ci 323d8536b4Sopenharmony_ci#define _GNU_SOURCE 1 333d8536b4Sopenharmony_ci#include "lfs_adapter.h" 343d8536b4Sopenharmony_ci#include "los_config.h" 353d8536b4Sopenharmony_ci#include "vfs_files.h" 363d8536b4Sopenharmony_ci#include "vfs_operations.h" 373d8536b4Sopenharmony_ci#include "vfs_partition.h" 383d8536b4Sopenharmony_ci#include "vfs_maps.h" 393d8536b4Sopenharmony_ci#include "vfs_mount.h" 403d8536b4Sopenharmony_ci#include "securec.h" 413d8536b4Sopenharmony_ci#include "los_fs.h" 423d8536b4Sopenharmony_ci 433d8536b4Sopenharmony_cistatic struct PartitionCfg g_partitionCfg; 443d8536b4Sopenharmony_cistatic struct DeviceDesc *g_lfsDevice = NULL; 453d8536b4Sopenharmony_ci 463d8536b4Sopenharmony_cistatic uint32_t LfsGetStartAddr(int partition) 473d8536b4Sopenharmony_ci{ 483d8536b4Sopenharmony_ci if (g_lfsDevice == NULL) { 493d8536b4Sopenharmony_ci struct DeviceDesc *device = NULL; 503d8536b4Sopenharmony_ci for (device = getDeviceList(); device != NULL; device = device->dNext) { 513d8536b4Sopenharmony_ci if (strcmp(device->dFsType, "littlefs") == 0) { 523d8536b4Sopenharmony_ci g_lfsDevice = device; 533d8536b4Sopenharmony_ci break; 543d8536b4Sopenharmony_ci } 553d8536b4Sopenharmony_ci } 563d8536b4Sopenharmony_ci } 573d8536b4Sopenharmony_ci 583d8536b4Sopenharmony_ci if ((g_lfsDevice == NULL) || (partition >= g_lfsDevice->dPartNum)) { 593d8536b4Sopenharmony_ci return INVALID_DEVICE_ADDR; 603d8536b4Sopenharmony_ci } 613d8536b4Sopenharmony_ci 623d8536b4Sopenharmony_ci return (uint32_t)g_lfsDevice->dAddrArray[partition]; 633d8536b4Sopenharmony_ci} 643d8536b4Sopenharmony_ci 653d8536b4Sopenharmony_ciWEAK int littlefs_block_read(const struct lfs_config *c, lfs_block_t block, 663d8536b4Sopenharmony_ci lfs_off_t off, void *dst, lfs_size_t size) 673d8536b4Sopenharmony_ci{ 683d8536b4Sopenharmony_ci UINT32 addr = c->block_size * block + off; 693d8536b4Sopenharmony_ci UINT32 startaddr = LfsGetStartAddr((int)c->context); 703d8536b4Sopenharmony_ci if (startaddr == INVALID_DEVICE_ADDR) { 713d8536b4Sopenharmony_ci return -1; 723d8536b4Sopenharmony_ci } 733d8536b4Sopenharmony_ci addr += startaddr; 743d8536b4Sopenharmony_ci 753d8536b4Sopenharmony_ci return (g_partitionCfg.readFunc)((int)c->context, &addr, dst, size); 763d8536b4Sopenharmony_ci} 773d8536b4Sopenharmony_ci 783d8536b4Sopenharmony_ciWEAK int littlefs_block_write(const struct lfs_config *c, lfs_block_t block, 793d8536b4Sopenharmony_ci lfs_off_t off, const void *dst, lfs_size_t size) 803d8536b4Sopenharmony_ci{ 813d8536b4Sopenharmony_ci UINT32 addr = c->block_size * block + off; 823d8536b4Sopenharmony_ci UINT32 startaddr = LfsGetStartAddr((int)c->context); 833d8536b4Sopenharmony_ci if (startaddr == INVALID_DEVICE_ADDR) { 843d8536b4Sopenharmony_ci return -1; 853d8536b4Sopenharmony_ci } 863d8536b4Sopenharmony_ci 873d8536b4Sopenharmony_ci addr += startaddr; 883d8536b4Sopenharmony_ci 893d8536b4Sopenharmony_ci return (g_partitionCfg.writeFunc)((int)c->context, &addr, dst, size); 903d8536b4Sopenharmony_ci} 913d8536b4Sopenharmony_ci 923d8536b4Sopenharmony_ciWEAK int littlefs_block_erase(const struct lfs_config *c, lfs_block_t block) 933d8536b4Sopenharmony_ci{ 943d8536b4Sopenharmony_ci UINT32 addr = c->block_size * block; 953d8536b4Sopenharmony_ci UINT32 startaddr = LfsGetStartAddr((int)c->context); 963d8536b4Sopenharmony_ci if (startaddr == INVALID_DEVICE_ADDR) { 973d8536b4Sopenharmony_ci return -1; 983d8536b4Sopenharmony_ci } 993d8536b4Sopenharmony_ci 1003d8536b4Sopenharmony_ci addr += startaddr; 1013d8536b4Sopenharmony_ci 1023d8536b4Sopenharmony_ci return (g_partitionCfg.eraseFunc)((int)c->context, addr, c->block_size); 1033d8536b4Sopenharmony_ci} 1043d8536b4Sopenharmony_ci 1053d8536b4Sopenharmony_ciWEAK int littlefs_block_sync(const struct lfs_config *c) 1063d8536b4Sopenharmony_ci{ 1073d8536b4Sopenharmony_ci (void)c; 1083d8536b4Sopenharmony_ci return 0; 1093d8536b4Sopenharmony_ci} 1103d8536b4Sopenharmony_ci 1113d8536b4Sopenharmony_cistatic int ConvertFlagToLfsOpenFlag (int oflags) 1123d8536b4Sopenharmony_ci{ 1133d8536b4Sopenharmony_ci int lfsOpenFlag = 0; 1143d8536b4Sopenharmony_ci 1153d8536b4Sopenharmony_ci if (oflags & O_CREAT) { 1163d8536b4Sopenharmony_ci lfsOpenFlag |= LFS_O_CREAT; 1173d8536b4Sopenharmony_ci } 1183d8536b4Sopenharmony_ci 1193d8536b4Sopenharmony_ci if (oflags & O_EXCL) { 1203d8536b4Sopenharmony_ci lfsOpenFlag |= LFS_O_EXCL; 1213d8536b4Sopenharmony_ci } 1223d8536b4Sopenharmony_ci 1233d8536b4Sopenharmony_ci if (oflags & O_TRUNC) { 1243d8536b4Sopenharmony_ci lfsOpenFlag |= LFS_O_TRUNC; 1253d8536b4Sopenharmony_ci } 1263d8536b4Sopenharmony_ci 1273d8536b4Sopenharmony_ci if (oflags & O_APPEND) { 1283d8536b4Sopenharmony_ci lfsOpenFlag |= LFS_O_APPEND; 1293d8536b4Sopenharmony_ci } 1303d8536b4Sopenharmony_ci 1313d8536b4Sopenharmony_ci if (oflags & O_RDWR) { 1323d8536b4Sopenharmony_ci lfsOpenFlag |= LFS_O_RDWR; 1333d8536b4Sopenharmony_ci } 1343d8536b4Sopenharmony_ci 1353d8536b4Sopenharmony_ci if (oflags & O_WRONLY) { 1363d8536b4Sopenharmony_ci lfsOpenFlag |= LFS_O_WRONLY; 1373d8536b4Sopenharmony_ci } 1383d8536b4Sopenharmony_ci 1393d8536b4Sopenharmony_ci if (oflags == O_RDONLY) { 1403d8536b4Sopenharmony_ci lfsOpenFlag |= LFS_O_RDONLY; 1413d8536b4Sopenharmony_ci } 1423d8536b4Sopenharmony_ci 1433d8536b4Sopenharmony_ci return lfsOpenFlag; 1443d8536b4Sopenharmony_ci} 1453d8536b4Sopenharmony_ci 1463d8536b4Sopenharmony_cistatic int LittlefsErrno(int result) 1473d8536b4Sopenharmony_ci{ 1483d8536b4Sopenharmony_ci return (result < 0) ? -result : result; 1493d8536b4Sopenharmony_ci} 1503d8536b4Sopenharmony_ci 1513d8536b4Sopenharmony_civoid LfsConfigAdapter(struct PartitionCfg *pCfg, struct lfs_config *lfsCfg) 1523d8536b4Sopenharmony_ci{ 1533d8536b4Sopenharmony_ci lfsCfg->context = (void *)pCfg->partNo; 1543d8536b4Sopenharmony_ci 1553d8536b4Sopenharmony_ci lfsCfg->read_size = pCfg->readSize; 1563d8536b4Sopenharmony_ci lfsCfg->prog_size = pCfg->writeSize; 1573d8536b4Sopenharmony_ci lfsCfg->cache_size = pCfg->cacheSize; 1583d8536b4Sopenharmony_ci lfsCfg->block_cycles = pCfg->blockCycles; 1593d8536b4Sopenharmony_ci lfsCfg->lookahead_size = pCfg->lookaheadSize; 1603d8536b4Sopenharmony_ci lfsCfg->block_size = pCfg->blockSize; 1613d8536b4Sopenharmony_ci lfsCfg->block_count = pCfg->blockCount; 1623d8536b4Sopenharmony_ci 1633d8536b4Sopenharmony_ci lfsCfg->read = littlefs_block_read; 1643d8536b4Sopenharmony_ci lfsCfg->prog = littlefs_block_write; 1653d8536b4Sopenharmony_ci lfsCfg->erase = littlefs_block_erase; 1663d8536b4Sopenharmony_ci lfsCfg->sync = littlefs_block_sync; 1673d8536b4Sopenharmony_ci 1683d8536b4Sopenharmony_ci g_partitionCfg.readFunc = pCfg->readFunc; 1693d8536b4Sopenharmony_ci g_partitionCfg.writeFunc = pCfg->writeFunc; 1703d8536b4Sopenharmony_ci g_partitionCfg.eraseFunc = pCfg->eraseFunc; 1713d8536b4Sopenharmony_ci} 1723d8536b4Sopenharmony_ci 1733d8536b4Sopenharmony_ciint LfsMount(struct MountPoint *mp, unsigned long mountflags, const void *data) 1743d8536b4Sopenharmony_ci{ 1753d8536b4Sopenharmony_ci int ret; 1763d8536b4Sopenharmony_ci lfs_t *mountHdl = NULL; 1773d8536b4Sopenharmony_ci struct lfs_config *cfg = NULL; 1783d8536b4Sopenharmony_ci 1793d8536b4Sopenharmony_ci if ((mp == NULL) || (mp->mPath == NULL) || (data == NULL)) { 1803d8536b4Sopenharmony_ci errno = EFAULT; 1813d8536b4Sopenharmony_ci ret = (int)LOS_NOK; 1823d8536b4Sopenharmony_ci goto errout; 1833d8536b4Sopenharmony_ci } 1843d8536b4Sopenharmony_ci 1853d8536b4Sopenharmony_ci if (mountflags & MS_REMOUNT) { 1863d8536b4Sopenharmony_ci errno = ENOSYS; 1873d8536b4Sopenharmony_ci ret = (int)LOS_NOK; 1883d8536b4Sopenharmony_ci goto errout; 1893d8536b4Sopenharmony_ci } 1903d8536b4Sopenharmony_ci 1913d8536b4Sopenharmony_ci mountHdl = (lfs_t *)LOSCFG_FS_MALLOC_HOOK(sizeof(lfs_t) + sizeof(struct lfs_config)); 1923d8536b4Sopenharmony_ci if (mountHdl == NULL) { 1933d8536b4Sopenharmony_ci errno = ENODEV; 1943d8536b4Sopenharmony_ci ret = (int)LOS_NOK; 1953d8536b4Sopenharmony_ci goto errout; 1963d8536b4Sopenharmony_ci } 1973d8536b4Sopenharmony_ci (void)memset_s(mountHdl, sizeof(lfs_t) + sizeof(struct lfs_config), 0, sizeof(lfs_t) + sizeof(struct lfs_config)); 1983d8536b4Sopenharmony_ci mp->mData = (void *)mountHdl; 1993d8536b4Sopenharmony_ci cfg = (void *)((UINTPTR)mountHdl + sizeof(lfs_t)); 2003d8536b4Sopenharmony_ci 2013d8536b4Sopenharmony_ci LfsConfigAdapter((struct PartitionCfg *)data, cfg); 2023d8536b4Sopenharmony_ci 2033d8536b4Sopenharmony_ci ret = lfs_mount((lfs_t *)mp->mData, cfg); 2043d8536b4Sopenharmony_ci if (ret != 0) { 2053d8536b4Sopenharmony_ci ret = lfs_format((lfs_t *)mp->mData, cfg); 2063d8536b4Sopenharmony_ci if (ret == 0) { 2073d8536b4Sopenharmony_ci ret = lfs_mount((lfs_t *)mp->mData, cfg); 2083d8536b4Sopenharmony_ci } 2093d8536b4Sopenharmony_ci } 2103d8536b4Sopenharmony_ci if (ret != 0) { 2113d8536b4Sopenharmony_ci LOSCFG_FS_FREE_HOOK(mountHdl); 2123d8536b4Sopenharmony_ci errno = LittlefsErrno(ret); 2133d8536b4Sopenharmony_ci ret = (int)LOS_NOK; 2143d8536b4Sopenharmony_ci } 2153d8536b4Sopenharmony_ci 2163d8536b4Sopenharmony_cierrout: 2173d8536b4Sopenharmony_ci return ret; 2183d8536b4Sopenharmony_ci} 2193d8536b4Sopenharmony_ci 2203d8536b4Sopenharmony_ciint LfsUmount(struct MountPoint *mp) 2213d8536b4Sopenharmony_ci{ 2223d8536b4Sopenharmony_ci int ret; 2233d8536b4Sopenharmony_ci 2243d8536b4Sopenharmony_ci if (mp == NULL) { 2253d8536b4Sopenharmony_ci errno = EFAULT; 2263d8536b4Sopenharmony_ci return (int)LOS_NOK; 2273d8536b4Sopenharmony_ci } 2283d8536b4Sopenharmony_ci 2293d8536b4Sopenharmony_ci if (mp->mData == NULL) { 2303d8536b4Sopenharmony_ci errno = ENOENT; 2313d8536b4Sopenharmony_ci return (int)LOS_NOK; 2323d8536b4Sopenharmony_ci } 2333d8536b4Sopenharmony_ci 2343d8536b4Sopenharmony_ci ret = lfs_unmount((lfs_t *)mp->mData); 2353d8536b4Sopenharmony_ci if (ret != 0) { 2363d8536b4Sopenharmony_ci errno = LittlefsErrno(ret); 2373d8536b4Sopenharmony_ci ret = (int)LOS_NOK; 2383d8536b4Sopenharmony_ci } 2393d8536b4Sopenharmony_ci 2403d8536b4Sopenharmony_ci LOSCFG_FS_FREE_HOOK(mp->mData); 2413d8536b4Sopenharmony_ci mp->mData = NULL; 2423d8536b4Sopenharmony_ci return ret; 2433d8536b4Sopenharmony_ci} 2443d8536b4Sopenharmony_ci 2453d8536b4Sopenharmony_ciint LfsUnlink(struct MountPoint *mp, const char *fileName) 2463d8536b4Sopenharmony_ci{ 2473d8536b4Sopenharmony_ci int ret; 2483d8536b4Sopenharmony_ci 2493d8536b4Sopenharmony_ci if ((mp == NULL) || (fileName == NULL)) { 2503d8536b4Sopenharmony_ci errno = EFAULT; 2513d8536b4Sopenharmony_ci return (int)LOS_NOK; 2523d8536b4Sopenharmony_ci } 2533d8536b4Sopenharmony_ci 2543d8536b4Sopenharmony_ci if (mp->mData == NULL) { 2553d8536b4Sopenharmony_ci errno = ENOENT; 2563d8536b4Sopenharmony_ci return (int)LOS_NOK; 2573d8536b4Sopenharmony_ci } 2583d8536b4Sopenharmony_ci 2593d8536b4Sopenharmony_ci ret = lfs_remove((lfs_t *)mp->mData, fileName); 2603d8536b4Sopenharmony_ci if (ret != 0) { 2613d8536b4Sopenharmony_ci errno = LittlefsErrno(ret); 2623d8536b4Sopenharmony_ci ret = (int)LOS_NOK; 2633d8536b4Sopenharmony_ci } 2643d8536b4Sopenharmony_ci 2653d8536b4Sopenharmony_ci return ret; 2663d8536b4Sopenharmony_ci} 2673d8536b4Sopenharmony_ci 2683d8536b4Sopenharmony_ciint LfsMkdir(struct MountPoint *mp, const char *dirName) 2693d8536b4Sopenharmony_ci{ 2703d8536b4Sopenharmony_ci int ret; 2713d8536b4Sopenharmony_ci 2723d8536b4Sopenharmony_ci if ((dirName == NULL) || (mp == NULL)) { 2733d8536b4Sopenharmony_ci errno = EFAULT; 2743d8536b4Sopenharmony_ci return (int)LOS_NOK; 2753d8536b4Sopenharmony_ci } 2763d8536b4Sopenharmony_ci 2773d8536b4Sopenharmony_ci if (mp->mData == NULL) { 2783d8536b4Sopenharmony_ci errno = ENOENT; 2793d8536b4Sopenharmony_ci return (int)LOS_NOK; 2803d8536b4Sopenharmony_ci } 2813d8536b4Sopenharmony_ci 2823d8536b4Sopenharmony_ci lfs_t *lfs = (lfs_t *)mp->mData; 2833d8536b4Sopenharmony_ci 2843d8536b4Sopenharmony_ci ret = lfs_mkdir(lfs, dirName); 2853d8536b4Sopenharmony_ci if (ret != 0) { 2863d8536b4Sopenharmony_ci errno = LittlefsErrno(ret); 2873d8536b4Sopenharmony_ci ret = (int)LOS_NOK; 2883d8536b4Sopenharmony_ci } 2893d8536b4Sopenharmony_ci 2903d8536b4Sopenharmony_ci return ret; 2913d8536b4Sopenharmony_ci} 2923d8536b4Sopenharmony_ci 2933d8536b4Sopenharmony_ciint LfsRmdir(struct MountPoint *mp, const char *dirName) 2943d8536b4Sopenharmony_ci{ 2953d8536b4Sopenharmony_ci int ret; 2963d8536b4Sopenharmony_ci lfs_t *lfs = NULL; 2973d8536b4Sopenharmony_ci 2983d8536b4Sopenharmony_ci if (mp == NULL) { 2993d8536b4Sopenharmony_ci errno = EFAULT; 3003d8536b4Sopenharmony_ci return (int)LOS_NOK; 3013d8536b4Sopenharmony_ci } 3023d8536b4Sopenharmony_ci 3033d8536b4Sopenharmony_ci if (mp->mData == NULL) { 3043d8536b4Sopenharmony_ci errno = ENOENT; 3053d8536b4Sopenharmony_ci return (int)LOS_NOK; 3063d8536b4Sopenharmony_ci } 3073d8536b4Sopenharmony_ci 3083d8536b4Sopenharmony_ci lfs = (lfs_t *)mp->mData; 3093d8536b4Sopenharmony_ci 3103d8536b4Sopenharmony_ci if (dirName == NULL) { 3113d8536b4Sopenharmony_ci errno = EFAULT; 3123d8536b4Sopenharmony_ci return (int)LOS_NOK; 3133d8536b4Sopenharmony_ci } 3143d8536b4Sopenharmony_ci 3153d8536b4Sopenharmony_ci ret = lfs_remove(lfs, dirName); 3163d8536b4Sopenharmony_ci if (ret != 0) { 3173d8536b4Sopenharmony_ci errno = LittlefsErrno(ret); 3183d8536b4Sopenharmony_ci ret = (int)LOS_NOK; 3193d8536b4Sopenharmony_ci } 3203d8536b4Sopenharmony_ci 3213d8536b4Sopenharmony_ci return ret; 3223d8536b4Sopenharmony_ci} 3233d8536b4Sopenharmony_ci 3243d8536b4Sopenharmony_ciint LfsOpendir(struct Dir *dir, const char *dirName) 3253d8536b4Sopenharmony_ci{ 3263d8536b4Sopenharmony_ci int ret; 3273d8536b4Sopenharmony_ci 3283d8536b4Sopenharmony_ci if ((dir == NULL) || (dir->dMp == NULL) || (dir->dMp->mData == NULL)) { 3293d8536b4Sopenharmony_ci errno = EFAULT; 3303d8536b4Sopenharmony_ci return (int)LOS_NOK; 3313d8536b4Sopenharmony_ci } 3323d8536b4Sopenharmony_ci 3333d8536b4Sopenharmony_ci lfs_t *lfs = (lfs_t *)dir->dMp->mData; 3343d8536b4Sopenharmony_ci lfs_dir_t *dirInfo = (lfs_dir_t *)LOSCFG_FS_MALLOC_HOOK(sizeof(lfs_dir_t)); 3353d8536b4Sopenharmony_ci if (dirInfo == NULL) { 3363d8536b4Sopenharmony_ci errno = ENOMEM; 3373d8536b4Sopenharmony_ci return (int)LOS_NOK; 3383d8536b4Sopenharmony_ci } 3393d8536b4Sopenharmony_ci 3403d8536b4Sopenharmony_ci (void)memset_s(dirInfo, sizeof(lfs_dir_t), 0, sizeof(lfs_dir_t)); 3413d8536b4Sopenharmony_ci ret = lfs_dir_open(lfs, dirInfo, dirName); 3423d8536b4Sopenharmony_ci if (ret != 0) { 3433d8536b4Sopenharmony_ci LOSCFG_FS_FREE_HOOK(dirInfo); 3443d8536b4Sopenharmony_ci errno = LittlefsErrno(ret); 3453d8536b4Sopenharmony_ci goto errout; 3463d8536b4Sopenharmony_ci } 3473d8536b4Sopenharmony_ci 3483d8536b4Sopenharmony_ci dir->dData = dirInfo; 3493d8536b4Sopenharmony_ci dir->dOffset = 0; 3503d8536b4Sopenharmony_ci 3513d8536b4Sopenharmony_ci return LOS_OK; 3523d8536b4Sopenharmony_ci 3533d8536b4Sopenharmony_cierrout: 3543d8536b4Sopenharmony_ci return (int)LOS_NOK; 3553d8536b4Sopenharmony_ci} 3563d8536b4Sopenharmony_ci 3573d8536b4Sopenharmony_ciint LfsReaddir(struct Dir *dir, struct dirent *dent) 3583d8536b4Sopenharmony_ci{ 3593d8536b4Sopenharmony_ci int ret; 3603d8536b4Sopenharmony_ci struct lfs_info lfsInfo; 3613d8536b4Sopenharmony_ci 3623d8536b4Sopenharmony_ci if ((dir == NULL) || (dir->dMp == NULL) || (dir->dMp->mData == NULL) || 3633d8536b4Sopenharmony_ci (dent == NULL)) { 3643d8536b4Sopenharmony_ci errno = EFAULT; 3653d8536b4Sopenharmony_ci return (int)LOS_NOK; 3663d8536b4Sopenharmony_ci } 3673d8536b4Sopenharmony_ci 3683d8536b4Sopenharmony_ci if (dir->dData == NULL) { 3693d8536b4Sopenharmony_ci errno = EBADF; 3703d8536b4Sopenharmony_ci return (int)LOS_NOK; 3713d8536b4Sopenharmony_ci } 3723d8536b4Sopenharmony_ci 3733d8536b4Sopenharmony_ci lfs_t *lfs = (lfs_t *)dir->dMp->mData; 3743d8536b4Sopenharmony_ci lfs_dir_t *dirInfo = (lfs_dir_t *)dir->dData; 3753d8536b4Sopenharmony_ci 3763d8536b4Sopenharmony_ci ret = lfs_dir_read(lfs, dirInfo, &lfsInfo); 3773d8536b4Sopenharmony_ci if (ret == TRUE) { 3783d8536b4Sopenharmony_ci (void)strncpy_s(dent->d_name, sizeof(dent->d_name), lfsInfo.name, strlen(lfsInfo.name) + 1); 3793d8536b4Sopenharmony_ci if (lfsInfo.type == LFS_TYPE_DIR) { 3803d8536b4Sopenharmony_ci dent->d_type = DT_DIR; 3813d8536b4Sopenharmony_ci } else if (lfsInfo.type == LFS_TYPE_REG) { 3823d8536b4Sopenharmony_ci dent->d_type = DT_REG; 3833d8536b4Sopenharmony_ci } 3843d8536b4Sopenharmony_ci 3853d8536b4Sopenharmony_ci dent->d_reclen = lfsInfo.size; 3863d8536b4Sopenharmony_ci 3873d8536b4Sopenharmony_ci return LOS_OK; 3883d8536b4Sopenharmony_ci } 3893d8536b4Sopenharmony_ci 3903d8536b4Sopenharmony_ci if (ret != 0) { 3913d8536b4Sopenharmony_ci errno = LittlefsErrno(ret); 3923d8536b4Sopenharmony_ci } 3933d8536b4Sopenharmony_ci 3943d8536b4Sopenharmony_ci return (int)LOS_NOK; 3953d8536b4Sopenharmony_ci} 3963d8536b4Sopenharmony_ci 3973d8536b4Sopenharmony_ciint LfsClosedir(struct Dir *dir) 3983d8536b4Sopenharmony_ci{ 3993d8536b4Sopenharmony_ci int ret; 4003d8536b4Sopenharmony_ci 4013d8536b4Sopenharmony_ci if ((dir == NULL) || (dir->dMp == NULL) || (dir->dMp->mData == NULL)) { 4023d8536b4Sopenharmony_ci errno = EFAULT; 4033d8536b4Sopenharmony_ci return (int)LOS_NOK; 4043d8536b4Sopenharmony_ci } 4053d8536b4Sopenharmony_ci 4063d8536b4Sopenharmony_ci if (dir->dData == NULL) { 4073d8536b4Sopenharmony_ci errno = EBADF; 4083d8536b4Sopenharmony_ci return (int)LOS_NOK; 4093d8536b4Sopenharmony_ci } 4103d8536b4Sopenharmony_ci 4113d8536b4Sopenharmony_ci lfs_t *lfs = (lfs_t *)dir->dMp->mData; 4123d8536b4Sopenharmony_ci lfs_dir_t *dirInfo = (lfs_dir_t *)dir->dData; 4133d8536b4Sopenharmony_ci 4143d8536b4Sopenharmony_ci ret = lfs_dir_close(lfs, dirInfo); 4153d8536b4Sopenharmony_ci if (ret != 0) { 4163d8536b4Sopenharmony_ci errno = LittlefsErrno(ret); 4173d8536b4Sopenharmony_ci ret = (int)LOS_NOK; 4183d8536b4Sopenharmony_ci } 4193d8536b4Sopenharmony_ci 4203d8536b4Sopenharmony_ci LOSCFG_FS_FREE_HOOK(dirInfo); 4213d8536b4Sopenharmony_ci dir->dData = NULL; 4223d8536b4Sopenharmony_ci 4233d8536b4Sopenharmony_ci return ret; 4243d8536b4Sopenharmony_ci} 4253d8536b4Sopenharmony_ci 4263d8536b4Sopenharmony_ciint LfsOpen(struct File *file, const char *pathName, int openFlag) 4273d8536b4Sopenharmony_ci{ 4283d8536b4Sopenharmony_ci int ret; 4293d8536b4Sopenharmony_ci lfs_file_t *lfsHandle = NULL; 4303d8536b4Sopenharmony_ci 4313d8536b4Sopenharmony_ci if ((pathName == NULL) || (file == NULL) || (file->fMp == NULL) || 4323d8536b4Sopenharmony_ci (file->fMp->mData == NULL)) { 4333d8536b4Sopenharmony_ci errno = EFAULT; 4343d8536b4Sopenharmony_ci return (int)LOS_NOK; 4353d8536b4Sopenharmony_ci } 4363d8536b4Sopenharmony_ci 4373d8536b4Sopenharmony_ci lfsHandle = (lfs_file_t *)LOSCFG_FS_MALLOC_HOOK(sizeof(lfs_file_t)); 4383d8536b4Sopenharmony_ci if (lfsHandle == NULL) { 4393d8536b4Sopenharmony_ci errno = ENOMEM; 4403d8536b4Sopenharmony_ci return (int)LOS_NOK; 4413d8536b4Sopenharmony_ci } 4423d8536b4Sopenharmony_ci 4433d8536b4Sopenharmony_ci int lfsOpenFlag = ConvertFlagToLfsOpenFlag(openFlag); 4443d8536b4Sopenharmony_ci ret = lfs_file_open((lfs_t *)file->fMp->mData, lfsHandle, pathName, lfsOpenFlag); 4453d8536b4Sopenharmony_ci if (ret != 0) { 4463d8536b4Sopenharmony_ci LOSCFG_FS_FREE_HOOK(lfsHandle); 4473d8536b4Sopenharmony_ci errno = LittlefsErrno(ret); 4483d8536b4Sopenharmony_ci goto errout; 4493d8536b4Sopenharmony_ci } 4503d8536b4Sopenharmony_ci 4513d8536b4Sopenharmony_ci file->fData = (void *)lfsHandle; 4523d8536b4Sopenharmony_ci return ret; 4533d8536b4Sopenharmony_ci 4543d8536b4Sopenharmony_cierrout: 4553d8536b4Sopenharmony_ci return INVALID_FD; 4563d8536b4Sopenharmony_ci} 4573d8536b4Sopenharmony_ci 4583d8536b4Sopenharmony_ciint LfsRead(struct File *file, char *buf, size_t len) 4593d8536b4Sopenharmony_ci{ 4603d8536b4Sopenharmony_ci int ret; 4613d8536b4Sopenharmony_ci struct MountPoint *mp = NULL; 4623d8536b4Sopenharmony_ci lfs_file_t *lfsHandle = NULL; 4633d8536b4Sopenharmony_ci 4643d8536b4Sopenharmony_ci if (buf == NULL) { 4653d8536b4Sopenharmony_ci errno = EFAULT; 4663d8536b4Sopenharmony_ci return (int)LOS_NOK; 4673d8536b4Sopenharmony_ci } 4683d8536b4Sopenharmony_ci 4693d8536b4Sopenharmony_ci if ((file == NULL) || (file->fData == NULL)) { 4703d8536b4Sopenharmony_ci errno = EBADF; 4713d8536b4Sopenharmony_ci return (int)LOS_NOK; 4723d8536b4Sopenharmony_ci } 4733d8536b4Sopenharmony_ci 4743d8536b4Sopenharmony_ci lfsHandle = (lfs_file_t *)file->fData; 4753d8536b4Sopenharmony_ci mp = file->fMp; 4763d8536b4Sopenharmony_ci if ((mp == NULL) || (mp->mData == NULL)) { 4773d8536b4Sopenharmony_ci errno = EFAULT; 4783d8536b4Sopenharmony_ci return (int)LOS_NOK; 4793d8536b4Sopenharmony_ci } 4803d8536b4Sopenharmony_ci 4813d8536b4Sopenharmony_ci ret = lfs_file_read((lfs_t *)mp->mData, lfsHandle, buf, len); 4823d8536b4Sopenharmony_ci if (ret < 0) { 4833d8536b4Sopenharmony_ci errno = LittlefsErrno(ret); 4843d8536b4Sopenharmony_ci ret = (int)LOS_NOK; 4853d8536b4Sopenharmony_ci } 4863d8536b4Sopenharmony_ci return ret; 4873d8536b4Sopenharmony_ci} 4883d8536b4Sopenharmony_ci 4893d8536b4Sopenharmony_ciint LfsWrite(struct File *file, const char *buf, size_t len) 4903d8536b4Sopenharmony_ci{ 4913d8536b4Sopenharmony_ci int ret; 4923d8536b4Sopenharmony_ci struct MountPoint *mp = NULL; 4933d8536b4Sopenharmony_ci lfs_file_t *lfsHandle = NULL; 4943d8536b4Sopenharmony_ci 4953d8536b4Sopenharmony_ci if (buf == NULL) { 4963d8536b4Sopenharmony_ci errno = EFAULT; 4973d8536b4Sopenharmony_ci return (int)LOS_NOK; 4983d8536b4Sopenharmony_ci } 4993d8536b4Sopenharmony_ci 5003d8536b4Sopenharmony_ci if ((file == NULL) || (file->fData == NULL)) { 5013d8536b4Sopenharmony_ci errno = EBADF; 5023d8536b4Sopenharmony_ci return (int)LOS_NOK; 5033d8536b4Sopenharmony_ci } 5043d8536b4Sopenharmony_ci 5053d8536b4Sopenharmony_ci lfsHandle = (lfs_file_t *)file->fData; 5063d8536b4Sopenharmony_ci mp = file->fMp; 5073d8536b4Sopenharmony_ci if ((mp == NULL) || (mp->mData == NULL)) { 5083d8536b4Sopenharmony_ci errno = EFAULT; 5093d8536b4Sopenharmony_ci return (int)LOS_NOK; 5103d8536b4Sopenharmony_ci } 5113d8536b4Sopenharmony_ci 5123d8536b4Sopenharmony_ci ret = lfs_file_write((lfs_t *)mp->mData, lfsHandle, buf, len); 5133d8536b4Sopenharmony_ci if (ret < 0) { 5143d8536b4Sopenharmony_ci errno = LittlefsErrno(ret); 5153d8536b4Sopenharmony_ci ret = (int)LOS_NOK; 5163d8536b4Sopenharmony_ci } 5173d8536b4Sopenharmony_ci return ret; 5183d8536b4Sopenharmony_ci} 5193d8536b4Sopenharmony_ci 5203d8536b4Sopenharmony_cioff_t LfsSeek(struct File *file, off_t offset, int whence) 5213d8536b4Sopenharmony_ci{ 5223d8536b4Sopenharmony_ci off_t ret; 5233d8536b4Sopenharmony_ci struct MountPoint *mp = NULL; 5243d8536b4Sopenharmony_ci lfs_file_t *lfsHandle = NULL; 5253d8536b4Sopenharmony_ci 5263d8536b4Sopenharmony_ci if ((file == NULL) || (file->fData == NULL)) { 5273d8536b4Sopenharmony_ci errno = EBADF; 5283d8536b4Sopenharmony_ci return (off_t)LOS_NOK; 5293d8536b4Sopenharmony_ci } 5303d8536b4Sopenharmony_ci 5313d8536b4Sopenharmony_ci lfsHandle = (lfs_file_t *)file->fData; 5323d8536b4Sopenharmony_ci mp = file->fMp; 5333d8536b4Sopenharmony_ci if ((mp == NULL) || (mp->mData == NULL)) { 5343d8536b4Sopenharmony_ci errno = EFAULT; 5353d8536b4Sopenharmony_ci return (off_t)LOS_NOK; 5363d8536b4Sopenharmony_ci } 5373d8536b4Sopenharmony_ci 5383d8536b4Sopenharmony_ci ret = (off_t)lfs_file_seek((lfs_t *)mp->mData, lfsHandle, offset, whence); 5393d8536b4Sopenharmony_ci if (ret < 0) { 5403d8536b4Sopenharmony_ci errno = LittlefsErrno(ret); 5413d8536b4Sopenharmony_ci ret = (off_t)LOS_NOK; 5423d8536b4Sopenharmony_ci } 5433d8536b4Sopenharmony_ci 5443d8536b4Sopenharmony_ci return ret; 5453d8536b4Sopenharmony_ci} 5463d8536b4Sopenharmony_ci 5473d8536b4Sopenharmony_ciint LfsClose(struct File *file) 5483d8536b4Sopenharmony_ci{ 5493d8536b4Sopenharmony_ci int ret; 5503d8536b4Sopenharmony_ci struct MountPoint *mp = NULL; 5513d8536b4Sopenharmony_ci lfs_file_t *lfsHandle = NULL; 5523d8536b4Sopenharmony_ci 5533d8536b4Sopenharmony_ci if ((file == NULL) || (file->fData == NULL)) { 5543d8536b4Sopenharmony_ci errno = EBADF; 5553d8536b4Sopenharmony_ci return (int)LOS_NOK; 5563d8536b4Sopenharmony_ci } 5573d8536b4Sopenharmony_ci 5583d8536b4Sopenharmony_ci lfsHandle = (lfs_file_t *)file->fData; 5593d8536b4Sopenharmony_ci mp = file->fMp; 5603d8536b4Sopenharmony_ci if ((mp == NULL) || (mp->mData == NULL)) { 5613d8536b4Sopenharmony_ci errno = EFAULT; 5623d8536b4Sopenharmony_ci return (int)LOS_NOK; 5633d8536b4Sopenharmony_ci } 5643d8536b4Sopenharmony_ci 5653d8536b4Sopenharmony_ci ret = lfs_file_close((lfs_t *)mp->mData, lfsHandle); 5663d8536b4Sopenharmony_ci if (ret != 0) { 5673d8536b4Sopenharmony_ci errno = LittlefsErrno(ret); 5683d8536b4Sopenharmony_ci ret = (int)LOS_NOK; 5693d8536b4Sopenharmony_ci } 5703d8536b4Sopenharmony_ci 5713d8536b4Sopenharmony_ci LOSCFG_FS_FREE_HOOK(file->fData); 5723d8536b4Sopenharmony_ci file->fData = NULL; 5733d8536b4Sopenharmony_ci return ret; 5743d8536b4Sopenharmony_ci} 5753d8536b4Sopenharmony_ci 5763d8536b4Sopenharmony_ciint LfsRename(struct MountPoint *mp, const char *oldName, const char *newName) 5773d8536b4Sopenharmony_ci{ 5783d8536b4Sopenharmony_ci int ret; 5793d8536b4Sopenharmony_ci 5803d8536b4Sopenharmony_ci if ((mp == NULL) || (oldName == NULL) || (newName == NULL)) { 5813d8536b4Sopenharmony_ci errno = EFAULT; 5823d8536b4Sopenharmony_ci return (int)LOS_NOK; 5833d8536b4Sopenharmony_ci } 5843d8536b4Sopenharmony_ci 5853d8536b4Sopenharmony_ci if (mp->mData == NULL) { 5863d8536b4Sopenharmony_ci errno = ENOENT; 5873d8536b4Sopenharmony_ci return (int)LOS_NOK; 5883d8536b4Sopenharmony_ci } 5893d8536b4Sopenharmony_ci 5903d8536b4Sopenharmony_ci ret = lfs_rename((lfs_t *)mp->mData, oldName, newName); 5913d8536b4Sopenharmony_ci if (ret != 0) { 5923d8536b4Sopenharmony_ci errno = LittlefsErrno(ret); 5933d8536b4Sopenharmony_ci ret = (int)LOS_NOK; 5943d8536b4Sopenharmony_ci } 5953d8536b4Sopenharmony_ci 5963d8536b4Sopenharmony_ci return ret; 5973d8536b4Sopenharmony_ci} 5983d8536b4Sopenharmony_ci 5993d8536b4Sopenharmony_ciint LfsStat(struct MountPoint *mp, const char *path, struct stat *buf) 6003d8536b4Sopenharmony_ci{ 6013d8536b4Sopenharmony_ci int ret; 6023d8536b4Sopenharmony_ci struct lfs_info info; 6033d8536b4Sopenharmony_ci 6043d8536b4Sopenharmony_ci if ((mp == NULL) || (path == NULL) || (buf == NULL)) { 6053d8536b4Sopenharmony_ci errno = EFAULT; 6063d8536b4Sopenharmony_ci return (int)LOS_NOK; 6073d8536b4Sopenharmony_ci } 6083d8536b4Sopenharmony_ci 6093d8536b4Sopenharmony_ci if (mp->mData == NULL) { 6103d8536b4Sopenharmony_ci errno = ENOENT; 6113d8536b4Sopenharmony_ci return (int)LOS_NOK; 6123d8536b4Sopenharmony_ci } 6133d8536b4Sopenharmony_ci 6143d8536b4Sopenharmony_ci ret = lfs_stat((lfs_t *)mp->mData, path, &info); 6153d8536b4Sopenharmony_ci if (ret == 0) { 6163d8536b4Sopenharmony_ci buf->st_size = info.size; 6173d8536b4Sopenharmony_ci if (info.type == LFS_TYPE_REG) { 6183d8536b4Sopenharmony_ci buf->st_mode = S_IFREG; 6193d8536b4Sopenharmony_ci } else { 6203d8536b4Sopenharmony_ci buf->st_mode = S_IFDIR; 6213d8536b4Sopenharmony_ci } 6223d8536b4Sopenharmony_ci } else { 6233d8536b4Sopenharmony_ci errno = LittlefsErrno(ret); 6243d8536b4Sopenharmony_ci ret = (int)LOS_NOK; 6253d8536b4Sopenharmony_ci } 6263d8536b4Sopenharmony_ci 6273d8536b4Sopenharmony_ci return ret; 6283d8536b4Sopenharmony_ci} 6293d8536b4Sopenharmony_ci 6303d8536b4Sopenharmony_ciint LfsSync(struct File *file) 6313d8536b4Sopenharmony_ci{ 6323d8536b4Sopenharmony_ci int ret; 6333d8536b4Sopenharmony_ci struct MountPoint *mp = NULL; 6343d8536b4Sopenharmony_ci 6353d8536b4Sopenharmony_ci if ((file == NULL) || (file->fData == NULL)) { 6363d8536b4Sopenharmony_ci errno = EBADF; 6373d8536b4Sopenharmony_ci return (int)LOS_NOK; 6383d8536b4Sopenharmony_ci } 6393d8536b4Sopenharmony_ci 6403d8536b4Sopenharmony_ci if ((file->fMp == NULL) || (file->fMp->mData == NULL)) { 6413d8536b4Sopenharmony_ci errno = EFAULT; 6423d8536b4Sopenharmony_ci return (int)LOS_NOK; 6433d8536b4Sopenharmony_ci } 6443d8536b4Sopenharmony_ci 6453d8536b4Sopenharmony_ci mp = file->fMp; 6463d8536b4Sopenharmony_ci ret = lfs_file_sync((lfs_t *)mp->mData, (lfs_file_t *)file->fData); 6473d8536b4Sopenharmony_ci if (ret != 0) { 6483d8536b4Sopenharmony_ci errno = LittlefsErrno(ret); 6493d8536b4Sopenharmony_ci ret = (int)LOS_NOK; 6503d8536b4Sopenharmony_ci } 6513d8536b4Sopenharmony_ci return ret; 6523d8536b4Sopenharmony_ci} 6533d8536b4Sopenharmony_ci 6543d8536b4Sopenharmony_ciint LfsFormat(const char *partName, void *privData) 6553d8536b4Sopenharmony_ci{ 6563d8536b4Sopenharmony_ci int ret; 6573d8536b4Sopenharmony_ci lfs_t lfs = {0}; 6583d8536b4Sopenharmony_ci struct lfs_config cfg = {0}; 6593d8536b4Sopenharmony_ci 6603d8536b4Sopenharmony_ci (void)partName; 6613d8536b4Sopenharmony_ci 6623d8536b4Sopenharmony_ci LfsConfigAdapter((struct PartitionCfg *)privData, &cfg); 6633d8536b4Sopenharmony_ci 6643d8536b4Sopenharmony_ci ret = lfs_format(&lfs, &cfg); 6653d8536b4Sopenharmony_ci if (ret != 0) { 6663d8536b4Sopenharmony_ci errno = LittlefsErrno(ret); 6673d8536b4Sopenharmony_ci ret = (int)LOS_NOK; 6683d8536b4Sopenharmony_ci } 6693d8536b4Sopenharmony_ci return ret; 6703d8536b4Sopenharmony_ci} 6713d8536b4Sopenharmony_ci 6723d8536b4Sopenharmony_cistatic struct MountOps g_lfsMnt = { 6733d8536b4Sopenharmony_ci .mount = LfsMount, 6743d8536b4Sopenharmony_ci .umount = LfsUmount, 6753d8536b4Sopenharmony_ci .umount2 = NULL, 6763d8536b4Sopenharmony_ci .statfs = NULL, 6773d8536b4Sopenharmony_ci}; 6783d8536b4Sopenharmony_ci 6793d8536b4Sopenharmony_cistatic struct FileOps g_lfsFops = { 6803d8536b4Sopenharmony_ci .open = LfsOpen, 6813d8536b4Sopenharmony_ci .close = LfsClose, 6823d8536b4Sopenharmony_ci .read = LfsRead, 6833d8536b4Sopenharmony_ci .write = LfsWrite, 6843d8536b4Sopenharmony_ci .lseek = LfsSeek, 6853d8536b4Sopenharmony_ci .stat = LfsStat, 6863d8536b4Sopenharmony_ci .truncate = NULL, 6873d8536b4Sopenharmony_ci .unlink = LfsUnlink, 6883d8536b4Sopenharmony_ci .rename = LfsRename, 6893d8536b4Sopenharmony_ci .ioctl = NULL, /* not support */ 6903d8536b4Sopenharmony_ci .sync = LfsSync, 6913d8536b4Sopenharmony_ci .rmdir = LfsRmdir, 6923d8536b4Sopenharmony_ci .opendir = LfsOpendir, 6933d8536b4Sopenharmony_ci .readdir = LfsReaddir, 6943d8536b4Sopenharmony_ci .closedir = LfsClosedir, 6953d8536b4Sopenharmony_ci .mkdir = LfsMkdir, 6963d8536b4Sopenharmony_ci}; 6973d8536b4Sopenharmony_ci 6983d8536b4Sopenharmony_cistatic struct FsManagement g_lfsMgt = { 6993d8536b4Sopenharmony_ci .fdisk = NULL, 7003d8536b4Sopenharmony_ci .format = LfsFormat, 7013d8536b4Sopenharmony_ci}; 7023d8536b4Sopenharmony_ci 7033d8536b4Sopenharmony_civoid LfsInit(void) 7043d8536b4Sopenharmony_ci{ 7053d8536b4Sopenharmony_ci (void)OsFsRegister("littlefs", &g_lfsMnt, &g_lfsFops, &g_lfsMgt); 7063d8536b4Sopenharmony_ci} 707