From 942b4e118677af587f66ce74a3b25b0eb184678b Mon Sep 17 00:00:00 2001 From: James Simmons Date: Thu, 18 Nov 2021 11:39:08 -0500 Subject: [PATCH] LU-10824 llite: make foreign symlinks aware of mount namespaces Currently the foreign symlink code test if mount namespace is the same namespace related to the sysfs tree. This doesn't cover all cases. Linux supports limiting which mounts are visible to a process with mount namespaces. Lets add this support as well. Change-Id: Ie87ed45b3c4439e8800c937eb27ed4931989c0f4 Signed-off-by: James Simmons Reviewed-on: https://review.whamcloud.com/45609 Reviewed-by: Andreas Dilger Reviewed-by: Faccini Bruno Tested-by: jenkins Tested-by: Maloo Reviewed-by: Oleg Drokin --- lustre/llite/llite_foreign_symlink.c | 8 ++++---- lustre/llite/llite_internal.h | 1 + lustre/llite/llite_lib.c | 1 + 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lustre/llite/llite_foreign_symlink.c b/lustre/llite/llite_foreign_symlink.c index d401fa0..8c66a5e 100644 --- a/lustre/llite/llite_foreign_symlink.c +++ b/lustre/llite/llite_foreign_symlink.c @@ -430,15 +430,15 @@ static struct dentry *ll_foreign_dir_lookup(struct inode *parent, static bool has_same_mount_namespace(struct ll_sb_info *sbi) { - int rc; + bool same; - rc = (sbi->ll_mnt.mnt == current->fs->root.mnt); - if (!rc) + same = (sbi->ll_mnt_ns == current->nsproxy->mnt_ns); + if (!same) LCONSOLE_WARN("%s: client mount %s and '%s.%d' not in same mnt-namespace\n", sbi->ll_fsname, sbi->ll_kset.kobj.name, current->comm, current->pid); - return rc; + return same; } ssize_t foreign_symlink_enable_show(struct kobject *kobj, diff --git a/lustre/llite/llite_internal.h b/lustre/llite/llite_internal.h index 97ec1d2..1fc1222 100644 --- a/lustre/llite/llite_internal.h +++ b/lustre/llite/llite_internal.h @@ -676,6 +676,7 @@ struct ll_sb_info { struct obd_device *ll_dt_obd; struct dentry *ll_debugfs_entry; struct lu_fid ll_root_fid; /* root object fid */ + struct mnt_namespace *ll_mnt_ns; DECLARE_BITMAP(ll_flags, LL_SBI_NUM_FLAGS); /* enum ll_sbi_flags */ unsigned int ll_xattr_cache_enabled:1, diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c index 7a6d4a7..86c6611 100644 --- a/lustre/llite/llite_lib.c +++ b/lustre/llite/llite_lib.c @@ -452,6 +452,7 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt) sb->s_maxbytes = MAX_LFS_FILESIZE; sbi->ll_namelen = osfs->os_namelen; sbi->ll_mnt.mnt = current->fs->root.mnt; + sbi->ll_mnt_ns = current->nsproxy->mnt_ns; if (test_bit(LL_SBI_USER_XATTR, sbi->ll_flags) && !(data->ocd_connect_flags & OBD_CONNECT_XATTR)) { -- 1.8.3.1