From de33f86ae32e88d0c8587ac7f2c33482f882bc5b Mon Sep 17 00:00:00 2001 From: Xiang Xiao Date: Mon, 4 May 2020 21:49:07 +0800 Subject: [PATCH] fs: Add nx_mount/nx_umount2 function Signed-off-by: Xiang Xiao --- fs/mount/fs_mount.c | 91 +++++++++++++++++++++++++++---------------- fs/mount/fs_umount2.c | 67 ++++++++++++++++++++----------- include/nuttx/fs/fs.h | 44 +++++++++++++++++++++ include/sys/mount.h | 2 +- 4 files changed, 148 insertions(+), 56 deletions(-) diff --git a/fs/mount/fs_mount.c b/fs/mount/fs_mount.c index e710e3c77ed..3e33c753939 100644 --- a/fs/mount/fs_mount.c +++ b/fs/mount/fs_mount.c @@ -246,32 +246,23 @@ mount_findfs(FAR const struct fsmap_t *fstab, FAR const char *filesystemtype) ****************************************************************************/ /**************************************************************************** - * Name: mount + * Name: nx_mount * * Description: - * mount() attaches the filesystem specified by the 'source' block device - * name into the root file system at the path specified by 'target.' + * nx_mount() is similar to the standard 'mount' interface except that is + * not a cancellation point and it does not modify the errno variable. + * + * nx_mount() is an internal NuttX interface and should not be called from + * applications. * * Returned Value: - * Zero is returned on success; -1 is returned on an error and errno is - * set appropriately: - * - * EACCES A component of a path was not searchable or mounting a read-only - * filesystem was attempted without giving the MS_RDONLY flag. - * EBUSY 'source' is already mounted. - * EFAULT One of the pointer arguments points outside the user address - * space. - * EINVAL 'source' had an invalid superblock. - * ENODEV 'filesystemtype' not configured - * ENOENT A pathname was empty or had a nonexistent component. - * ENOMEM Could not allocate a memory to copy filenames or data into. - * ENOTBLK 'source' is not a block device + * Zero is returned on success; a negated value is returned on any failure. * ****************************************************************************/ -int mount(FAR const char *source, FAR const char *target, - FAR const char *filesystemtype, unsigned long mountflags, - FAR const void *data) +int nx_mount(FAR const char *source, FAR const char *target, + FAR const char *filesystemtype, unsigned long mountflags, + FAR const void *data) { #if defined(BDFS_SUPPORT) || defined(MDFS_SUPPORT) || defined(NODFS_SUPPORT) #if defined(BDFS_SUPPORT) || defined(MDFS_SUPPORT) @@ -283,14 +274,13 @@ int mount(FAR const char *source, FAR const char *target, struct inode_search_s desc; #endif void *fshandle; - int errcode; int ret; /* Verify required pointer arguments */ DEBUGASSERT(target && filesystemtype); - /* Find the specified filesystem. Try the block driver file systems first */ + /* Find the specified filesystem. Try the block driver filesystems first */ #ifdef BDFS_SUPPORT if (source != NULL && @@ -304,7 +294,7 @@ int mount(FAR const char *source, FAR const char *target, ferr("ERROR: Failed to find block based file system %s\n", filesystemtype); - errcode = ENODEV; + ret = -ENODEV; goto errout_with_inode; } } @@ -321,7 +311,7 @@ int mount(FAR const char *source, FAR const char *target, ferr("ERROR: Failed to find MTD based file system %s\n", filesystemtype); - errcode = ENODEV; + ret = -ENODEV; goto errout_with_inode; } } @@ -336,14 +326,13 @@ int mount(FAR const char *source, FAR const char *target, { ferr("ERROR: Failed to find block driver %s\n", source); - errcode = ENOTBLK; + ret = -ENOTBLK; goto errout; } ret = inode_semtake(); if (ret < 0) { - errcode = -ret; goto errout_with_inode; } @@ -369,7 +358,7 @@ int mount(FAR const char *source, FAR const char *target, if (INODE_IS_SPECIAL(mountpt_inode)) { ferr("ERROR: target %s exists and is a special node\n", target); - errcode = -ENOTDIR; + ret = -ENOTDIR; inode_release(mountpt_inode); goto errout_with_semaphore; } @@ -398,7 +387,6 @@ int mount(FAR const char *source, FAR const char *target, */ ferr("ERROR: Failed to reserve inode for target %s\n", target); - errcode = -ret; goto errout_with_semaphore; } } @@ -413,7 +401,7 @@ int mount(FAR const char *source, FAR const char *target, /* The filesystem does not support the bind operation ??? */ ferr("ERROR: Filesystem does not support bind\n"); - errcode = EINVAL; + ret = -EINVAL; goto errout_with_mountpt; } @@ -453,7 +441,6 @@ int mount(FAR const char *source, FAR const char *target, } #endif - errcode = -ret; goto errout_with_mountpt; } @@ -510,13 +497,51 @@ errout_with_inode: #endif errout: - set_errno(errcode); - return ERROR; + return ret; #else ferr("ERROR: No filesystems enabled\n"); - set_errno(ENOSYS); - return ERROR; + return -ENOSYS; #endif /* BDFS_SUPPORT || MDFS_SUPPORT || NODFS_SUPPORT */ } +/**************************************************************************** + * Name: mount + * + * Description: + * mount() attaches the filesystem specified by the 'source' block device + * name into the root file system at the path specified by 'target.' + * + * Returned Value: + * Zero is returned on success; -1 is returned on an error and errno is + * set appropriately: + * + * EACCES A component of a path was not searchable or mounting a read-only + * filesystem was attempted without giving the MS_RDONLY flag. + * EBUSY 'source' is already mounted. + * EFAULT One of the pointer arguments points outside the user address + * space. + * EINVAL 'source' had an invalid superblock. + * ENODEV 'filesystemtype' not configured + * ENOENT A pathname was empty or had a nonexistent component. + * ENOMEM Could not allocate a memory to copy filenames or data into. + * ENOTBLK 'source' is not a block device + * + ****************************************************************************/ + +int mount(FAR const char *source, FAR const char *target, + FAR const char *filesystemtype, unsigned long mountflags, + FAR const void *data) +{ + int ret; + + ret = nx_mount(source, target, filesystemtype, mountflags, data); + if (ret < 0) + { + set_errno(-ret); + ret = ERROR; + } + + return ret; +} + diff --git a/fs/mount/fs_umount2.c b/fs/mount/fs_umount2.c index 63fc5ac7dfb..9796a737e8d 100644 --- a/fs/mount/fs_umount2.c +++ b/fs/mount/fs_umount2.c @@ -38,36 +38,32 @@ ****************************************************************************/ /**************************************************************************** - * Name: umount2 + * Name: nx_umount2 * * Description: - * umount() detaches the filesystem mounted at the path specified by - * 'target.' + * nx_umount2() is similar to the standard 'umount2' interface except that + * is not a cancellation point and it does not modify the errno variable. + * + * nx_umount2() is an internal NuttX interface and should not be called + * from applications. * * Returned Value: - * Zero is returned on success; -1 is returned on an error and errno is - * set appropriately: - * - * EACCES A component of a path was not searchable or mounting a read-only - * filesystem was attempted without giving the MS_RDONLY flag. - * EBUSY The target could not be unmounted because it is busy. - * EFAULT The pointer argument points outside the user address space. + * Zero is returned on success; a negated value is returned on any failure. * ****************************************************************************/ -int umount2(FAR const char *target, unsigned int flags) +int nx_umount2(FAR const char *target, unsigned int flags) { FAR struct inode *mountpt_inode; FAR struct inode *blkdrvr_inode = NULL; struct inode_search_s desc; - int errcode = OK; int ret; /* Verify required pointer arguments */ if (!target) { - errcode = EFAULT; + ret = -EFAULT; goto errout; } @@ -78,7 +74,6 @@ int umount2(FAR const char *target, unsigned int flags) ret = inode_find(&desc); if (ret < 0) { - errcode = ENOENT; goto errout_with_search; } @@ -91,7 +86,7 @@ int umount2(FAR const char *target, unsigned int flags) if (!INODE_IS_MOUNTPT(mountpt_inode)) { - errcode = EINVAL; + ret = -EINVAL; goto errout_with_mountpt; } @@ -103,7 +98,7 @@ int umount2(FAR const char *target, unsigned int flags) { /* The filesystem does not support the unbind operation ??? */ - errcode = EINVAL; + ret = -EINVAL; goto errout_with_mountpt; } @@ -117,7 +112,6 @@ int umount2(FAR const char *target, unsigned int flags) ret = inode_semtake(); if (ret < 0) { - errcode = -ret; goto errout_with_mountpt; } @@ -127,12 +121,11 @@ int umount2(FAR const char *target, unsigned int flags) { /* The inode is unhappy with the blkdrvr for some reason */ - errcode = -ret; goto errout_with_semaphore; } else if (ret > 0) { - errcode = EBUSY; + ret = -EBUSY; goto errout_with_semaphore; } @@ -171,7 +164,6 @@ int umount2(FAR const char *target, unsigned int flags) if (ret != OK && ret != -EBUSY) { - errcode = -ret; goto errout_with_mountpt; } @@ -209,6 +201,37 @@ errout_with_search: RELEASE_SEARCH(&desc); errout: - set_errno(errcode); - return ERROR; + return ret; +} + +/**************************************************************************** + * Name: umount2 + * + * Description: + * umount() detaches the filesystem mounted at the path specified by + * 'target.' + * + * Returned Value: + * Zero is returned on success; -1 is returned on an error and errno is + * set appropriately: + * + * EACCES A component of a path was not searchable or mounting a read-only + * filesystem was attempted without giving the MS_RDONLY flag. + * EBUSY The target could not be unmounted because it is busy. + * EFAULT The pointer argument points outside the user address space. + * + ****************************************************************************/ + +int umount2(FAR const char *target, unsigned int flags) +{ + int ret; + + ret = nx_umount2(target, flags); + if (ret < 0) + { + set_errno(-ret); + ret = ERROR; + } + + return ret; } diff --git a/include/nuttx/fs/fs.h b/include/nuttx/fs/fs.h index a1806be6e3d..7c6cf69b824 100644 --- a/include/nuttx/fs/fs.h +++ b/include/nuttx/fs/fs.h @@ -188,6 +188,10 @@ #define OPEN_SETFD(f) ((f) | OPEN_MAGIC) #define OPEN_GETFD(r) ((r) & OPEN_MASK) +/* nx_umount() is equivalent to nx_umount2() with flags = 0 */ + +#define umount(t) umount2(t,0) + /**************************************************************************** * Public Type Definitions ****************************************************************************/ @@ -678,6 +682,46 @@ int register_mtdpartition(FAR const char *partition, int unregister_mtddriver(FAR const char *path); #endif +/**************************************************************************** + * Name: nx_mount + * + * Description: + * nx_mount() is similar to the standard 'mount' interface except that is + * not a cancellation point and it does not modify the errno variable. + * + * nx_mount() is an internal NuttX interface and should not be called from + * applications. + * + * Returned Value: + * Zero is returned on success; a negated value is returned on any failure. + * + ****************************************************************************/ + +#ifndef CONFIG_DISABLE_MOUNTPOINT +int nx_mount(FAR const char *source, FAR const char *target, + FAR const char *filesystemtype, unsigned long mountflags, + FAR const void *data); +#endif + +/**************************************************************************** + * Name: nx_umount2 + * + * Description: + * nx_umount2() is similar to the standard 'umount2' interface except that + * is not a cancellation point and it does not modify the errno variable. + * + * nx_umount2() is an internal NuttX interface and should not be called + * from applications. + * + * Returned Value: + * Zero is returned on success; a negated value is returned on any failure. + * + ****************************************************************************/ + +#ifndef CONFIG_DISABLE_MOUNTPOINT +int nx_umount2(FAR const char *target, unsigned int flags); +#endif + /**************************************************************************** * Name: files_initlist * diff --git a/include/sys/mount.h b/include/sys/mount.h index 32b1ccfb3cc..aef24a87a37 100644 --- a/include/sys/mount.h +++ b/include/sys/mount.h @@ -81,7 +81,7 @@ #define MNT_EXPIRE (1 << 2) #define UMOUNT_NOFOLLOW (0) -/* mount() is equivalent to umount2() with flags = 0 */ +/* umount() is equivalent to umount2() with flags = 0 */ #define umount(t) umount2(t,0)