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