diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 15f4e6d34fdd0160522e8a807948a8017436f800..53982e976dc37da0f3c2fe0721fbc0cee2f843a0 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c @@ -2309,6 +2309,16 @@ nfs_remount(struct super_block *sb, int *flags, char *raw_data) sync_filesystem(sb); + /* + * The SB_RDONLY flag has been removed from the superblock during + * mounts to prevent interference between different filesystems. + * Similarly, it is also necessary to ignore the SB_RDONLY flag + * during reconfiguration; otherwise, it may also result in the + * creation of redundant superblocks when mounting a directory with + * different rw and ro flags multiple times. + */ + *flags &= ~SB_RDONLY; + /* * Userspace mount programs that send binary options generally send * them populated with default values. We have no way to know which @@ -2649,8 +2659,17 @@ struct dentry *nfs_fs_mount_common(struct nfs_server *server, }; int error; + /* + * When NFS_MOUNT_UNSHARED is not set, NFS forces the sharing of a + * superblock among each filesystem that mounts sub-directories + * belonging to a single exported root path. + * To prevent interference between different filesystems, the + * SB_RDONLY flag should be removed from the superblock. + */ if (server->flags & NFS_MOUNT_UNSHARED) compare_super = NULL; + else + sb_mntdata.mntflags &= ~SB_RDONLY; /* -o noac implies -o sync */ if (server->flags & NFS_MOUNT_NOAC)