diff --git a/fs/vfs/BUILD.gn b/fs/vfs/BUILD.gn index 1a3c48c1e9eb67f1155a4090ef4043b00922f50c..e84294485803e46f1a05f66da3f8e9e8e99baef6 100644 --- a/fs/vfs/BUILD.gn +++ b/fs/vfs/BUILD.gn @@ -110,7 +110,10 @@ kernel_module(module_name) { "$LITEOSTOPDIR/fs/vfs/vnode_hash.c", ] - include_dirs = [ "$LITEOSTOPDIR/syscall" ] + include_dirs = [ + "$LITEOSTOPDIR/syscall", + "$LITEOSTOPDIR/fs/zpfs/include", + ] public_configs = [ ":public" ] } diff --git a/fs/vfs/Makefile b/fs/vfs/Makefile index 744fbed58a69b3cba92d9e6ffdc6d8226d9279bf..1db706b07dcdc95b5be7af4678800f18a71e8f38 100644 --- a/fs/vfs/Makefile +++ b/fs/vfs/Makefile @@ -101,6 +101,7 @@ LOCAL_INCLUDE := \ -I $(LITEOSTOPDIR)/drivers/mtd/multi_partition/include\ -I $(LITEOSTOPDIR)/fs/vfs/include/operation\ -I $(LITEOSTOPDIR)/syscall\ + -I $(LITEOSTOPDIR)/fs/zpfs/include ifeq ($(LOSCFG_FS_FAT), y) LOCAL_INCLUDE += -I $(LITEOSTHIRDPARTY)/FatFs/source diff --git a/fs/vfs/include/vnode.h b/fs/vfs/include/vnode.h index aeb4a7bd2ffadf49952fff36b991402bac5f45d0..83990fe5d38852fece67a8bce290299214260733 100644 --- a/fs/vfs/include/vnode.h +++ b/fs/vfs/include/vnode.h @@ -159,6 +159,7 @@ int VnodeDevInit(void); int VnodeAlloc(struct VnodeOps *vop, struct Vnode **vnode); int VnodeFree(struct Vnode *vnode); int VnodeLookup(const char *path, struct Vnode **vnode, uint32_t flags); +int VnodeLookupAt(const char *path, struct Vnode **vnode, uint32_t flags, struct Vnode *orgVnode); int VnodeHold(void); int VnodeDrop(void); void VnodeRefDec(struct Vnode *vnode); diff --git a/fs/vfs/vnode.c b/fs/vfs/vnode.c index ae00e893de6edcf178bac42c6b23cb4b317baf1a..056720d178e077b9c401ded08041fe6ab17852d0 100644 --- a/fs/vfs/vnode.c +++ b/fs/vfs/vnode.c @@ -360,14 +360,21 @@ STEP_FINISH: return ret; } -int VnodeLookup(const char *path, struct Vnode **result, uint32_t flags) +int VnodeLookupAt(const char *path, struct Vnode **result, uint32_t flags, struct Vnode *orgVnode) { + int ret; struct Vnode *startVnode = NULL; char *normalizedPath = NULL; - int ret = PreProcess(path, &startVnode, &normalizedPath); - if (ret != LOS_OK) { - goto OUT_FREE_PATH; + if (orgVnode != NULL) { + startVnode = orgVnode; + normalizedPath = strdup(path); + } else { + ret = PreProcess(path, &startVnode, &normalizedPath); + if (ret != LOS_OK) { + PRINT_ERR("[VFS]lookup failed, invalid path err = %d\n", ret); + goto OUT_FREE_PATH; + } } if (normalizedPath[0] == '/' && normalizedPath[1] == '\0') { @@ -404,6 +411,11 @@ OUT_FREE_PATH: return ret; } +int VnodeLookup(const char *path, struct Vnode **vnode, uint32_t flags) +{ + return VnodeLookupAt(path, vnode, flags, NULL); +} + static void ChangeRootInternal(struct Vnode *rootOld, char *dirname) { int ret; diff --git a/fs/zpfs/BUILD.gn b/fs/zpfs/BUILD.gn index e0cc31e2c2c55febf3c47c0a481ca341a853213d..bf2dda8617ecdb4fa5686236d36c431c5d3d8bd0 100644 --- a/fs/zpfs/BUILD.gn +++ b/fs/zpfs/BUILD.gn @@ -33,7 +33,9 @@ module_switch = defined(LOSCFG_FS_ZPFS) module_name = get_path_info(rebase_path("."), "name") kernel_module(module_name) { sources = [ - "vfs_zpfs.c", - "zpfs.c", + "src/vfs_zpfs.c", + "src/zpfs.c", ] + + include_dirs = [ "include" ] } diff --git a/fs/zpfs/Makefile b/fs/zpfs/Makefile index d703d77315c0c058eb44760cadadfcaae28ce076..a3339c33eadf1c2321f73d112eb7d6205dff5bed 100644 --- a/fs/zpfs/Makefile +++ b/fs/zpfs/Makefile @@ -31,14 +31,10 @@ include $(LITEOSTOPDIR)/config.mk MODULE_NAME := $(notdir $(shell pwd)) -LOCAL_SRCS := $(wildcard *.c) -LOCAL_INCLUDE = \ - -I $(LITEOSTOPDIR)/fs/include \ - -I $(LITEOSTOPDIR)/fs/zpfs \ - -I $(LITEOSTOPDIR)/../../third_party/NuttX/liteos/fs/include\ - -I $(LITEOSTOPDIR)/../../third_party/NuttX/liteos/fs/include/inode +LOCAL_SRCS := $(wildcard src/*.c) +LOCAL_INCLUDE := \ + -I $(LITEOSTOPDIR)/fs/zpfs/include -LOCAL_FLAGS := $(LITEOS_GCOV_OPTS) +LOCAL_FLAGS := $(LOCAL_INCLUDE) $(LITEOS_GCOV_OPTS) include $(MODULE) - diff --git a/kernel/common/rootfs/los_rootfs.c b/kernel/common/rootfs/los_rootfs.c index 7a7a74a9398de6b4ee09e350614ad9f231e329e5..0c53cf5d55b70f97855da882f92fe143b48d413b 100644 --- a/kernel/common/rootfs/los_rootfs.c +++ b/kernel/common/rootfs/los_rootfs.c @@ -81,6 +81,17 @@ STATIC INT32 AddEmmcParts(INT32 rootAddr, INT32 rootSize, INT32 userAddr, INT32 return LOS_NOK; } +#ifdef LOSCFG_PLATFORM_PATCHFS + UINT64 patchStartCnt = userAddr / EMMC_SEC_SIZE; + UINT64 patchSizeCnt = PATCH_SIZE / EMMC_SEC_SIZE; + ret = add_mmc_partition(emmc, patchStartCnt, patchSizeCnt); + if (ret != LOS_OK) { + PRINT_ERR("Failed to add mmc patch partition!\n"); + return LOS_NOK; + } + userAddr += PATCH_SIZE; +#endif + UINT64 storageStartCnt = userAddr / EMMC_SEC_SIZE; UINT64 storageSizeCnt = userSize / EMMC_SEC_SIZE; UINT64 userdataStartCnt = storageStartCnt + storageSizeCnt; @@ -235,6 +246,35 @@ STATIC INT32 MountPartitions(CHAR *fsType, UINT32 mountFlags) return ret; } +#ifdef LOSCFG_STORAGE_EMMC +#ifdef LOSCFG_PLATFORM_PATCHFS + /* Mount patch */ + ret = mkdir(PATCH_DIR_NAME, DEFAULT_MOUNT_DIR_MODE); + if ((ret != LOS_OK) && ((err = get_errno()) != EEXIST)) { + PRINT_ERR("Failed to mkdir %s, errno %d: %s\n", PATCH_DIR_NAME, err, strerror(err)); + return ret; + } + + ret = mount(PATCH_DEV_NAME, PATCH_DIR_NAME, fsType, 0, DEFAULT_MOUNT_DATA); + if ((ret != LOS_OK) && ((err = get_errno()) == ENOTSUP)) { + ret = format(PATCH_DEV_NAME, 0, FM_FAT32); + if (ret != LOS_OK) { + PRINT_ERR("Failed to format %s\n", PATCH_DEV_NAME); + return ret; + } + + ret = mount(PATCH_DEV_NAME, PATCH_DIR_NAME, fsType, 0, DEFAULT_MOUNT_DATA); + if (ret != LOS_OK) { + err = get_errno(); + } + } + if (ret != LOS_OK) { + PRINT_ERR("Failed to mount %s, errno %d: %s\n", PATCH_DIR_NAME, err, strerror(err)); + return ret; + } +#endif +#endif + /* Mount userfs */ ret = mkdir(STORAGE_DIR_NAME, DEFAULT_MOUNT_DIR_MODE); if ((ret != LOS_OK) && ((err = get_errno()) != EEXIST)) { diff --git a/kernel/common/rootfs/los_rootfs.h b/kernel/common/rootfs/los_rootfs.h index 9f3aebefbd0eda5bf0eb7e3caadff921b625717d..f56ee340f9e4be352ef3538092a0016fa076ee0f 100644 --- a/kernel/common/rootfs/los_rootfs.h +++ b/kernel/common/rootfs/los_rootfs.h @@ -38,6 +38,9 @@ #define STORAGE_DIR_NAME "/storage" #ifdef LOSCFG_STORAGE_EMMC #define USERDATA_DIR_NAME "/userdata" +#ifdef LOSCFG_PLATFORM_PATCHFS +#define PATCH_DIR_NAME "/patch" +#endif #endif #define DEFAULT_MOUNT_DIR_MODE 0755 #define DEFAULT_MOUNT_DATA NULL @@ -64,11 +67,20 @@ #define USERFS_SIZE (CFIFLASH_CAPACITY - ROOTFS_ADDR - ROOTFS_SIZE) #elif defined (LOSCFG_STORAGE_EMMC) #define ROOT_DEV_NAME "/dev/mmcblk0p0" +#ifdef LOSCFG_PLATFORM_PATCHFS +#define PATCH_DEV_NAME "/dev/mmcblk0p1" +#define USER_DEV_NAME "/dev/mmcblk0p2" +#define USERDATA_DEV_NAME "/dev/mmcblk0p3" +#else #define USER_DEV_NAME "/dev/mmcblk0p1" #define USERDATA_DEV_NAME "/dev/mmcblk0p2" +#endif #define ROOTFS_ADDR 0xA00000 #define ROOTFS_SIZE 0x1400000 #define USERFS_SIZE 0x3200000 +#ifdef LOSCFG_PLATFORM_PATCHFS +#define PATCH_SIZE 0x200000 +#endif #ifdef DEFAULT_MOUNT_DIR_MODE #undef DEFAULT_MOUNT_DIR_MODE #endif