lfs_adapter.c 17.1 KB
Newer Older
G
Guangyao Ma 已提交
1 2
/*
 * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
A
arvinzzz 已提交
3
 * Copyright (c) 2020-2022 Huawei Device Co., Ltd. All rights reserved.
G
Guangyao Ma 已提交
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice, this list of
 *    conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
 *    of conditions and the following disclaimer in the documentation and/or other materials
 *    provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
 *    to endorse or promote products derived from this software without specific prior written
 *    permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#define _GNU_SOURCE 1
#include "lfs_adapter.h"
#include "los_config.h"
35
#include "los_fs.h"
G
Guangyao Ma 已提交
36 37 38 39 40 41
#include "vfs_files.h"
#include "vfs_operations.h"
#include "vfs_partition.h"
#include "vfs_maps.h"
#include "vfs_mount.h"
#include "securec.h"
42
#include "los_fs.h"
G
Guangyao Ma 已提交
43

44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
static struct PartitionCfg g_partitionCfg;
static struct DeviceDesc *g_lfsDevice = NULL;

static uint32_t LfsGetStartAddr(int partition)
{
    if (g_lfsDevice == NULL) {
        struct DeviceDesc *device = NULL;
        for (device = getDeviceList(); device != NULL; device = device->dNext) {
            if (strcmp(device->dFsType, "littlefs") == 0) {
                g_lfsDevice = device;
                break;
            }
        }
    }

    if ((g_lfsDevice == NULL) || (partition >= g_lfsDevice->dPartNum)) {
        return INVALID_DEVICE_ADDR;
    }

63
    return (uint32_t)g_lfsDevice->dAddrArray[partition];
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
}

WEAK int littlefs_block_read(const struct lfs_config *c, lfs_block_t block,
                             lfs_off_t off, void *dst, lfs_size_t size)
{
    UINT32 addr = c->block_size * block + off;
    UINT32 startaddr = LfsGetStartAddr((int)c->context);
    if (startaddr == INVALID_DEVICE_ADDR) {
        return -1;
    }
    addr += startaddr;

    return (g_partitionCfg.readFunc)((int)c->context, &addr, dst, size);
}

WEAK int littlefs_block_write(const struct lfs_config *c, lfs_block_t block,
                              lfs_off_t off, const void *dst, lfs_size_t size)
{
    UINT32 addr = c->block_size * block + off;
    UINT32 startaddr = LfsGetStartAddr((int)c->context);
    if (startaddr == INVALID_DEVICE_ADDR) {
        return -1;
    }

    addr += startaddr;

    return (g_partitionCfg.writeFunc)((int)c->context, &addr, dst, size);
}

WEAK int littlefs_block_erase(const struct lfs_config *c, lfs_block_t block)
{
    UINT32 addr = c->block_size * block;
    UINT32 startaddr = LfsGetStartAddr((int)c->context);
    if (startaddr == INVALID_DEVICE_ADDR) {
        return -1;
    }

    addr += startaddr;

    return (g_partitionCfg.eraseFunc)((int)c->context, addr, c->block_size);
}

WEAK int littlefs_block_sync(const struct lfs_config *c)
{
    (void)c;
    return 0;
}
G
Guangyao Ma 已提交
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151

static int ConvertFlagToLfsOpenFlag (int oflags)
{
    int lfsOpenFlag = 0;

    if (oflags & O_CREAT) {
        lfsOpenFlag |= LFS_O_CREAT;
    }

    if (oflags & O_EXCL) {
        lfsOpenFlag |= LFS_O_EXCL;
    }

    if (oflags & O_TRUNC) {
        lfsOpenFlag |= LFS_O_TRUNC;
    }

    if (oflags & O_APPEND) {
        lfsOpenFlag |= LFS_O_APPEND;
    }

    if (oflags & O_RDWR) {
        lfsOpenFlag |= LFS_O_RDWR;
    }

    if (oflags & O_WRONLY) {
        lfsOpenFlag |= LFS_O_WRONLY;
    }

    if (oflags == O_RDONLY) {
        lfsOpenFlag |= LFS_O_RDONLY;
    }

    return lfsOpenFlag;
}

static int LittlefsErrno(int result)
{
    return (result < 0) ? -result : result;
}

152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
void LfsConfigAdapter(struct PartitionCfg *pCfg, struct lfs_config *lfsCfg)
{
    lfsCfg->context = (void *)pCfg->partNo;

    lfsCfg->read_size = pCfg->readSize;
    lfsCfg->prog_size = pCfg->writeSize;
    lfsCfg->cache_size = pCfg->cacheSize;
    lfsCfg->block_cycles = pCfg->blockCycles;
    lfsCfg->lookahead_size = pCfg->lookaheadSize;
    lfsCfg->block_size = pCfg->blockSize;
    lfsCfg->block_count = pCfg->blockCount;

    lfsCfg->read = littlefs_block_read;
    lfsCfg->prog = littlefs_block_write;
    lfsCfg->erase = littlefs_block_erase;
    lfsCfg->sync = littlefs_block_sync;

    g_partitionCfg.readFunc = pCfg->readFunc;
    g_partitionCfg.writeFunc = pCfg->writeFunc;
    g_partitionCfg.eraseFunc = pCfg->eraseFunc;
}

G
Guangyao Ma 已提交
174 175 176 177
int LfsMount(struct MountPoint *mp, unsigned long mountflags, const void *data)
{
    int ret;
    lfs_t *mountHdl = NULL;
W
wangchen 已提交
178
    struct lfs_config *cfg = NULL;
G
Guangyao Ma 已提交
179 180 181

    if ((mp == NULL) || (mp->mPath == NULL) || (data == NULL)) {
        errno = EFAULT;
A
arvinzzz 已提交
182
        ret = (int)LOS_NOK;
G
Guangyao Ma 已提交
183 184 185
        goto errout;
    }

F
Far 已提交
186 187 188 189 190 191
    if (mountflags & MS_REMOUNT) {
        errno = ENOSYS;
        ret = (int)LOS_NOK;
        goto errout;
    }

192
    mountHdl = (lfs_t *)LOSCFG_FS_MALLOC_HOOK(sizeof(lfs_t) + sizeof(struct lfs_config));
G
Guangyao Ma 已提交
193 194
    if (mountHdl == NULL) {
        errno = ENODEV;
A
arvinzzz 已提交
195
        ret = (int)LOS_NOK;
G
Guangyao Ma 已提交
196 197
        goto errout;
    }
W
wangchen 已提交
198
    (void)memset_s(mountHdl, sizeof(lfs_t) + sizeof(struct lfs_config), 0, sizeof(lfs_t) + sizeof(struct lfs_config));
G
Guangyao Ma 已提交
199
    mp->mData = (void *)mountHdl;
W
wangchen 已提交
200
    cfg = (void *)((UINTPTR)mountHdl + sizeof(lfs_t));
G
Guangyao Ma 已提交
201

W
wangchen 已提交
202
    LfsConfigAdapter((struct PartitionCfg *)data, cfg);
203

W
wangchen 已提交
204
    ret = lfs_mount((lfs_t *)mp->mData, cfg);
G
Guangyao Ma 已提交
205
    if (ret != 0) {
W
wangchen 已提交
206
        ret = lfs_format((lfs_t *)mp->mData, cfg);
G
Guangyao Ma 已提交
207
        if (ret == 0) {
W
wangchen 已提交
208
            ret = lfs_mount((lfs_t *)mp->mData, cfg);
G
Guangyao Ma 已提交
209 210 211
        }
    }
    if (ret != 0) {
212
        LOSCFG_FS_FREE_HOOK(mountHdl);
G
Guangyao Ma 已提交
213
        errno = LittlefsErrno(ret);
A
arvinzzz 已提交
214
        ret = (int)LOS_NOK;
G
Guangyao Ma 已提交
215 216 217 218 219 220 221 222 223 224 225 226
    }

errout:
    return ret;
}

int LfsUmount(struct MountPoint *mp)
{
    int ret;

    if (mp == NULL) {
        errno = EFAULT;
A
arvinzzz 已提交
227
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
228 229 230 231
    }

    if (mp->mData == NULL) {
        errno = ENOENT;
A
arvinzzz 已提交
232
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
233 234 235 236 237
    }

    ret = lfs_unmount((lfs_t *)mp->mData);
    if (ret != 0) {
        errno = LittlefsErrno(ret);
A
arvinzzz 已提交
238
        ret = (int)LOS_NOK;
G
Guangyao Ma 已提交
239 240
    }

241
    LOSCFG_FS_FREE_HOOK(mp->mData);
G
Guangyao Ma 已提交
242 243 244 245 246 247 248 249 250 251
    mp->mData = NULL;
    return ret;
}

int LfsUnlink(struct MountPoint *mp, const char *fileName)
{
    int ret;

    if ((mp == NULL) || (fileName == NULL)) {
        errno = EFAULT;
A
arvinzzz 已提交
252
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
253 254 255 256
    }

    if (mp->mData == NULL) {
        errno = ENOENT;
A
arvinzzz 已提交
257
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
258 259 260 261 262
    }

    ret = lfs_remove((lfs_t *)mp->mData, fileName);
    if (ret != 0) {
        errno = LittlefsErrno(ret);
A
arvinzzz 已提交
263
        ret = (int)LOS_NOK;
G
Guangyao Ma 已提交
264 265 266 267 268 269 270 271 272 273 274
    }

    return ret;
}

int LfsMkdir(struct MountPoint *mp, const char *dirName)
{
    int ret;

    if ((dirName == NULL) || (mp == NULL)) {
        errno = EFAULT;
A
arvinzzz 已提交
275
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
276 277 278 279
    }

    if (mp->mData == NULL) {
        errno = ENOENT;
A
arvinzzz 已提交
280
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
281 282 283 284 285 286 287
    }

    lfs_t *lfs = (lfs_t *)mp->mData;

    ret = lfs_mkdir(lfs, dirName);
    if (ret != 0) {
        errno = LittlefsErrno(ret);
A
arvinzzz 已提交
288
        ret = (int)LOS_NOK;
G
Guangyao Ma 已提交
289 290 291 292 293 294 295 296 297 298 299 300
    }

    return ret;
}

int LfsRmdir(struct MountPoint *mp, const char *dirName)
{
    int ret;
    lfs_t *lfs = NULL;

    if (mp == NULL) {
        errno = EFAULT;
A
arvinzzz 已提交
301
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
302 303 304 305
    }

    if (mp->mData == NULL) {
        errno = ENOENT;
A
arvinzzz 已提交
306
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
307 308 309 310 311 312
    }

    lfs = (lfs_t *)mp->mData;

    if (dirName == NULL) {
        errno = EFAULT;
A
arvinzzz 已提交
313
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
314 315 316 317 318
    }

    ret = lfs_remove(lfs, dirName);
    if (ret != 0) {
        errno = LittlefsErrno(ret);
A
arvinzzz 已提交
319
        ret = (int)LOS_NOK;
G
Guangyao Ma 已提交
320 321 322 323 324 325 326 327 328 329 330
    }

    return ret;
}

int LfsOpendir(struct Dir *dir, const char *dirName)
{
    int ret;

    if ((dir == NULL) || (dir->dMp == NULL) || (dir->dMp->mData == NULL)) {
        errno = EFAULT;
A
arvinzzz 已提交
331
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
332 333 334
    }

    lfs_t *lfs = (lfs_t *)dir->dMp->mData;
335
    lfs_dir_t *dirInfo = (lfs_dir_t *)LOSCFG_FS_MALLOC_HOOK(sizeof(lfs_dir_t));
G
Guangyao Ma 已提交
336 337
    if (dirInfo == NULL) {
        errno = ENOMEM;
A
arvinzzz 已提交
338
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
339 340 341 342 343
    }

    (void)memset_s(dirInfo, sizeof(lfs_dir_t), 0, sizeof(lfs_dir_t));
    ret = lfs_dir_open(lfs, dirInfo, dirName);
    if (ret != 0) {
344
        LOSCFG_FS_FREE_HOOK(dirInfo);
G
Guangyao Ma 已提交
345 346 347 348 349 350 351 352 353 354
        errno = LittlefsErrno(ret);
        goto errout;
    }

    dir->dData = dirInfo;
    dir->dOffset = 0;

    return LOS_OK;

errout:
A
arvinzzz 已提交
355
    return (int)LOS_NOK;
G
Guangyao Ma 已提交
356 357 358 359 360 361 362 363 364 365
}

int LfsReaddir(struct Dir *dir, struct dirent *dent)
{
    int ret;
    struct lfs_info lfsInfo;

    if ((dir == NULL) || (dir->dMp == NULL) || (dir->dMp->mData == NULL) ||
        (dent == NULL)) {
        errno = EFAULT;
A
arvinzzz 已提交
366
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
367 368 369 370
    }

    if (dir->dData == NULL) {
        errno = EBADF;
A
arvinzzz 已提交
371
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394
    }

    lfs_t *lfs = (lfs_t *)dir->dMp->mData;
    lfs_dir_t *dirInfo = (lfs_dir_t *)dir->dData;

    ret = lfs_dir_read(lfs, dirInfo, &lfsInfo);
    if (ret == TRUE) {
        (void)strncpy_s(dent->d_name, sizeof(dent->d_name), lfsInfo.name, strlen(lfsInfo.name) + 1);
        if (lfsInfo.type == LFS_TYPE_DIR) {
            dent->d_type = DT_DIR;
        } else if (lfsInfo.type == LFS_TYPE_REG) {
            dent->d_type = DT_REG;
        }

        dent->d_reclen = lfsInfo.size;

        return LOS_OK;
    }

    if (ret != 0) {
        errno = LittlefsErrno(ret);
    }

A
arvinzzz 已提交
395
    return (int)LOS_NOK;
G
Guangyao Ma 已提交
396 397 398 399 400 401 402 403
}

int LfsClosedir(struct Dir *dir)
{
    int ret;

    if ((dir == NULL) || (dir->dMp == NULL) || (dir->dMp->mData == NULL)) {
        errno = EFAULT;
A
arvinzzz 已提交
404
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
405 406 407 408
    }

    if (dir->dData == NULL) {
        errno = EBADF;
A
arvinzzz 已提交
409
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
410 411 412 413 414 415 416 417
    }

    lfs_t *lfs = (lfs_t *)dir->dMp->mData;
    lfs_dir_t *dirInfo = (lfs_dir_t *)dir->dData;

    ret = lfs_dir_close(lfs, dirInfo);
    if (ret != 0) {
        errno = LittlefsErrno(ret);
A
arvinzzz 已提交
418
        ret = (int)LOS_NOK;
G
Guangyao Ma 已提交
419 420
    }

421
    LOSCFG_FS_FREE_HOOK(dirInfo);
G
Guangyao Ma 已提交
422 423 424 425 426 427 428 429 430 431 432 433 434
    dir->dData = NULL;

    return ret;
}

int LfsOpen(struct File *file, const char *pathName, int openFlag)
{
    int ret;
    lfs_file_t *lfsHandle = NULL;

    if ((pathName == NULL) || (file == NULL) || (file->fMp == NULL) ||
        (file->fMp->mData == NULL)) {
        errno = EFAULT;
A
arvinzzz 已提交
435
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
436 437
    }

438
    lfsHandle = (lfs_file_t *)LOSCFG_FS_MALLOC_HOOK(sizeof(lfs_file_t));
G
Guangyao Ma 已提交
439 440
    if (lfsHandle == NULL) {
        errno = ENOMEM;
A
arvinzzz 已提交
441
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
442 443 444 445 446
    }

    int lfsOpenFlag = ConvertFlagToLfsOpenFlag(openFlag);
    ret = lfs_file_open((lfs_t *)file->fMp->mData, lfsHandle, pathName, lfsOpenFlag);
    if (ret != 0) {
447
        LOSCFG_FS_FREE_HOOK(lfsHandle);
G
Guangyao Ma 已提交
448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466
        errno = LittlefsErrno(ret);
        goto errout;
    }

    file->fData = (void *)lfsHandle;
    return ret;

errout:
    return INVALID_FD;
}

int LfsRead(struct File *file, char *buf, size_t len)
{
    int ret;
    struct MountPoint *mp = NULL;
    lfs_file_t *lfsHandle = NULL;

    if (buf == NULL) {
        errno = EFAULT;
A
arvinzzz 已提交
467
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
468 469 470 471
    }

    if ((file == NULL) || (file->fData == NULL)) {
        errno = EBADF;
A
arvinzzz 已提交
472
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
473 474 475 476 477 478
    }

    lfsHandle = (lfs_file_t *)file->fData;
    mp = file->fMp;
    if ((mp == NULL) || (mp->mData == NULL)) {
        errno = EFAULT;
A
arvinzzz 已提交
479
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
480 481 482 483 484
    }

    ret = lfs_file_read((lfs_t *)mp->mData, lfsHandle, buf, len);
    if (ret < 0) {
        errno = LittlefsErrno(ret);
A
arvinzzz 已提交
485
        ret = (int)LOS_NOK;
G
Guangyao Ma 已提交
486 487 488 489 490 491 492 493 494 495 496 497
    }
    return ret;
}

int LfsWrite(struct File *file, const char *buf, size_t len)
{
    int ret;
    struct MountPoint *mp = NULL;
    lfs_file_t *lfsHandle = NULL;

    if (buf == NULL) {
        errno = EFAULT;
A
arvinzzz 已提交
498
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
499 500 501 502
    }

    if ((file == NULL) || (file->fData == NULL)) {
        errno = EBADF;
A
arvinzzz 已提交
503
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
504 505 506 507 508 509
    }

    lfsHandle = (lfs_file_t *)file->fData;
    mp = file->fMp;
    if ((mp == NULL) || (mp->mData == NULL)) {
        errno = EFAULT;
A
arvinzzz 已提交
510
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
511 512 513 514 515
    }

    ret = lfs_file_write((lfs_t *)mp->mData, lfsHandle, buf, len);
    if (ret < 0) {
        errno = LittlefsErrno(ret);
A
arvinzzz 已提交
516
        ret = (int)LOS_NOK;
G
Guangyao Ma 已提交
517 518 519 520 521 522 523 524 525 526 527 528
    }
    return ret;
}

off_t LfsSeek(struct File *file, off_t offset, int whence)
{
    off_t ret;
    struct MountPoint *mp = NULL;
    lfs_file_t *lfsHandle = NULL;

    if ((file == NULL) || (file->fData == NULL)) {
        errno = EBADF;
A
arvinzzz 已提交
529
        return (off_t)LOS_NOK;
G
Guangyao Ma 已提交
530 531 532 533 534 535
    }

    lfsHandle = (lfs_file_t *)file->fData;
    mp = file->fMp;
    if ((mp == NULL) || (mp->mData == NULL)) {
        errno = EFAULT;
A
arvinzzz 已提交
536
        return (off_t)LOS_NOK;
G
Guangyao Ma 已提交
537 538 539 540 541
    }

    ret = (off_t)lfs_file_seek((lfs_t *)mp->mData, lfsHandle, offset, whence);
    if (ret < 0) {
        errno = LittlefsErrno(ret);
A
arvinzzz 已提交
542
        ret = (off_t)LOS_NOK;
G
Guangyao Ma 已提交
543 544 545 546 547 548 549
    }

    return ret;
}

int LfsClose(struct File *file)
{
A
arvinzzz 已提交
550
    int ret;
G
Guangyao Ma 已提交
551 552 553 554 555
    struct MountPoint *mp = NULL;
    lfs_file_t *lfsHandle = NULL;

    if ((file == NULL) || (file->fData == NULL)) {
        errno = EBADF;
A
arvinzzz 已提交
556
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
557 558 559 560 561 562
    }

    lfsHandle = (lfs_file_t *)file->fData;
    mp = file->fMp;
    if ((mp == NULL) || (mp->mData == NULL)) {
        errno = EFAULT;
A
arvinzzz 已提交
563
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
564 565 566 567 568
    }

    ret = lfs_file_close((lfs_t *)mp->mData, lfsHandle);
    if (ret != 0) {
        errno = LittlefsErrno(ret);
A
arvinzzz 已提交
569
        ret = (int)LOS_NOK;
G
Guangyao Ma 已提交
570 571
    }

572
    LOSCFG_FS_FREE_HOOK(file->fData);
G
Guangyao Ma 已提交
573 574 575 576 577 578 579 580 581 582
    file->fData = NULL;
    return ret;
}

int LfsRename(struct MountPoint *mp, const char *oldName, const char *newName)
{
    int ret;

    if ((mp == NULL) || (oldName == NULL) || (newName == NULL)) {
        errno = EFAULT;
A
arvinzzz 已提交
583
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
584 585 586 587
    }

    if (mp->mData == NULL) {
        errno = ENOENT;
A
arvinzzz 已提交
588
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
589 590 591 592 593
    }

    ret = lfs_rename((lfs_t *)mp->mData, oldName, newName);
    if (ret != 0) {
        errno = LittlefsErrno(ret);
A
arvinzzz 已提交
594
        ret = (int)LOS_NOK;
G
Guangyao Ma 已提交
595 596 597 598 599 600 601 602 603 604 605 606
    }

    return ret;
}

int LfsStat(struct MountPoint *mp, const char *path, struct stat *buf)
{
    int ret;
    struct lfs_info info;

    if ((mp == NULL) || (path == NULL) || (buf == NULL)) {
        errno = EFAULT;
A
arvinzzz 已提交
607
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
608 609 610 611
    }

    if (mp->mData == NULL) {
        errno = ENOENT;
A
arvinzzz 已提交
612
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
613 614 615 616 617 618 619 620 621 622 623 624
    }

    ret = lfs_stat((lfs_t *)mp->mData, path, &info);
    if (ret == 0) {
        buf->st_size = info.size;
        if (info.type == LFS_TYPE_REG) {
            buf->st_mode = S_IFREG;
        } else {
            buf->st_mode = S_IFDIR;
        }
    } else {
        errno = LittlefsErrno(ret);
A
arvinzzz 已提交
625
        ret = (int)LOS_NOK;
G
Guangyao Ma 已提交
626 627 628 629 630 631 632 633 634 635 636 637
    }

    return ret;
}

int LfsSync(struct File *file)
{
    int ret;
    struct MountPoint *mp = NULL;

    if ((file == NULL) || (file->fData == NULL)) {
        errno = EBADF;
A
arvinzzz 已提交
638
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
639 640 641 642
    }

    if ((file->fMp == NULL) || (file->fMp->mData == NULL)) {
        errno = EFAULT;
A
arvinzzz 已提交
643
        return (int)LOS_NOK;
G
Guangyao Ma 已提交
644 645 646 647 648 649
    }

    mp = file->fMp;
    ret = lfs_file_sync((lfs_t *)mp->mData, (lfs_file_t *)file->fData);
    if (ret != 0) {
        errno = LittlefsErrno(ret);
A
arvinzzz 已提交
650
        ret = (int)LOS_NOK;
G
Guangyao Ma 已提交
651 652 653 654
    }
    return ret;
}

655 656 657 658
int LfsFormat(const char *partName, void *privData)
{
    int ret;
    lfs_t lfs = {0};
W
wangchen 已提交
659
    struct lfs_config cfg = {0};
660 661 662

    (void)partName;

W
wangchen 已提交
663
    LfsConfigAdapter((struct PartitionCfg *)privData, &cfg);
664

W
wangchen 已提交
665
    ret = lfs_format(&lfs, &cfg);
666 667
    if (ret != 0) {
        errno = LittlefsErrno(ret);
668
        ret = (int)LOS_NOK;
669 670 671 672
    }
    return ret;
}

G
Guangyao Ma 已提交
673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700
static struct MountOps g_lfsMnt = {
    .mount = LfsMount,
    .umount = LfsUmount,
    .umount2 = NULL,
    .statfs = NULL,
};

static struct FileOps g_lfsFops = {
    .open = LfsOpen,
    .close = LfsClose,
    .read = LfsRead,
    .write = LfsWrite,
    .lseek = LfsSeek,
    .stat = LfsStat,
    .truncate = NULL,
    .unlink = LfsUnlink,
    .rename = LfsRename,
    .ioctl = NULL, /* not support */
    .sync = LfsSync,
    .rmdir = LfsRmdir,
    .opendir = LfsOpendir,
    .readdir = LfsReaddir,
    .closedir = LfsClosedir,
    .mkdir = LfsMkdir,
};

static struct FsManagement g_lfsMgt = {
    .fdisk = NULL,
701
    .format = LfsFormat,
G
Guangyao Ma 已提交
702 703 704 705 706 707
};

void LfsInit(void)
{
    (void)OsFsRegister("littlefs", &g_lfsMnt, &g_lfsFops, &g_lfsMgt);
}