From patchwork Tue Jun 4 11:26:35 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Li Lingfeng X-Patchwork-Id: 13685082 Received: from dggsgout11.his.huawei.com (unknown [45.249.212.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DBB10145335; Tue, 4 Jun 2024 11:26:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717500402; cv=none; b=FlRkGPGbTHt7bCrlImE0sXr7aVsEiF0NmrfmkqQSgQ9ltd5XTEn/7c4vbr24BTX8aOXwWzbDSh9W/rcSA4rpKzmnf39bZyAuk0J97v9IpVjf8lDy36Z8dmJXtO1R+LhT00Xi9ItfrPrCReLQsnGk9jBwXFbzay9Jo1iQaR6kDSs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717500402; c=relaxed/simple; bh=DPAslzLeTdPCHR5P+eciFyRSr7VJxB5VKsaBTDYBaGE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=FV2IzyiFHGoqBy+9eWmjftd7pc1r93HSCmHZ/MhSdb4ybiFSbha4CyUmSo3RVM1QRUlFBlyVUaYkBemBAMarIK5PEpt45BpMIdui/VqGK76X0sxD2dkCnN92yA6d8siS9BBHpaTWWVXlrOSalx7V5q0r2R1b4AvH2Y4/19UPe4g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.163.216]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTP id 4VtpFf0q4Hz4f3lXJ; Tue, 4 Jun 2024 19:26:30 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.112]) by mail.maildlp.com (Postfix) with ESMTP id 5ED171A0C64; Tue, 4 Jun 2024 19:26:36 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP1 (Coremail) with SMTP id cCh0CgAXKwTp+V5mJkItOg--.61165S5; Tue, 04 Jun 2024 19:26:35 +0800 (CST) From: Li Lingfeng To: dhowells@redhat.com, marc.dionne@auristor.com, raven@themaw.net, gregkh@linuxfoundation.org, rafael@kernel.org, viro@zeniv.linux.org.uk, brauner@kernel.org, jack@suse.cz, miklos@szeredi.hu, trond.myklebust@hammerspace.com, anna@kernel.org, sfrench@samba.org, pc@manguebit.com, ronniesahlberg@gmail.com, sprasad@microsoft.com, tom@talpey.com, bharathsm@microsoft.com, djwong@kernel.org Cc: linux-afs@lists.infradead.org, linux-kernel@vger.kernel.org, autofs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, yi.zhang@huawei.com, yangerkun@huawei.com, zhangxiaoxu5@huawei.com, lilingfeng@huaweicloud.com, lilingfeng3@huawei.com Subject: [PATCH RFC 1/2] fs: pass sb_flags to submount Date: Tue, 4 Jun 2024 19:26:35 +0800 Message-Id: <20240604112636.236517-2-lilingfeng@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240604112636.236517-1-lilingfeng@huaweicloud.com> References: <20240604112636.236517-1-lilingfeng@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-nfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-CM-TRANSID: cCh0CgAXKwTp+V5mJkItOg--.61165S5 X-Coremail-Antispam: 1UD129KBjvJXoWxKr4UGFW7JFy8Zr4DZr1DZFb_yoWDGFy7pF 4xAw18Gr48Jr17WF1kAa15Zw1S9ryv9F17GryrW34Fvwnxtrs3W3Zrt3WYvry5CrW8Gry3 XF4Ykw1UK3W7ZFJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUP014x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_Jr4l82xGYIkIc2 x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0 Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJw A2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq3wAS 0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7IYx2 IY67AKxVWUGVWUXwAv7VC2z280aVAFwI0_Gr0_Cr1lOx8S6xCaFVCjc4AY6r1j6r4UM4x0 Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2kIc2 xKxwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v2 6r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_GFv_WrylIxkGc2 Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUJVWUCwCI42IY6xIIjxv20xvEc7CjxVAFwI0_ Cr0_Gr1UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVW8JVWxJw CI42IY6I8E87Iv6xkF7I0E14v26r4UJVWxJrUvcSsGvfC2KfnxnUUI43ZEXa7VUbm9aPUU UUU== X-CM-SenderInfo: polox0xjih0w46kxt4xhlfz01xgou0bp/ From: Li Lingfeng This commit has no functional change. Get sb_flags by nameidata, and pass it to submount. Signed-off-by: Li Lingfeng --- fs/afs/internal.h | 2 +- fs/afs/mntpt.c | 4 ++-- fs/autofs/root.c | 4 ++-- fs/debugfs/inode.c | 2 +- fs/fs_context.c | 5 +++-- fs/fuse/dir.c | 4 ++-- fs/namei.c | 3 ++- fs/nfs/internal.h | 2 +- fs/nfs/namespace.c | 4 ++-- fs/smb/client/cifsfs.h | 2 +- fs/smb/client/namespace.c | 2 +- include/linux/dcache.h | 2 +- include/linux/fs_context.h | 3 ++- 13 files changed, 21 insertions(+), 18 deletions(-) diff --git a/fs/afs/internal.h b/fs/afs/internal.h index 6e1d3c4daf72..dc07446e6378 100644 --- a/fs/afs/internal.h +++ b/fs/afs/internal.h @@ -1295,7 +1295,7 @@ extern const struct inode_operations afs_mntpt_inode_operations; extern const struct inode_operations afs_autocell_inode_operations; extern const struct file_operations afs_mntpt_file_operations; -extern struct vfsmount *afs_d_automount(struct path *); +extern struct vfsmount *afs_d_automount(struct path *, unsigned int); extern void afs_mntpt_kill_timer(void); /* diff --git a/fs/afs/mntpt.c b/fs/afs/mntpt.c index 297487ee8323..3519deab514f 100644 --- a/fs/afs/mntpt.c +++ b/fs/afs/mntpt.c @@ -161,7 +161,7 @@ static struct vfsmount *afs_mntpt_do_automount(struct dentry *mntpt) BUG_ON(!d_inode(mntpt)); - fc = fs_context_for_submount(&afs_fs_type, mntpt); + fc = fs_context_for_submount(&afs_fs_type, mntpt, 0); if (IS_ERR(fc)) return ERR_CAST(fc); @@ -178,7 +178,7 @@ static struct vfsmount *afs_mntpt_do_automount(struct dentry *mntpt) /* * handle an automount point */ -struct vfsmount *afs_d_automount(struct path *path) +struct vfsmount *afs_d_automount(struct path *path, unsigned int sb_flags) { struct vfsmount *newmnt; diff --git a/fs/autofs/root.c b/fs/autofs/root.c index 530d18827e35..f7294d3a089f 100644 --- a/fs/autofs/root.c +++ b/fs/autofs/root.c @@ -25,7 +25,7 @@ static long autofs_root_compat_ioctl(struct file *, static int autofs_dir_open(struct inode *inode, struct file *file); static struct dentry *autofs_lookup(struct inode *, struct dentry *, unsigned int); -static struct vfsmount *autofs_d_automount(struct path *); +static struct vfsmount *autofs_d_automount(struct path *, unsigned int); static int autofs_d_manage(const struct path *, bool); static void autofs_dentry_release(struct dentry *); @@ -328,7 +328,7 @@ static struct dentry *autofs_mountpoint_changed(struct path *path) return path->dentry; } -static struct vfsmount *autofs_d_automount(struct path *path) +static struct vfsmount *autofs_d_automount(struct path *path, unsigned int sb_flags) { struct dentry *dentry = path->dentry; struct autofs_sb_info *sbi = autofs_sbi(dentry->d_sb); diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c index dc51df0b118d..a2cdab95d12a 100644 --- a/fs/debugfs/inode.c +++ b/fs/debugfs/inode.c @@ -229,7 +229,7 @@ static void debugfs_release_dentry(struct dentry *dentry) kfree(fsd); } -static struct vfsmount *debugfs_automount(struct path *path) +static struct vfsmount *debugfs_automount(struct path *path, unsigned int sb_flags) { struct debugfs_fsdata *fsd = path->dentry->d_fsdata; diff --git a/fs/fs_context.c b/fs/fs_context.c index 98589aae5208..95367dc7dc40 100644 --- a/fs/fs_context.c +++ b/fs/fs_context.c @@ -352,12 +352,13 @@ EXPORT_SYMBOL(fs_context_for_reconfigure); * the fc->security object is inherited from @reference (if needed). */ struct fs_context *fs_context_for_submount(struct file_system_type *type, - struct dentry *reference) + struct dentry *reference, + unsigned int sb_flags) { struct fs_context *fc; int ret; - fc = alloc_fs_context(type, reference, 0, 0, FS_CONTEXT_FOR_SUBMOUNT); + fc = alloc_fs_context(type, reference, sb_flags, 0, FS_CONTEXT_FOR_SUBMOUNT); if (IS_ERR(fc)) return fc; diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 2b0d4781f394..88bd5aec11e7 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -305,13 +305,13 @@ static int fuse_dentry_delete(const struct dentry *dentry) * as the root), and return that mount so it can be auto-mounted on * @path. */ -static struct vfsmount *fuse_dentry_automount(struct path *path) +static struct vfsmount *fuse_dentry_automount(struct path *path, unsigned int sb_flags) { struct fs_context *fsc; struct vfsmount *mnt; struct fuse_inode *mp_fi = get_fuse_inode(d_inode(path->dentry)); - fsc = fs_context_for_submount(path->mnt->mnt_sb->s_type, path->dentry); + fsc = fs_context_for_submount(path->mnt->mnt_sb->s_type, path->dentry, 0); if (IS_ERR(fsc)) return ERR_CAST(fsc); diff --git a/fs/namei.c b/fs/namei.c index 37fb0a8aa09a..445de9fcef38 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -1345,6 +1345,7 @@ static bool choose_mountpoint(struct mount *m, const struct path *root, static int follow_automount(struct path *path, int *count, unsigned lookup_flags) { struct dentry *dentry = path->dentry; + struct nameidata *nd = container_of(count, struct nameidata, total_link_count); /* We don't want to mount if someone's just doing a stat - * unless they're stat'ing a directory and appended a '/' to @@ -1365,7 +1366,7 @@ static int follow_automount(struct path *path, int *count, unsigned lookup_flags if (count && (*count)++ >= MAXSYMLINKS) return -ELOOP; - return finish_automount(dentry->d_op->d_automount(path), path); + return finish_automount(dentry->d_op->d_automount(path, nd->root.mnt->mnt_sb->s_flags), path); } /* diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index 9f0f4534744b..f0e35e0d05c9 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h @@ -484,7 +484,7 @@ static inline bool nfs_file_io_is_buffered(struct nfs_inode *nfsi) #define NFS_PATH_CANONICAL 1 extern char *nfs_path(char **p, struct dentry *dentry, char *buffer, ssize_t buflen, unsigned flags); -extern struct vfsmount *nfs_d_automount(struct path *path); +extern struct vfsmount *nfs_d_automount(struct path *path, unsigned int); int nfs_submount(struct fs_context *, struct nfs_server *); int nfs_do_submount(struct fs_context *); diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c index e7494cdd957e..887aeacedebd 100644 --- a/fs/nfs/namespace.c +++ b/fs/nfs/namespace.c @@ -142,7 +142,7 @@ EXPORT_SYMBOL_GPL(nfs_path); * situation, and that different filesystems may want to use * different security flavours. */ -struct vfsmount *nfs_d_automount(struct path *path) +struct vfsmount *nfs_d_automount(struct path *path, unsigned int sb_flags) { struct nfs_fs_context *ctx; struct fs_context *fc; @@ -158,7 +158,7 @@ struct vfsmount *nfs_d_automount(struct path *path) /* Open a new filesystem context, transferring parameters from the * parent superblock, including the network namespace. */ - fc = fs_context_for_submount(path->mnt->mnt_sb->s_type, path->dentry); + fc = fs_context_for_submount(path->mnt->mnt_sb->s_type, path->dentry, 0); if (IS_ERR(fc)) return ERR_CAST(fc); diff --git a/fs/smb/client/cifsfs.h b/fs/smb/client/cifsfs.h index 62d5fee3e5eb..eec5d5fa42a5 100644 --- a/fs/smb/client/cifsfs.h +++ b/fs/smb/client/cifsfs.h @@ -113,7 +113,7 @@ extern int cifs_readdir(struct file *file, struct dir_context *ctx); extern const struct dentry_operations cifs_dentry_ops; extern const struct dentry_operations cifs_ci_dentry_ops; -extern struct vfsmount *cifs_d_automount(struct path *path); +extern struct vfsmount *cifs_d_automount(struct path *path, unsigned int sb_flags); /* Functions related to symlinks */ extern const char *cifs_get_link(struct dentry *, struct inode *, diff --git a/fs/smb/client/namespace.c b/fs/smb/client/namespace.c index 4a517b280f2b..81640e6b2d3f 100644 --- a/fs/smb/client/namespace.c +++ b/fs/smb/client/namespace.c @@ -254,7 +254,7 @@ static struct vfsmount *cifs_do_automount(struct path *path) /* * Attempt to automount the referral */ -struct vfsmount *cifs_d_automount(struct path *path) +struct vfsmount *cifs_d_automount(struct path *path, unsigned int sb_flags) { struct vfsmount *newmnt; diff --git a/include/linux/dcache.h b/include/linux/dcache.h index bf53e3894aae..864b0cd1c0c9 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h @@ -142,7 +142,7 @@ struct dentry_operations { void (*d_prune)(struct dentry *); void (*d_iput)(struct dentry *, struct inode *); char *(*d_dname)(struct dentry *, char *, int); - struct vfsmount *(*d_automount)(struct path *); + struct vfsmount *(*d_automount)(struct path *, unsigned int sb_flags); int (*d_manage)(const struct path *, bool); struct dentry *(*d_real)(struct dentry *, enum d_real_type type); } ____cacheline_aligned; diff --git a/include/linux/fs_context.h b/include/linux/fs_context.h index c13e99cbbf81..920bcbfaff2e 100644 --- a/include/linux/fs_context.h +++ b/include/linux/fs_context.h @@ -130,7 +130,8 @@ extern struct fs_context *fs_context_for_reconfigure(struct dentry *dentry, unsigned int sb_flags, unsigned int sb_flags_mask); extern struct fs_context *fs_context_for_submount(struct file_system_type *fs_type, - struct dentry *reference); + struct dentry *reference, + unsigned int sb_flags); extern struct fs_context *vfs_dup_fs_context(struct fs_context *fc); extern int vfs_parse_fs_param(struct fs_context *fc, struct fs_parameter *param); From patchwork Tue Jun 4 11:26:36 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Li Lingfeng X-Patchwork-Id: 13685083 Received: from dggsgout11.his.huawei.com (unknown [45.249.212.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E278F145343; Tue, 4 Jun 2024 11:26:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717500403; cv=none; b=fnSZQJBm3OuqOd+v2L26GZLH2dBJm2L9gKTU2EUDoak6Sc+pS3gW67oFVkJmrnN2ZGZzmfwFGTI3CifwCAW6nIAMHDJLEOYhiTa6r/tgiQz5VUt5nVjBdfUhztBelBmoBY3OrSIOecDEuxQ8R6NURh9P03wxoH2kPGekuOK4LfY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717500403; c=relaxed/simple; bh=2sqRP+cDWakjPW2TLGsMmWbJp1y1dv+ct4RW2zKc/Jg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ovaM7Cbv1o0/0QFRYuoL7trceEwRa352OEwnSLSo0PohalmudRVYbzSubsOePK9f/f+yNsC6qLaueK4/Iyh0DSbgIWZkgrVi8Ji7+8ZQD22T1tMMkXyNMOofT4n8J6Z5hztyHNiWHyvrc+PNU1J/Xi7jJu/L6czCHlocZ/38IiA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.163.235]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTP id 4VtpFZ2z71z4f3mJP; Tue, 4 Jun 2024 19:26:26 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.112]) by mail.maildlp.com (Postfix) with ESMTP id 78BD21A0CB7; Tue, 4 Jun 2024 19:26:37 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP1 (Coremail) with SMTP id cCh0CgAXKwTp+V5mJkItOg--.61165S6; Tue, 04 Jun 2024 19:26:36 +0800 (CST) From: Li Lingfeng To: dhowells@redhat.com, marc.dionne@auristor.com, raven@themaw.net, gregkh@linuxfoundation.org, rafael@kernel.org, viro@zeniv.linux.org.uk, brauner@kernel.org, jack@suse.cz, miklos@szeredi.hu, trond.myklebust@hammerspace.com, anna@kernel.org, sfrench@samba.org, pc@manguebit.com, ronniesahlberg@gmail.com, sprasad@microsoft.com, tom@talpey.com, bharathsm@microsoft.com, djwong@kernel.org Cc: linux-afs@lists.infradead.org, linux-kernel@vger.kernel.org, autofs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, yi.zhang@huawei.com, yangerkun@huawei.com, zhangxiaoxu5@huawei.com, lilingfeng@huaweicloud.com, lilingfeng3@huawei.com Subject: [PATCH RFC 2/2] NFSv4: set sb_flags to second superblock Date: Tue, 4 Jun 2024 19:26:36 +0800 Message-Id: <20240604112636.236517-3-lilingfeng@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240604112636.236517-1-lilingfeng@huaweicloud.com> References: <20240604112636.236517-1-lilingfeng@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-nfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-CM-TRANSID: cCh0CgAXKwTp+V5mJkItOg--.61165S6 X-Coremail-Antispam: 1UD129KBjvJXoWxAF1DCFW3ur1xAr1UGF1Utrb_yoW5CF1rpF WfAryUGrWkJF1UXa10yFWrXa4Sy34kZF4UAFn3ua4kAryDXr1xX3W3tFWY9a48Zr4fZr98 XFWftF13C3ZrJFDanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUP014x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_Jryl82xGYIkIc2 x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0 Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJw A2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq3wAS 0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7IYx2 IY67AKxVWUGVWUXwAv7VC2z280aVAFwI0_Gr0_Cr1lOx8S6xCaFVCjc4AY6r1j6r4UM4x0 Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2kIc2 xKxwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v2 6r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_GFv_WrylIxkGc2 Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUCVW8JwCI42IY6xIIjxv20xvEc7CjxVAFwI0_ Cr0_Gr1UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVW8JVWxJw CI42IY6I8E87Iv6xkF7I0E14v26r4UJVWxJrUvcSsGvfC2KfnxnUUI43ZEXa7VUbvtC7UU UUU== X-CM-SenderInfo: polox0xjih0w46kxt4xhlfz01xgou0bp/ From: Li Lingfeng During the process of mounting an NFSv4 client, two superblocks will be created in sequence. The first superblock corresponds to the root directory exported by the server, and the second superblock corresponds to the directory that will be actually mounted. The first superblock will eventually be destroyed. The flag passed from user mode will only be passed to the first superblock, resulting in the actual used superblock not carrying the flag passed from user mode(fs_context_for_submount() will set sb_flags as 0). If the 'ro' parameter is used in two consecutive mount commands, only the first execution will create a new vfsmount, and the kernel will return EBUSY on the second execution. However, if a remount command with the 'ro' parameter is executed between the two mount commands, both mount commands will create new vfsmounts. The superblock generated after the first mount command does not have the 'ro' flag, and the read-only status of the file system is implemented by checking the read-only flag of the vfsmount. After executing the remount command, the 'ro' flag will be added to the superblock. When the second mount command is executed, the comparison result between the superblock with the 'ro' flag and the fs_context without the flag in the nfs_compare_mount_options() function will be different, resulting in the creation of a new vfsmount. This problem can be reproduced by performing the following operations: mount -t nfs -o ro,vers=4.0 192.168.240.250:/sdb /mnt/sdb mount -t nfs -o remount,ro,vers=4.0 192.168.240.250:/sdb /mnt/sdb mount -t nfs -o ro,vers=4.0 192.168.240.250:/sdb /mnt/sdb Two vfsmounts are generated: [root@localhost ~]# mount | grep nfs 192.168.240.250:/sdb on /mnt/sdb type nfs4 (ro,relatime,vers=4.0, rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2, sec=sys,clientaddr=192.168.240.251,local_lock=none,addr=192.168.240.250) 192.168.240.250:/sdb on /mnt/sdb type nfs4 (ro,relatime,vers=4.0, rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2, sec=sys,clientaddr=192.168.240.251,local_lock=none,addr=192.168.240.250) Fix this by setting sb_flags to second superblock. Signed-off-by: Li Lingfeng --- fs/nfs/namespace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c index 887aeacedebd..8b3d75af60d4 100644 --- a/fs/nfs/namespace.c +++ b/fs/nfs/namespace.c @@ -158,7 +158,7 @@ struct vfsmount *nfs_d_automount(struct path *path, unsigned int sb_flags) /* Open a new filesystem context, transferring parameters from the * parent superblock, including the network namespace. */ - fc = fs_context_for_submount(path->mnt->mnt_sb->s_type, path->dentry, 0); + fc = fs_context_for_submount(path->mnt->mnt_sb->s_type, path->dentry, sb_flags); if (IS_ERR(fc)) return ERR_CAST(fc);