154568cb3Sopenharmony_ci/*
254568cb3Sopenharmony_ci * Copyright (c) 2022-2022 Huawei Technologies Co., Ltd. All rights reserved.
354568cb3Sopenharmony_ci *
454568cb3Sopenharmony_ci * UniProton is licensed under Mulan PSL v2.
554568cb3Sopenharmony_ci * You can use this software according to the terms and conditions of the Mulan PSL v2.
654568cb3Sopenharmony_ci * You may obtain a copy of Mulan PSL v2 at:
754568cb3Sopenharmony_ci *          http://license.coscl.org.cn/MulanPSL2
854568cb3Sopenharmony_ci * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
954568cb3Sopenharmony_ci * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
1054568cb3Sopenharmony_ci * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
1154568cb3Sopenharmony_ci * See the Mulan PSL v2 for more details.
1254568cb3Sopenharmony_ci * Create: 2022-09-21
1354568cb3Sopenharmony_ci * Description: littlefs适配层代码
1454568cb3Sopenharmony_ci */
1554568cb3Sopenharmony_ci#define _GNU_SOURCE 1
1654568cb3Sopenharmony_ci#include "lfs_adapter.h"
1754568cb3Sopenharmony_ci#include "prt_fs.h"
1854568cb3Sopenharmony_ci#include "vfs_files.h"
1954568cb3Sopenharmony_ci#include "vfs_operations.h"
2054568cb3Sopenharmony_ci#include "vfs_partition.h"
2154568cb3Sopenharmony_ci#include "vfs_maps.h"
2254568cb3Sopenharmony_ci#include "vfs_mount.h"
2354568cb3Sopenharmony_ci#include "securec.h"
2454568cb3Sopenharmony_ci
2554568cb3Sopenharmony_cistatic pthread_mutex_t g_fsLocalMutex = PTHREAD_MUTEX_INITIALIZER;
2654568cb3Sopenharmony_ci
2754568cb3Sopenharmony_cistatic struct PartitionCfg g_partitionCfg;
2854568cb3Sopenharmony_cistatic struct TagDeviceDesc *g_lfsDevice;
2954568cb3Sopenharmony_ci
3054568cb3Sopenharmony_cistatic uintptr_t OsLfsGetStartAddr(S32 partition)
3154568cb3Sopenharmony_ci{
3254568cb3Sopenharmony_ci    if (g_lfsDevice == NULL) {
3354568cb3Sopenharmony_ci        struct TagDeviceDesc *device = NULL;
3454568cb3Sopenharmony_ci        for (device = OsGetDeviceList(); device != NULL; device = device->dNext) {
3554568cb3Sopenharmony_ci            if (strcmp(device->dFsType, "littlefs") == 0) {
3654568cb3Sopenharmony_ci                g_lfsDevice = device;
3754568cb3Sopenharmony_ci                break;
3854568cb3Sopenharmony_ci            }
3954568cb3Sopenharmony_ci        }
4054568cb3Sopenharmony_ci    }
4154568cb3Sopenharmony_ci
4254568cb3Sopenharmony_ci    if ((g_lfsDevice == NULL) || (partition >= g_lfsDevice->dPartNum)) {
4354568cb3Sopenharmony_ci        return INVALID_DEVICE_ADDR;
4454568cb3Sopenharmony_ci    }
4554568cb3Sopenharmony_ci
4654568cb3Sopenharmony_ci    return g_lfsDevice->dAddrArray[partition];
4754568cb3Sopenharmony_ci}
4854568cb3Sopenharmony_ci
4954568cb3Sopenharmony_cistatic S32 OsLfsBlockRead(const struct lfs_config *c, lfs_block_t block,
5054568cb3Sopenharmony_ci                                      lfs_off_t off, void *dst, lfs_size_t size)
5154568cb3Sopenharmony_ci{
5254568cb3Sopenharmony_ci    uintptr_t startAddr = OsLfsGetStartAddr((S32)c->context);
5354568cb3Sopenharmony_ci    if (startAddr == INVALID_DEVICE_ADDR) {
5454568cb3Sopenharmony_ci        return -1;
5554568cb3Sopenharmony_ci    }
5654568cb3Sopenharmony_ci    startAddr += (c->block_size * block + off);
5754568cb3Sopenharmony_ci    return (g_partitionCfg.readFunc)((S32)c->context, startAddr, dst, size);
5854568cb3Sopenharmony_ci}
5954568cb3Sopenharmony_ci
6054568cb3Sopenharmony_cistatic S32 OsLfsBlockWrite(const struct lfs_config *c, lfs_block_t block,
6154568cb3Sopenharmony_ci                                       lfs_off_t off, const void *dst, lfs_size_t size)
6254568cb3Sopenharmony_ci{
6354568cb3Sopenharmony_ci    uintptr_t startAddr = OsLfsGetStartAddr((S32)c->context);
6454568cb3Sopenharmony_ci    if (startAddr == INVALID_DEVICE_ADDR) {
6554568cb3Sopenharmony_ci        return -1;
6654568cb3Sopenharmony_ci    }
6754568cb3Sopenharmony_ci
6854568cb3Sopenharmony_ci    startAddr += (c->block_size * block + off);
6954568cb3Sopenharmony_ci    return (g_partitionCfg.writeFunc)((S32)c->context, startAddr, dst, size);
7054568cb3Sopenharmony_ci}
7154568cb3Sopenharmony_ci
7254568cb3Sopenharmony_cistatic S32 OsLfsBlockErase(const struct lfs_config *c, lfs_block_t block)
7354568cb3Sopenharmony_ci{
7454568cb3Sopenharmony_ci    uintptr_t startAddr = OsLfsGetStartAddr((S32)c->context);
7554568cb3Sopenharmony_ci    if (startAddr == INVALID_DEVICE_ADDR) {
7654568cb3Sopenharmony_ci        return -1;
7754568cb3Sopenharmony_ci    }
7854568cb3Sopenharmony_ci
7954568cb3Sopenharmony_ci    startAddr += (c->block_size * block);
8054568cb3Sopenharmony_ci    return (g_partitionCfg.eraseFunc)((S32)c->context, startAddr, c->block_size);
8154568cb3Sopenharmony_ci}
8254568cb3Sopenharmony_ci
8354568cb3Sopenharmony_cistatic S32 OsLfsBlockSync(const struct lfs_config *c)
8454568cb3Sopenharmony_ci{
8554568cb3Sopenharmony_ci    (void)c;
8654568cb3Sopenharmony_ci    return 0;
8754568cb3Sopenharmony_ci}
8854568cb3Sopenharmony_ci
8954568cb3Sopenharmony_cistatic S32 OsConvertFlagToLfsOpenFlag(S32 oflags)
9054568cb3Sopenharmony_ci{
9154568cb3Sopenharmony_ci    S32 lfsOpenFlag = 0;
9254568cb3Sopenharmony_ci
9354568cb3Sopenharmony_ci    if (oflags & O_CREAT) {
9454568cb3Sopenharmony_ci        lfsOpenFlag |= LFS_O_CREAT;
9554568cb3Sopenharmony_ci    }
9654568cb3Sopenharmony_ci
9754568cb3Sopenharmony_ci    if (oflags & O_EXCL) {
9854568cb3Sopenharmony_ci        lfsOpenFlag |= LFS_O_EXCL;
9954568cb3Sopenharmony_ci    }
10054568cb3Sopenharmony_ci
10154568cb3Sopenharmony_ci    if (oflags & O_TRUNC) {
10254568cb3Sopenharmony_ci        lfsOpenFlag |= LFS_O_TRUNC;
10354568cb3Sopenharmony_ci    }
10454568cb3Sopenharmony_ci
10554568cb3Sopenharmony_ci    if (oflags & O_APPEND) {
10654568cb3Sopenharmony_ci        lfsOpenFlag |= LFS_O_APPEND;
10754568cb3Sopenharmony_ci    }
10854568cb3Sopenharmony_ci
10954568cb3Sopenharmony_ci    if (oflags & O_RDWR) {
11054568cb3Sopenharmony_ci        lfsOpenFlag |= LFS_O_RDWR;
11154568cb3Sopenharmony_ci    }
11254568cb3Sopenharmony_ci
11354568cb3Sopenharmony_ci    if (oflags & O_WRONLY) {
11454568cb3Sopenharmony_ci        lfsOpenFlag |= LFS_O_WRONLY;
11554568cb3Sopenharmony_ci    }
11654568cb3Sopenharmony_ci
11754568cb3Sopenharmony_ci    if (oflags == O_RDONLY) {
11854568cb3Sopenharmony_ci        lfsOpenFlag |= LFS_O_RDONLY;
11954568cb3Sopenharmony_ci    }
12054568cb3Sopenharmony_ci
12154568cb3Sopenharmony_ci    return lfsOpenFlag;
12254568cb3Sopenharmony_ci}
12354568cb3Sopenharmony_ci
12454568cb3Sopenharmony_cistatic S32 OsLfsErrno(S32 result)
12554568cb3Sopenharmony_ci{
12654568cb3Sopenharmony_ci    return (result < 0) ? -result : result;
12754568cb3Sopenharmony_ci}
12854568cb3Sopenharmony_ci
12954568cb3Sopenharmony_cistatic void OsLfsConfigAdapter(struct PartitionCfg *pCfg, struct lfs_config *lfsCfg)
13054568cb3Sopenharmony_ci{
13154568cb3Sopenharmony_ci    lfsCfg->context = (void *)pCfg->partNo;
13254568cb3Sopenharmony_ci
13354568cb3Sopenharmony_ci    lfsCfg->read_size = pCfg->readSize;
13454568cb3Sopenharmony_ci    lfsCfg->prog_size = pCfg->writeSize;
13554568cb3Sopenharmony_ci    lfsCfg->cache_size = pCfg->cacheSize;
13654568cb3Sopenharmony_ci    lfsCfg->block_cycles = pCfg->blockCycles;
13754568cb3Sopenharmony_ci    lfsCfg->lookahead_size = pCfg->lookaheadSize;
13854568cb3Sopenharmony_ci    lfsCfg->block_size = pCfg->blockSize;
13954568cb3Sopenharmony_ci    lfsCfg->block_count = pCfg->blockCount;
14054568cb3Sopenharmony_ci
14154568cb3Sopenharmony_ci    lfsCfg->read = OsLfsBlockRead;
14254568cb3Sopenharmony_ci    lfsCfg->prog = OsLfsBlockWrite;
14354568cb3Sopenharmony_ci    lfsCfg->erase = OsLfsBlockErase;
14454568cb3Sopenharmony_ci    lfsCfg->sync = OsLfsBlockSync;
14554568cb3Sopenharmony_ci
14654568cb3Sopenharmony_ci    g_partitionCfg.readFunc = pCfg->readFunc;
14754568cb3Sopenharmony_ci    g_partitionCfg.writeFunc = pCfg->writeFunc;
14854568cb3Sopenharmony_ci    g_partitionCfg.eraseFunc = pCfg->eraseFunc;
14954568cb3Sopenharmony_ci}
15054568cb3Sopenharmony_ci
15154568cb3Sopenharmony_cistatic S32 OsLfsMount(struct TagMountPoint *mp, uintptr_t mountflags, const void *data)
15254568cb3Sopenharmony_ci{
15354568cb3Sopenharmony_ci    S32 ret;
15454568cb3Sopenharmony_ci    S32 size;
15554568cb3Sopenharmony_ci    lfs_t *mountHdl = NULL;
15654568cb3Sopenharmony_ci    struct lfs_config *cfg = NULL;
15754568cb3Sopenharmony_ci
15854568cb3Sopenharmony_ci    if ((mp == NULL) || (mp->mPath == NULL) || (data == NULL)) {
15954568cb3Sopenharmony_ci        errno = EFAULT;
16054568cb3Sopenharmony_ci        return FS_NOK;
16154568cb3Sopenharmony_ci    }
16254568cb3Sopenharmony_ci
16354568cb3Sopenharmony_ci    size = sizeof(lfs_t) + sizeof(struct lfs_config);
16454568cb3Sopenharmony_ci    mountHdl = (lfs_t *)malloc(size);
16554568cb3Sopenharmony_ci    if (mountHdl == NULL) {
16654568cb3Sopenharmony_ci        errno = ENODEV;
16754568cb3Sopenharmony_ci        return FS_NOK;
16854568cb3Sopenharmony_ci    }
16954568cb3Sopenharmony_ci    if (memset_s(mountHdl, size, 0, size) != EOK) {
17054568cb3Sopenharmony_ci        free(mountHdl);
17154568cb3Sopenharmony_ci        errno = EBADF;
17254568cb3Sopenharmony_ci        return FS_NOK;
17354568cb3Sopenharmony_ci    }
17454568cb3Sopenharmony_ci    mp->mData = (void *)mountHdl;
17554568cb3Sopenharmony_ci    cfg = (struct lfs_config *)((uintptr_t)mountHdl + sizeof(lfs_t));
17654568cb3Sopenharmony_ci
17754568cb3Sopenharmony_ci    OsLfsConfigAdapter((struct PartitionCfg *)data, cfg);
17854568cb3Sopenharmony_ci
17954568cb3Sopenharmony_ci    ret = lfs_mount((lfs_t *)mp->mData, cfg);
18054568cb3Sopenharmony_ci    if (ret != 0) {
18154568cb3Sopenharmony_ci        ret = lfs_format((lfs_t *)mp->mData, cfg);
18254568cb3Sopenharmony_ci        if (ret == 0) {
18354568cb3Sopenharmony_ci            ret = lfs_mount((lfs_t *)mp->mData, cfg);
18454568cb3Sopenharmony_ci        }
18554568cb3Sopenharmony_ci    }
18654568cb3Sopenharmony_ci    if (ret != 0) {
18754568cb3Sopenharmony_ci        free(mountHdl);
18854568cb3Sopenharmony_ci        errno = OsLfsErrno(ret);
18954568cb3Sopenharmony_ci        return FS_NOK;
19054568cb3Sopenharmony_ci    }
19154568cb3Sopenharmony_ci    return ret;
19254568cb3Sopenharmony_ci}
19354568cb3Sopenharmony_ci
19454568cb3Sopenharmony_cistatic S32 OsLfsUmount(struct TagMountPoint *mp)
19554568cb3Sopenharmony_ci{
19654568cb3Sopenharmony_ci    S32 ret;
19754568cb3Sopenharmony_ci
19854568cb3Sopenharmony_ci    if (mp == NULL) {
19954568cb3Sopenharmony_ci        errno = EFAULT;
20054568cb3Sopenharmony_ci        return FS_NOK;
20154568cb3Sopenharmony_ci    }
20254568cb3Sopenharmony_ci
20354568cb3Sopenharmony_ci    if (mp->mData == NULL) {
20454568cb3Sopenharmony_ci        errno = ENOENT;
20554568cb3Sopenharmony_ci        return FS_NOK;
20654568cb3Sopenharmony_ci    }
20754568cb3Sopenharmony_ci
20854568cb3Sopenharmony_ci    ret = lfs_unmount((lfs_t *)mp->mData);
20954568cb3Sopenharmony_ci    if (ret != 0) {
21054568cb3Sopenharmony_ci        errno = OsLfsErrno(ret);
21154568cb3Sopenharmony_ci        ret = FS_NOK;
21254568cb3Sopenharmony_ci    }
21354568cb3Sopenharmony_ci
21454568cb3Sopenharmony_ci    free(mp->mData);
21554568cb3Sopenharmony_ci    mp->mData = NULL;
21654568cb3Sopenharmony_ci    return ret;
21754568cb3Sopenharmony_ci}
21854568cb3Sopenharmony_ci
21954568cb3Sopenharmony_cistatic S32 OsLfsUnlink(struct TagMountPoint *mp, const char *fileName)
22054568cb3Sopenharmony_ci{
22154568cb3Sopenharmony_ci    S32 ret;
22254568cb3Sopenharmony_ci
22354568cb3Sopenharmony_ci    if ((mp == NULL) || (fileName == NULL)) {
22454568cb3Sopenharmony_ci        errno = EFAULT;
22554568cb3Sopenharmony_ci        return FS_NOK;
22654568cb3Sopenharmony_ci    }
22754568cb3Sopenharmony_ci
22854568cb3Sopenharmony_ci    if (mp->mData == NULL) {
22954568cb3Sopenharmony_ci        errno = ENOENT;
23054568cb3Sopenharmony_ci        return FS_NOK;
23154568cb3Sopenharmony_ci    }
23254568cb3Sopenharmony_ci
23354568cb3Sopenharmony_ci    ret = lfs_remove((lfs_t *)mp->mData, fileName);
23454568cb3Sopenharmony_ci    if (ret != 0) {
23554568cb3Sopenharmony_ci        errno = OsLfsErrno(ret);
23654568cb3Sopenharmony_ci        ret = FS_NOK;
23754568cb3Sopenharmony_ci    }
23854568cb3Sopenharmony_ci
23954568cb3Sopenharmony_ci    return ret;
24054568cb3Sopenharmony_ci}
24154568cb3Sopenharmony_ci
24254568cb3Sopenharmony_cistatic S32 OsLfsMkdir(struct TagMountPoint *mp, const char *dirName)
24354568cb3Sopenharmony_ci{
24454568cb3Sopenharmony_ci    S32 ret;
24554568cb3Sopenharmony_ci
24654568cb3Sopenharmony_ci    if ((dirName == NULL) || (mp == NULL)) {
24754568cb3Sopenharmony_ci        errno = EFAULT;
24854568cb3Sopenharmony_ci        return FS_NOK;
24954568cb3Sopenharmony_ci    }
25054568cb3Sopenharmony_ci
25154568cb3Sopenharmony_ci    if (mp->mData == NULL) {
25254568cb3Sopenharmony_ci        errno = ENOENT;
25354568cb3Sopenharmony_ci        return FS_NOK;
25454568cb3Sopenharmony_ci    }
25554568cb3Sopenharmony_ci
25654568cb3Sopenharmony_ci    lfs_t *lfs = (lfs_t *)mp->mData;
25754568cb3Sopenharmony_ci
25854568cb3Sopenharmony_ci    ret = lfs_mkdir(lfs, dirName);
25954568cb3Sopenharmony_ci    if (ret != 0) {
26054568cb3Sopenharmony_ci        errno = OsLfsErrno(ret);
26154568cb3Sopenharmony_ci        ret = FS_NOK;
26254568cb3Sopenharmony_ci    }
26354568cb3Sopenharmony_ci
26454568cb3Sopenharmony_ci    return ret;
26554568cb3Sopenharmony_ci}
26654568cb3Sopenharmony_ci
26754568cb3Sopenharmony_cistatic S32 OsLfsRmdir(struct TagMountPoint *mp, const char *dirName)
26854568cb3Sopenharmony_ci{
26954568cb3Sopenharmony_ci    S32 ret;
27054568cb3Sopenharmony_ci    lfs_t *lfs = NULL;
27154568cb3Sopenharmony_ci
27254568cb3Sopenharmony_ci    if (mp == NULL) {
27354568cb3Sopenharmony_ci        errno = EFAULT;
27454568cb3Sopenharmony_ci        return FS_NOK;
27554568cb3Sopenharmony_ci    }
27654568cb3Sopenharmony_ci
27754568cb3Sopenharmony_ci    if (mp->mData == NULL) {
27854568cb3Sopenharmony_ci        errno = ENOENT;
27954568cb3Sopenharmony_ci        return FS_NOK;
28054568cb3Sopenharmony_ci    }
28154568cb3Sopenharmony_ci
28254568cb3Sopenharmony_ci    if (dirName == NULL) {
28354568cb3Sopenharmony_ci        errno = EFAULT;
28454568cb3Sopenharmony_ci        return FS_NOK;
28554568cb3Sopenharmony_ci    }
28654568cb3Sopenharmony_ci
28754568cb3Sopenharmony_ci    lfs = (lfs_t *)mp->mData;
28854568cb3Sopenharmony_ci    ret = lfs_remove(lfs, dirName);
28954568cb3Sopenharmony_ci    if (ret != 0) {
29054568cb3Sopenharmony_ci        errno = OsLfsErrno(ret);
29154568cb3Sopenharmony_ci        ret = FS_NOK;
29254568cb3Sopenharmony_ci    }
29354568cb3Sopenharmony_ci    return ret;
29454568cb3Sopenharmony_ci}
29554568cb3Sopenharmony_ci
29654568cb3Sopenharmony_cistatic S32 OsLfsOpendir(struct TagDir *dir, const char *dirName)
29754568cb3Sopenharmony_ci{
29854568cb3Sopenharmony_ci    S32 ret;
29954568cb3Sopenharmony_ci
30054568cb3Sopenharmony_ci    if ((dir == NULL) || (dir->dMp == NULL) || (dir->dMp->mData == NULL)) {
30154568cb3Sopenharmony_ci        errno = EFAULT;
30254568cb3Sopenharmony_ci        return FS_NOK;
30354568cb3Sopenharmony_ci    }
30454568cb3Sopenharmony_ci
30554568cb3Sopenharmony_ci    lfs_t *lfs = (lfs_t *)dir->dMp->mData;
30654568cb3Sopenharmony_ci    lfs_dir_t *dirInfo = (lfs_dir_t *)malloc(sizeof(lfs_dir_t));
30754568cb3Sopenharmony_ci    if (dirInfo == NULL) {
30854568cb3Sopenharmony_ci        errno = ENOMEM;
30954568cb3Sopenharmony_ci        return FS_NOK;
31054568cb3Sopenharmony_ci    }
31154568cb3Sopenharmony_ci    if (memset_s(dirInfo, sizeof(lfs_dir_t), 0, sizeof(lfs_dir_t)) != EOK) {
31254568cb3Sopenharmony_ci        free(dirInfo);
31354568cb3Sopenharmony_ci        errno = EBADF;
31454568cb3Sopenharmony_ci        return FS_NOK;
31554568cb3Sopenharmony_ci    }
31654568cb3Sopenharmony_ci
31754568cb3Sopenharmony_ci    ret = lfs_dir_open(lfs, dirInfo, dirName);
31854568cb3Sopenharmony_ci    if (ret != 0) {
31954568cb3Sopenharmony_ci        free(dirInfo);
32054568cb3Sopenharmony_ci        errno = OsLfsErrno(ret);
32154568cb3Sopenharmony_ci        return FS_NOK;
32254568cb3Sopenharmony_ci    }
32354568cb3Sopenharmony_ci
32454568cb3Sopenharmony_ci    dir->dData = dirInfo;
32554568cb3Sopenharmony_ci    dir->dOffset = 0;
32654568cb3Sopenharmony_ci    return FS_OK;
32754568cb3Sopenharmony_ci}
32854568cb3Sopenharmony_ci
32954568cb3Sopenharmony_cistatic S32 OsLfsReaddir(struct TagDir *dir, struct dirent *dent)
33054568cb3Sopenharmony_ci{
33154568cb3Sopenharmony_ci    S32 ret;
33254568cb3Sopenharmony_ci    struct lfs_info lfsInfo;
33354568cb3Sopenharmony_ci
33454568cb3Sopenharmony_ci    if ((dir == NULL) || (dir->dMp == NULL) || (dir->dMp->mData == NULL) ||
33554568cb3Sopenharmony_ci        (dent == NULL)) {
33654568cb3Sopenharmony_ci        errno = EFAULT;
33754568cb3Sopenharmony_ci        return FS_NOK;
33854568cb3Sopenharmony_ci    }
33954568cb3Sopenharmony_ci
34054568cb3Sopenharmony_ci    if (dir->dData == NULL) {
34154568cb3Sopenharmony_ci        errno = EBADF;
34254568cb3Sopenharmony_ci        return FS_NOK;
34354568cb3Sopenharmony_ci    }
34454568cb3Sopenharmony_ci
34554568cb3Sopenharmony_ci    lfs_t *lfs = (lfs_t *)dir->dMp->mData;
34654568cb3Sopenharmony_ci    lfs_dir_t *dirInfo = (lfs_dir_t *)dir->dData;
34754568cb3Sopenharmony_ci
34854568cb3Sopenharmony_ci    ret = lfs_dir_read(lfs, dirInfo, &lfsInfo);
34954568cb3Sopenharmony_ci    if (ret == TRUE) {
35054568cb3Sopenharmony_ci        pthread_mutex_lock(&g_fsLocalMutex);
35154568cb3Sopenharmony_ci        (void)strncpy_s(dent->d_name, sizeof(dent->d_name), lfsInfo.name, strlen(lfsInfo.name) + 1);
35254568cb3Sopenharmony_ci        if (lfsInfo.type == LFS_TYPE_DIR) {
35354568cb3Sopenharmony_ci            dent->d_type = DT_DIR;
35454568cb3Sopenharmony_ci        } else if (lfsInfo.type == LFS_TYPE_REG) {
35554568cb3Sopenharmony_ci            dent->d_type = DT_REG;
35654568cb3Sopenharmony_ci        }
35754568cb3Sopenharmony_ci
35854568cb3Sopenharmony_ci        dent->d_reclen = lfsInfo.size;
35954568cb3Sopenharmony_ci        pthread_mutex_unlock(&g_fsLocalMutex);
36054568cb3Sopenharmony_ci
36154568cb3Sopenharmony_ci        return FS_OK;
36254568cb3Sopenharmony_ci    }
36354568cb3Sopenharmony_ci
36454568cb3Sopenharmony_ci    if (ret != 0) {
36554568cb3Sopenharmony_ci        errno = OsLfsErrno(ret);
36654568cb3Sopenharmony_ci    }
36754568cb3Sopenharmony_ci
36854568cb3Sopenharmony_ci    return FS_NOK;
36954568cb3Sopenharmony_ci}
37054568cb3Sopenharmony_ci
37154568cb3Sopenharmony_cistatic S32 OsLfsClosedir(struct TagDir *dir)
37254568cb3Sopenharmony_ci{
37354568cb3Sopenharmony_ci    S32 ret;
37454568cb3Sopenharmony_ci
37554568cb3Sopenharmony_ci    if ((dir == NULL) || (dir->dMp == NULL) || (dir->dMp->mData == NULL)) {
37654568cb3Sopenharmony_ci        errno = EFAULT;
37754568cb3Sopenharmony_ci        return FS_NOK;
37854568cb3Sopenharmony_ci    }
37954568cb3Sopenharmony_ci
38054568cb3Sopenharmony_ci    if (dir->dData == NULL) {
38154568cb3Sopenharmony_ci        errno = EBADF;
38254568cb3Sopenharmony_ci        return FS_NOK;
38354568cb3Sopenharmony_ci    }
38454568cb3Sopenharmony_ci
38554568cb3Sopenharmony_ci    lfs_t *lfs = (lfs_t *)dir->dMp->mData;
38654568cb3Sopenharmony_ci    lfs_dir_t *dirInfo = (lfs_dir_t *)dir->dData;
38754568cb3Sopenharmony_ci
38854568cb3Sopenharmony_ci    ret = lfs_dir_close(lfs, dirInfo);
38954568cb3Sopenharmony_ci    if (ret != 0) {
39054568cb3Sopenharmony_ci        errno = OsLfsErrno(ret);
39154568cb3Sopenharmony_ci        ret = FS_NOK;
39254568cb3Sopenharmony_ci    }
39354568cb3Sopenharmony_ci
39454568cb3Sopenharmony_ci    free(dirInfo);
39554568cb3Sopenharmony_ci    dir->dData = NULL;
39654568cb3Sopenharmony_ci
39754568cb3Sopenharmony_ci    return ret;
39854568cb3Sopenharmony_ci}
39954568cb3Sopenharmony_ci
40054568cb3Sopenharmony_cistatic S32 OsLfsOpen(struct TagFile *file, const char *pathName, S32 openFlag)
40154568cb3Sopenharmony_ci{
40254568cb3Sopenharmony_ci    S32 ret;
40354568cb3Sopenharmony_ci    lfs_file_t *lfsHandle = NULL;
40454568cb3Sopenharmony_ci
40554568cb3Sopenharmony_ci    if ((pathName == NULL) || (file == NULL) || (file->fMp == NULL) ||
40654568cb3Sopenharmony_ci        (file->fMp->mData == NULL)) {
40754568cb3Sopenharmony_ci        errno = EFAULT;
40854568cb3Sopenharmony_ci        return FS_NOK;
40954568cb3Sopenharmony_ci    }
41054568cb3Sopenharmony_ci
41154568cb3Sopenharmony_ci    lfsHandle = (lfs_file_t *)malloc(sizeof(lfs_file_t));
41254568cb3Sopenharmony_ci    if (lfsHandle == NULL) {
41354568cb3Sopenharmony_ci        errno = ENOMEM;
41454568cb3Sopenharmony_ci        return FS_NOK;
41554568cb3Sopenharmony_ci    }
41654568cb3Sopenharmony_ci
41754568cb3Sopenharmony_ci    S32 lfsOpenFlag = OsConvertFlagToLfsOpenFlag(openFlag);
41854568cb3Sopenharmony_ci    ret = lfs_file_open((lfs_t *)file->fMp->mData, lfsHandle, pathName, lfsOpenFlag);
41954568cb3Sopenharmony_ci    if (ret != 0) {
42054568cb3Sopenharmony_ci        free(lfsHandle);
42154568cb3Sopenharmony_ci        errno = OsLfsErrno(ret);
42254568cb3Sopenharmony_ci        return INVALID_FD;
42354568cb3Sopenharmony_ci    }
42454568cb3Sopenharmony_ci
42554568cb3Sopenharmony_ci    file->fData = (void *)lfsHandle;
42654568cb3Sopenharmony_ci    return ret;
42754568cb3Sopenharmony_ci}
42854568cb3Sopenharmony_ci
42954568cb3Sopenharmony_cistatic S32 OsLfsRead(struct TagFile *file, char *buf, size_t len)
43054568cb3Sopenharmony_ci{
43154568cb3Sopenharmony_ci    S32 ret;
43254568cb3Sopenharmony_ci    struct TagMountPoint *mp = NULL;
43354568cb3Sopenharmony_ci    lfs_file_t *lfsHandle = NULL;
43454568cb3Sopenharmony_ci
43554568cb3Sopenharmony_ci    if (buf == NULL) {
43654568cb3Sopenharmony_ci        errno = EFAULT;
43754568cb3Sopenharmony_ci        return FS_NOK;
43854568cb3Sopenharmony_ci    }
43954568cb3Sopenharmony_ci
44054568cb3Sopenharmony_ci    if ((file == NULL) || (file->fData == NULL)) {
44154568cb3Sopenharmony_ci        errno = EBADF;
44254568cb3Sopenharmony_ci        return FS_NOK;
44354568cb3Sopenharmony_ci    }
44454568cb3Sopenharmony_ci
44554568cb3Sopenharmony_ci    lfsHandle = (lfs_file_t *)file->fData;
44654568cb3Sopenharmony_ci    mp = file->fMp;
44754568cb3Sopenharmony_ci    if ((mp == NULL) || (mp->mData == NULL)) {
44854568cb3Sopenharmony_ci        errno = EFAULT;
44954568cb3Sopenharmony_ci        return FS_NOK;
45054568cb3Sopenharmony_ci    }
45154568cb3Sopenharmony_ci
45254568cb3Sopenharmony_ci    ret = lfs_file_read((lfs_t *)mp->mData, lfsHandle, buf, len);
45354568cb3Sopenharmony_ci    if (ret < 0) {
45454568cb3Sopenharmony_ci        errno = OsLfsErrno(ret);
45554568cb3Sopenharmony_ci        ret = FS_NOK;
45654568cb3Sopenharmony_ci    }
45754568cb3Sopenharmony_ci    return ret;
45854568cb3Sopenharmony_ci}
45954568cb3Sopenharmony_ci
46054568cb3Sopenharmony_cistatic S32 OsLfsWrite(struct TagFile *file, const char *buf, size_t len)
46154568cb3Sopenharmony_ci{
46254568cb3Sopenharmony_ci    S32 ret;
46354568cb3Sopenharmony_ci    struct TagMountPoint *mp = NULL;
46454568cb3Sopenharmony_ci    lfs_file_t *lfsHandle = NULL;
46554568cb3Sopenharmony_ci
46654568cb3Sopenharmony_ci    if (buf == NULL) {
46754568cb3Sopenharmony_ci        errno = EFAULT;
46854568cb3Sopenharmony_ci        return FS_NOK;
46954568cb3Sopenharmony_ci    }
47054568cb3Sopenharmony_ci
47154568cb3Sopenharmony_ci    if ((file == NULL) || (file->fData == NULL)) {
47254568cb3Sopenharmony_ci        errno = EBADF;
47354568cb3Sopenharmony_ci        return FS_NOK;
47454568cb3Sopenharmony_ci    }
47554568cb3Sopenharmony_ci
47654568cb3Sopenharmony_ci    lfsHandle = (lfs_file_t *)file->fData;
47754568cb3Sopenharmony_ci    mp = file->fMp;
47854568cb3Sopenharmony_ci    if ((mp == NULL) || (mp->mData == NULL)) {
47954568cb3Sopenharmony_ci        errno = EFAULT;
48054568cb3Sopenharmony_ci        return FS_NOK;
48154568cb3Sopenharmony_ci    }
48254568cb3Sopenharmony_ci
48354568cb3Sopenharmony_ci    ret = lfs_file_write((lfs_t *)mp->mData, lfsHandle, buf, len);
48454568cb3Sopenharmony_ci    if (ret < 0) {
48554568cb3Sopenharmony_ci        errno = OsLfsErrno(ret);
48654568cb3Sopenharmony_ci        ret = FS_NOK;
48754568cb3Sopenharmony_ci    }
48854568cb3Sopenharmony_ci    return ret;
48954568cb3Sopenharmony_ci}
49054568cb3Sopenharmony_ci
49154568cb3Sopenharmony_cistatic off_t OsLfsSeek(struct TagFile *file, off_t offset, S32 whence)
49254568cb3Sopenharmony_ci{
49354568cb3Sopenharmony_ci    off_t ret;
49454568cb3Sopenharmony_ci    struct TagMountPoint *mp = NULL;
49554568cb3Sopenharmony_ci    lfs_file_t *lfsHandle = NULL;
49654568cb3Sopenharmony_ci
49754568cb3Sopenharmony_ci    if ((file == NULL) || (file->fData == NULL)) {
49854568cb3Sopenharmony_ci        errno = EBADF;
49954568cb3Sopenharmony_ci        return (off_t)FS_NOK;
50054568cb3Sopenharmony_ci    }
50154568cb3Sopenharmony_ci
50254568cb3Sopenharmony_ci    lfsHandle = (lfs_file_t *)file->fData;
50354568cb3Sopenharmony_ci    mp = file->fMp;
50454568cb3Sopenharmony_ci    if ((mp == NULL) || (mp->mData == NULL)) {
50554568cb3Sopenharmony_ci        errno = EFAULT;
50654568cb3Sopenharmony_ci        return (off_t)FS_NOK;
50754568cb3Sopenharmony_ci    }
50854568cb3Sopenharmony_ci
50954568cb3Sopenharmony_ci    ret = (off_t)lfs_file_seek((lfs_t *)mp->mData, lfsHandle, offset, whence);
51054568cb3Sopenharmony_ci    if (ret < 0) {
51154568cb3Sopenharmony_ci        errno = OsLfsErrno(ret);
51254568cb3Sopenharmony_ci        ret = (off_t)FS_NOK;
51354568cb3Sopenharmony_ci    }
51454568cb3Sopenharmony_ci
51554568cb3Sopenharmony_ci    return ret;
51654568cb3Sopenharmony_ci}
51754568cb3Sopenharmony_ci
51854568cb3Sopenharmony_cistatic S32 OsLfsClose(struct TagFile *file)
51954568cb3Sopenharmony_ci{
52054568cb3Sopenharmony_ci    S32 ret;
52154568cb3Sopenharmony_ci    struct TagMountPoint *mp = NULL;
52254568cb3Sopenharmony_ci    lfs_file_t *lfsHandle = NULL;
52354568cb3Sopenharmony_ci
52454568cb3Sopenharmony_ci    if ((file == NULL) || (file->fData == NULL)) {
52554568cb3Sopenharmony_ci        errno = EBADF;
52654568cb3Sopenharmony_ci        return FS_NOK;
52754568cb3Sopenharmony_ci    }
52854568cb3Sopenharmony_ci
52954568cb3Sopenharmony_ci    lfsHandle = (lfs_file_t *)file->fData;
53054568cb3Sopenharmony_ci    mp = file->fMp;
53154568cb3Sopenharmony_ci    if ((mp == NULL) || (mp->mData == NULL)) {
53254568cb3Sopenharmony_ci        errno = EFAULT;
53354568cb3Sopenharmony_ci        return FS_NOK;
53454568cb3Sopenharmony_ci    }
53554568cb3Sopenharmony_ci
53654568cb3Sopenharmony_ci    pthread_mutex_lock(&g_fsLocalMutex);
53754568cb3Sopenharmony_ci    ret = lfs_file_close((lfs_t *)mp->mData, lfsHandle);
53854568cb3Sopenharmony_ci    pthread_mutex_unlock(&g_fsLocalMutex);
53954568cb3Sopenharmony_ci
54054568cb3Sopenharmony_ci    if (ret != 0) {
54154568cb3Sopenharmony_ci        errno = OsLfsErrno(ret);
54254568cb3Sopenharmony_ci        ret = FS_NOK;
54354568cb3Sopenharmony_ci    }
54454568cb3Sopenharmony_ci
54554568cb3Sopenharmony_ci    free(file->fData);
54654568cb3Sopenharmony_ci    file->fData = NULL;
54754568cb3Sopenharmony_ci    return ret;
54854568cb3Sopenharmony_ci}
54954568cb3Sopenharmony_ci
55054568cb3Sopenharmony_cistatic S32 OsLfsRename(struct TagMountPoint *mp, const char *oldName, const char *newName)
55154568cb3Sopenharmony_ci{
55254568cb3Sopenharmony_ci    S32 ret;
55354568cb3Sopenharmony_ci
55454568cb3Sopenharmony_ci    if ((mp == NULL) || (oldName == NULL) || (newName == NULL)) {
55554568cb3Sopenharmony_ci        errno = EFAULT;
55654568cb3Sopenharmony_ci        return FS_NOK;
55754568cb3Sopenharmony_ci    }
55854568cb3Sopenharmony_ci
55954568cb3Sopenharmony_ci    if (mp->mData == NULL) {
56054568cb3Sopenharmony_ci        errno = ENOENT;
56154568cb3Sopenharmony_ci        return FS_NOK;
56254568cb3Sopenharmony_ci    }
56354568cb3Sopenharmony_ci
56454568cb3Sopenharmony_ci    ret = lfs_rename((lfs_t *)mp->mData, oldName, newName);
56554568cb3Sopenharmony_ci    if (ret != 0) {
56654568cb3Sopenharmony_ci        errno = OsLfsErrno(ret);
56754568cb3Sopenharmony_ci        ret = FS_NOK;
56854568cb3Sopenharmony_ci    }
56954568cb3Sopenharmony_ci
57054568cb3Sopenharmony_ci    return ret;
57154568cb3Sopenharmony_ci}
57254568cb3Sopenharmony_ci
57354568cb3Sopenharmony_cistatic S32 OsLfsStat(struct TagMountPoint *mp, const char *path, struct stat *buf)
57454568cb3Sopenharmony_ci{
57554568cb3Sopenharmony_ci    S32 ret;
57654568cb3Sopenharmony_ci    struct lfs_info info;
57754568cb3Sopenharmony_ci
57854568cb3Sopenharmony_ci    if ((mp == NULL) || (path == NULL) || (buf == NULL)) {
57954568cb3Sopenharmony_ci        errno = EFAULT;
58054568cb3Sopenharmony_ci        return FS_NOK;
58154568cb3Sopenharmony_ci    }
58254568cb3Sopenharmony_ci
58354568cb3Sopenharmony_ci    if (mp->mData == NULL) {
58454568cb3Sopenharmony_ci        errno = ENOENT;
58554568cb3Sopenharmony_ci        return FS_NOK;
58654568cb3Sopenharmony_ci    }
58754568cb3Sopenharmony_ci
58854568cb3Sopenharmony_ci    ret = lfs_stat((lfs_t *)mp->mData, path, &info);
58954568cb3Sopenharmony_ci    if (ret == 0) {
59054568cb3Sopenharmony_ci        buf->st_size = info.size;
59154568cb3Sopenharmony_ci        if (info.type == LFS_TYPE_REG) {
59254568cb3Sopenharmony_ci            buf->st_mode = S_IFREG;
59354568cb3Sopenharmony_ci        } else {
59454568cb3Sopenharmony_ci            buf->st_mode = S_IFDIR;
59554568cb3Sopenharmony_ci        }
59654568cb3Sopenharmony_ci    } else {
59754568cb3Sopenharmony_ci        errno = OsLfsErrno(ret);
59854568cb3Sopenharmony_ci        ret = FS_NOK;
59954568cb3Sopenharmony_ci    }
60054568cb3Sopenharmony_ci
60154568cb3Sopenharmony_ci    return ret;
60254568cb3Sopenharmony_ci}
60354568cb3Sopenharmony_ci
60454568cb3Sopenharmony_cistatic S32 OsLfsSync(struct TagFile *file)
60554568cb3Sopenharmony_ci{
60654568cb3Sopenharmony_ci    S32 ret;
60754568cb3Sopenharmony_ci    struct TagMountPoint *mp = NULL;
60854568cb3Sopenharmony_ci
60954568cb3Sopenharmony_ci    if ((file == NULL) || (file->fData == NULL)) {
61054568cb3Sopenharmony_ci        errno = EBADF;
61154568cb3Sopenharmony_ci        return FS_NOK;
61254568cb3Sopenharmony_ci    }
61354568cb3Sopenharmony_ci
61454568cb3Sopenharmony_ci    if ((file->fMp == NULL) || (file->fMp->mData == NULL)) {
61554568cb3Sopenharmony_ci        errno = EFAULT;
61654568cb3Sopenharmony_ci        return FS_NOK;
61754568cb3Sopenharmony_ci    }
61854568cb3Sopenharmony_ci
61954568cb3Sopenharmony_ci    mp = file->fMp;
62054568cb3Sopenharmony_ci    ret = lfs_file_sync((lfs_t *)mp->mData, (lfs_file_t *)file->fData);
62154568cb3Sopenharmony_ci    if (ret != 0) {
62254568cb3Sopenharmony_ci        errno = OsLfsErrno(ret);
62354568cb3Sopenharmony_ci        ret = FS_NOK;
62454568cb3Sopenharmony_ci    }
62554568cb3Sopenharmony_ci    return ret;
62654568cb3Sopenharmony_ci}
62754568cb3Sopenharmony_ci
62854568cb3Sopenharmony_cistatic S32 OsLfsFormat(const char *partName, void *privData)
62954568cb3Sopenharmony_ci{
63054568cb3Sopenharmony_ci    S32 ret;
63154568cb3Sopenharmony_ci    lfs_t lfs = {0};
63254568cb3Sopenharmony_ci    struct lfs_config cfg = {0};
63354568cb3Sopenharmony_ci
63454568cb3Sopenharmony_ci    (void)partName;
63554568cb3Sopenharmony_ci
63654568cb3Sopenharmony_ci    OsLfsConfigAdapter((struct PartitionCfg *)privData, &cfg);
63754568cb3Sopenharmony_ci
63854568cb3Sopenharmony_ci    ret = lfs_format(&lfs, &cfg);
63954568cb3Sopenharmony_ci    if (ret != 0) {
64054568cb3Sopenharmony_ci        errno = OsLfsErrno(ret);
64154568cb3Sopenharmony_ci        ret = FS_NOK;
64254568cb3Sopenharmony_ci    }
64354568cb3Sopenharmony_ci    return ret;
64454568cb3Sopenharmony_ci}
64554568cb3Sopenharmony_ci
64654568cb3Sopenharmony_cistatic struct TagMountOps g_lfsMnt = {
64754568cb3Sopenharmony_ci    .mount = OsLfsMount,
64854568cb3Sopenharmony_ci    .umount = OsLfsUmount,
64954568cb3Sopenharmony_ci    .umount2 = NULL,
65054568cb3Sopenharmony_ci    .statfs = NULL,
65154568cb3Sopenharmony_ci};
65254568cb3Sopenharmony_ci
65354568cb3Sopenharmony_cistatic struct TagFileOps g_lfsFops = {
65454568cb3Sopenharmony_ci    .open = OsLfsOpen,
65554568cb3Sopenharmony_ci    .close = OsLfsClose,
65654568cb3Sopenharmony_ci    .read = OsLfsRead,
65754568cb3Sopenharmony_ci    .write = OsLfsWrite,
65854568cb3Sopenharmony_ci    .lseek = OsLfsSeek,
65954568cb3Sopenharmony_ci    .stat = OsLfsStat,
66054568cb3Sopenharmony_ci    .truncate = NULL,
66154568cb3Sopenharmony_ci    .unlink = OsLfsUnlink,
66254568cb3Sopenharmony_ci    .rename = OsLfsRename,
66354568cb3Sopenharmony_ci    .ioctl = NULL, /* 不支持 */
66454568cb3Sopenharmony_ci    .sync = OsLfsSync,
66554568cb3Sopenharmony_ci    .rmdir = OsLfsRmdir,
66654568cb3Sopenharmony_ci    .opendir = OsLfsOpendir,
66754568cb3Sopenharmony_ci    .readdir = OsLfsReaddir,
66854568cb3Sopenharmony_ci    .closedir = OsLfsClosedir,
66954568cb3Sopenharmony_ci    .mkdir = OsLfsMkdir,
67054568cb3Sopenharmony_ci};
67154568cb3Sopenharmony_ci
67254568cb3Sopenharmony_cistatic struct TagFsManagement g_lfsMgt = {
67354568cb3Sopenharmony_ci    .fdisk = NULL,
67454568cb3Sopenharmony_ci    .format = OsLfsFormat,
67554568cb3Sopenharmony_ci};
67654568cb3Sopenharmony_ci
67754568cb3Sopenharmony_civoid OsLfsInit(void)
67854568cb3Sopenharmony_ci{
67954568cb3Sopenharmony_ci    (void)OsFsRegister("littlefs", &g_lfsMnt, &g_lfsFops, &g_lfsMgt);
68054568cb3Sopenharmony_ci}
681