提交 7b7d64cc 编写于 作者: O openharmony_ci 提交者: Gitee

!404 mount接口支持MS_RDONLY flag

Merge pull request !404 from Far/master
......@@ -46,6 +46,7 @@
#include "los_tables.h"
#include "user_copy.h"
#include "los_vm_filemap.h"
#include "los_hash.h"
#include <time.h>
#include <errno.h>
#include <dirent.h>
......@@ -53,7 +54,7 @@
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include "los_hash.h"
#include <fcntl.h>
struct VnodeOps fatfs_vops; /* forward define */
......@@ -190,7 +191,7 @@ static int fatfs_sync(unsigned long mountflags, FATFS *fs)
{
#ifdef LOSCFG_FS_FAT_CACHE
los_part *part = NULL;
if (mountflags != MS_NOSYNC) {
if (!(mountflags & (MS_NOSYNC | MS_RDONLY))) {
part = get_part((INT)fs->pdrv);
if (part == NULL) {
return -ENODEV;
......@@ -736,6 +737,7 @@ off64_t fatfs_lseek64(struct file *filep, off64_t offset, int whence)
struct Vnode *vp = filep->f_vnode;
DIR_FILE *dfp = (DIR_FILE *)vp->data;
FILINFO *finfo = &(dfp->fno);
struct Mount *mount = vp->originMount;
FSIZE_t fpos;
FRESULT result;
int ret;
......@@ -773,6 +775,17 @@ off64_t fatfs_lseek64(struct file *filep, off64_t offset, int whence)
if (ret == FALSE) {
return -EBUSY;
}
if (fpos > finfo->fsize) {
if ((filep->f_oflags & O_ACCMODE) == O_RDONLY) {
result = FR_DENIED;
goto ERROR_EXIT;
}
if (mount->mountFlags & MS_RDONLY) {
result = FR_WRITE_PROTECTED;
goto ERROR_EXIT;
}
}
fp->obj.sclust = finfo->sclst;
fp->obj.objsize = finfo->fsize;
......
......@@ -123,7 +123,7 @@ int VfsJffs2Bind(struct Mount *mnt, struct Vnode *blkDriver, const void *data)
partNo = p->patitionnum;
ret = jffs2_mount(partNo, &rootNode);
ret = jffs2_mount(partNo, &rootNode, mnt->mountFlags);
if (ret != 0) {
LOS_MuxUnlock(&g_jffs2FsLock);
return ret;
......
......@@ -41,6 +41,8 @@
#include "stdlib.h"
#include "sys/stat.h"
#include "vnode.h"
#include "fs/mount.h"
#include <fcntl.h>
/****************************************************************************
* Static Functions
......@@ -69,6 +71,11 @@ int chattr(const char *pathname, struct IATTR *attr)
goto errout_with_lock;
}
if ((vnode->originMount) && (vnode->originMount->mountFlags & MS_RDONLY)) {
ret = -EROFS;
goto errout_with_lock;
}
/* The way we handle the stat depends on the type of vnode that we
* are dealing with.
*/
......
......@@ -37,9 +37,11 @@
#include "vfs_config.h"
#include "sys/stat.h"
#include "vnode.h"
#include "fs/mount.h"
#include "string.h"
#include "stdlib.h"
#include "utime.h"
#include <fcntl.h>
/****************************************************************************
* Global Functions
......@@ -79,6 +81,12 @@ int utime(const char *path, const struct utimbuf *ptimes)
goto errout_with_path;
}
if ((vnode->originMount) && (vnode->originMount->mountFlags & MS_RDONLY)) {
VnodeDrop();
ret = -EROFS;
goto errout_with_path;
}
if (vnode->vop && vnode->vop->Chattr) {
if (ptimes == NULL) {
/* get current seconds */
......
......@@ -156,10 +156,11 @@ STATIC INT32 AddPartitions(CHAR *dev, UINT64 rootAddr, UINT64 rootSize, UINT64 u
}
STATIC INT32 ParseRootArgs(CHAR **dev, CHAR **fstype, UINT64 *rootAddr, UINT64 *rootSize) {
STATIC INT32 ParseRootArgs(CHAR **dev, CHAR **fstype, UINT64 *rootAddr, UINT64 *rootSize, UINT32 *mountFlags) {
INT32 ret;
CHAR *rootAddrStr;
CHAR *rootSizeStr;
CHAR *rwTag;
ret = LOS_GetArgValue("root", dev);
if (ret != LOS_OK) {
......@@ -186,6 +187,13 @@ STATIC INT32 ParseRootArgs(CHAR **dev, CHAR **fstype, UINT64 *rootAddr, UINT64 *
} else {
*rootSize = LOS_SizeStrToNum(rootSizeStr);
}
ret = LOS_GetArgValue("ro", &rwTag);
if (ret == LOS_OK) {
*mountFlags = MS_RDONLY;
} else {
*mountFlags = 0;
}
return LOS_OK;
}
......@@ -212,12 +220,12 @@ STATIC INT32 ParseUserArgs(UINT64 rootAddr, UINT64 rootSize, UINT64 *userAddr, U
return LOS_OK;
}
STATIC INT32 MountPartitions(CHAR *fsType) {
STATIC INT32 MountPartitions(CHAR *fsType, UINT32 mountFlags) {
INT32 ret;
INT32 err;
/* Mount rootfs */
ret = mount(ROOT_DEV_NAME, ROOT_DIR_NAME, fsType, MS_RDONLY, NULL);
ret = mount(ROOT_DEV_NAME, ROOT_DIR_NAME, fsType, mountFlags, NULL);
if (ret != LOS_OK) {
err = get_errno();
PRINT_ERR("Failed to mount %s, rootDev %s, errno %d: %s\n", ROOT_DIR_NAME, ROOT_DEV_NAME, err, strerror(err));
......@@ -291,8 +299,9 @@ INT32 OsMountRootfs() {
UINT64 rootSize;
UINT64 userAddr;
UINT64 userSize;
UINT32 mountFlags;
ret = ParseRootArgs(&dev, &fstype, &rootAddr, &rootSize);
ret = ParseRootArgs(&dev, &fstype, &rootAddr, &rootSize, &mountFlags);
if (ret != LOS_OK) {
return ret;
}
......@@ -312,7 +321,7 @@ INT32 OsMountRootfs() {
return ret;
}
ret = MountPartitions(fstype);
ret = MountPartitions(fstype, mountFlags);
if (ret != LOS_OK) {
return ret;
}
......
......@@ -790,6 +790,9 @@ sources_full = [
"jffs/full/It_vfs_test_symlink_002.cpp",
"jffs/full/It_vfs_test_symlink_003.cpp",
"jffs/full/It_vfs_test_symlinkat_001.cpp",
"jffs/full/It_vfs_test_mount_rdonly_001.cpp",
"jffs/full/It_vfs_test_mount_rdonly_002.cpp",
"jffs/full/It_vfs_test_mount_rdonly_003.cpp",
]
if (LOSCFG_USER_TEST_LEVEL >= TEST_LEVEL_LOW) {
......
......@@ -962,6 +962,9 @@ VOID ItFsTestSymlink001(VOID);
VOID ItFsTestSymlink002(VOID);
VOID ItFsTestSymlink003(VOID);
VOID ItFsTestSymlinkat001(VOID);
VOID ItFsTestMountRdonly001(VOID);
VOID ItFsTestMountRdonly002(VOID);
VOID ItFsTestMountRdonly003(VOID);
#endif
#if defined(LOSCFG_USER_TESTSUIT_SHELL)
......
/*
* Copyright (c) 2021-2021 Huawei Device Co., Ltd. All rights reserved.
*
* 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.
*/
#include "It_vfs_jffs.h"
static UINT32 testcase(VOID)
{
INT32 fd = -1;
INT32 ret;
CHAR pathname1[JFFS_STANDARD_NAME_LENGTH] = { JFFS_PATH_NAME0 };
CHAR pathname2[JFFS_STANDARD_NAME_LENGTH] = { JFFS_PATH_NAME01 };
fd = creat(pathname1, 0777);
ICUNIT_GOTO_NOT_EQUAL(fd, JFFS_IS_ERROR, fd, EXIT);
ret = close(fd);
ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT4);
ret = umount(JFFS_MAIN_DIR0);
ICUNIT_GOTO_NOT_EQUAL(ret, JFFS_IS_ERROR, ret, EXIT3);
ret = mount(JFFS_DEV_PATH0, JFFS_MAIN_DIR0, JFFS_FILESYS_TYPE, MS_RDONLY, NULL);
ICUNIT_GOTO_NOT_EQUAL(ret, JFFS_IS_ERROR, ret, EXIT2);
fd = open(pathname1, O_RDWR);
ICUNIT_GOTO_EQUAL(fd, JFFS_IS_ERROR, fd, EXIT4);
ret = symlink(pathname1, pathname2);
ICUNIT_GOTO_EQUAL(ret, JFFS_IS_ERROR, ret, EXIT5);
ret = rename(pathname1, pathname2);
ICUNIT_GOTO_EQUAL(ret, JFFS_IS_ERROR, ret, EXIT5);
ret = unlink(pathname1);
ICUNIT_GOTO_EQUAL(ret, JFFS_IS_ERROR, ret, EXIT3);
ret = umount(JFFS_MAIN_DIR0);
ICUNIT_GOTO_NOT_EQUAL(ret, JFFS_IS_ERROR, ret, EXIT3);
ret = mount(JFFS_DEV_PATH0, JFFS_MAIN_DIR0, JFFS_FILESYS_TYPE, 0, NULL);
ICUNIT_GOTO_NOT_EQUAL(ret, JFFS_IS_ERROR, ret, EXIT2);
ret = unlink(pathname1);
ICUNIT_GOTO_NOT_EQUAL(ret, JFFS_IS_ERROR, ret, EXIT1);
return JFFS_NO_ERROR;
EXIT5:
unlink(pathname2);
goto EXIT3;
EXIT4:
close(fd);
EXIT3:
umount(JFFS_MAIN_DIR0);
EXIT2:
mount(JFFS_DEV_PATH0, JFFS_MAIN_DIR0, JFFS_FILESYS_TYPE, 0, NULL);
EXIT1:
unlink(pathname1);
EXIT:
return JFFS_NO_ERROR;
}
VOID ItFsTestMountRdonly001(VOID)
{
TEST_ADD_CASE("IT_FS_TEST_MOUNT_RDONLY_001", testcase, TEST_VFS, TEST_JFFS, TEST_LEVEL0, TEST_FUNCTION);
}
\ No newline at end of file
/*
* Copyright (c) 2021-2021 Huawei Device Co., Ltd. All rights reserved.
*
* 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.
*/
#include "It_vfs_jffs.h"
static UINT32 testcase(VOID)
{
INT32 fd = -1;
INT32 ret;
CHAR pathname1[JFFS_STANDARD_NAME_LENGTH] = { JFFS_PATH_NAME0 };
ret = umount(JFFS_MAIN_DIR0);
ICUNIT_GOTO_NOT_EQUAL(ret, JFFS_IS_ERROR, ret, EXIT);
ret = mount(JFFS_DEV_PATH0, JFFS_MAIN_DIR0, JFFS_FILESYS_TYPE, MS_RDONLY, NULL);
ICUNIT_GOTO_NOT_EQUAL(ret, JFFS_IS_ERROR, ret, EXIT1);
fd = creat(pathname1, 0755);
ICUNIT_GOTO_EQUAL(fd, JFFS_IS_ERROR, fd, EXIT3);
fd = open(pathname1, O_CREAT | O_RDONLY, 0755);
ICUNIT_GOTO_EQUAL(fd, JFFS_IS_ERROR, fd, EXIT3);
fd = open(pathname1, O_CREAT | O_RDWR, 0755);
ICUNIT_GOTO_EQUAL(fd, JFFS_IS_ERROR, fd, EXIT3);
ret = mkdir(pathname1, 0755);
ICUNIT_GOTO_EQUAL(ret, JFFS_IS_ERROR, ret, EXIT2);
ret = umount(JFFS_MAIN_DIR0);
ICUNIT_GOTO_NOT_EQUAL(ret, JFFS_IS_ERROR, ret, EXIT1);
ret = mount(JFFS_DEV_PATH0, JFFS_MAIN_DIR0, JFFS_FILESYS_TYPE, 0, NULL);
ICUNIT_GOTO_NOT_EQUAL(ret, JFFS_IS_ERROR, ret, EXIT1);
return JFFS_NO_ERROR;
EXIT3:
close(fd);
EXIT2:
remove(pathname1);
EXIT1:
umount(JFFS_MAIN_DIR0);
mount(JFFS_DEV_PATH0, JFFS_MAIN_DIR0, JFFS_FILESYS_TYPE, 0, NULL);
EXIT:
return JFFS_NO_ERROR;
}
VOID ItFsTestMountRdonly002(VOID)
{
TEST_ADD_CASE("IT_FS_TEST_MOUNT_RDONLY_002", testcase, TEST_VFS, TEST_JFFS, TEST_LEVEL0, TEST_FUNCTION);
}
\ No newline at end of file
/*
* Copyright (c) 2021-2021 Huawei Device Co., Ltd. All rights reserved.
*
* 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.
*/
#include "It_vfs_jffs.h"
static UINT32 testcase(VOID)
{
INT32 fd = -1;
INT32 ret;
CHAR readbuf[JFFS_STANDARD_NAME_LENGTH] = {0};
const CHAR writebuf[JFFS_STANDARD_NAME_LENGTH] = "0123456789";
CHAR pathname1[JFFS_STANDARD_NAME_LENGTH] = { JFFS_PATH_NAME0 };
fd = creat(pathname1, 0777);
ICUNIT_GOTO_NOT_EQUAL(fd, JFFS_IS_ERROR, fd, EXIT);
ret = write(fd, writebuf, strlen(writebuf));
ICUNIT_GOTO_EQUAL(ret, strlen(writebuf), ret, EXIT4);
ret = close(fd);
ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT4);
ret = umount(JFFS_MAIN_DIR0);
ICUNIT_GOTO_NOT_EQUAL(ret, JFFS_IS_ERROR, ret, EXIT3);
ret = mount(JFFS_DEV_PATH0, JFFS_MAIN_DIR0, JFFS_FILESYS_TYPE, MS_RDONLY, NULL);
ICUNIT_GOTO_NOT_EQUAL(ret, JFFS_IS_ERROR, ret, EXIT2);
fd = open(pathname1, O_RDWR);
ICUNIT_GOTO_EQUAL(fd, JFFS_IS_ERROR, fd, EXIT4);
fd = open(pathname1, O_RDONLY);
ICUNIT_GOTO_NOT_EQUAL(fd, JFFS_IS_ERROR, fd, EXIT4);
ret = read(fd, readbuf, strlen(writebuf));
ICUNIT_GOTO_EQUAL(ret, strlen(writebuf), ret, EXIT4);
ICUNIT_GOTO_STRING_EQUAL(readbuf, writebuf, readbuf, EXIT4);
ret = close(fd);
ICUNIT_GOTO_NOT_EQUAL(ret, JFFS_IS_ERROR, ret, EXIT4);
ret = umount(JFFS_MAIN_DIR0);
ICUNIT_GOTO_NOT_EQUAL(ret, JFFS_IS_ERROR, ret, EXIT3);
ret = mount(JFFS_DEV_PATH0, JFFS_MAIN_DIR0, JFFS_FILESYS_TYPE, 0, NULL);
ICUNIT_GOTO_NOT_EQUAL(ret, JFFS_IS_ERROR, ret, EXIT2);
ret = unlink(pathname1);
ICUNIT_GOTO_NOT_EQUAL(ret, JFFS_IS_ERROR, ret, EXIT1);
return JFFS_NO_ERROR;
EXIT4:
close(fd);
EXIT3:
umount(JFFS_MAIN_DIR0);
EXIT2:
mount(JFFS_DEV_PATH0, JFFS_MAIN_DIR0, JFFS_FILESYS_TYPE, 0, NULL);
EXIT1:
unlink(pathname1);
EXIT:
return JFFS_NO_ERROR;
}
VOID ItFsTestMountRdonly003(VOID)
{
TEST_ADD_CASE("IT_FS_TEST_MOUNT_RDONLY_003", testcase, TEST_VFS, TEST_JFFS, TEST_LEVEL0, TEST_FUNCTION);
}
\ No newline at end of file
......@@ -6885,6 +6885,21 @@ HWTEST_F(VfsJffsTest, ItFsTestSymlinkat001, TestSize.Level0)
ItFsTestSymlinkat001();
}
HWTEST_F(VfsJffsTest, ItFsTestMountRdonly001, TestSize.Level0)
{
ItFsTestMountRdonly001();
}
HWTEST_F(VfsJffsTest, ItFsTestMountRdonly002, TestSize.Level0)
{
ItFsTestMountRdonly002();
}
HWTEST_F(VfsJffsTest, ItFsTestMountRdonly003, TestSize.Level0)
{
ItFsTestMountRdonly003();
}
#endif
#if defined(LOSCFG_USER_TEST_SMOKE)
/* *
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册