Whamcloud - gitweb
LU-17504 build: fix gcc-13 [-Werror=stringop-overread] error
[fs/lustre-release.git] / lustre / llite / llite_foreign_symlink.c
index d401fa0..e5d28cf 100644 (file)
@@ -219,6 +219,7 @@ static int ll_foreign_readlink_internal(struct inode *inode, char **symname)
 {
        struct ll_inode_info *lli = ll_i2info(inode);
        struct ll_sb_info *sbi = ll_i2sbi(inode);
+       struct lmv_stripe_object *lsm_obj = NULL;
        struct lov_foreign_md *lfm = NULL;
        char *destname = NULL;
        size_t lfm_size = 0;
@@ -278,8 +279,11 @@ static int ll_foreign_readlink_internal(struct inode *inode, char **symname)
                 * and LMV formats are identical, and then we also only need
                 * one set of parsing routines for both foreign files and dirs!
                 */
-               lfm = (struct lov_foreign_md *)(lli->lli_lsm_md);
-               if (lfm != NULL) {
+               lsm_obj = lmv_stripe_object_get(lli->lli_lsm_obj);
+               up_read(&lli->lli_lsm_sem);
+
+               if (lsm_obj != NULL) {
+                       lfm = (struct lov_foreign_md *)&lsm_obj->lso_lfm;
                        CDEBUG(D_INFO, "%s: inode "DFID": LMV cached found\n",
                               sbi->ll_fsname, PFID(ll_inode2fid(inode)));
                } else {
@@ -299,7 +303,7 @@ static int ll_foreign_readlink_internal(struct inode *inode, char **symname)
 
 failed:
        if (S_ISDIR(inode->i_mode))
-               up_read(&lli->lli_lsm_sem);
+               lmv_stripe_object_put(&lsm_obj);
 
        if (S_ISREG(inode->i_mode) && lfm)
                OBD_FREE(lfm, lfm_size);
@@ -430,15 +434,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,
@@ -795,6 +799,33 @@ failed:
        RETURN(rc == 0 ? count : rc);
 }
 
+/* foreign fake-symlink version of ll_getattr() */
+#if defined(HAVE_USER_NAMESPACE_ARG)
+static int ll_foreign_symlink_getattr(struct mnt_idmap *map,
+                                     const struct path *path,
+                                     struct kstat *stat, u32 request_mask,
+                                     unsigned int flags)
+{
+       return ll_getattr_dentry(path->dentry, stat, request_mask, flags,
+                                true);
+}
+#elif defined(HAVE_INODEOPS_ENHANCED_GETATTR)
+static int ll_foreign_symlink_getattr(const struct path *path,
+                                     struct kstat *stat, u32 request_mask,
+                                     unsigned int flags)
+{
+       return ll_getattr_dentry(path->dentry, stat, request_mask, flags,
+                                true);
+}
+#else
+static int ll_foreign_symlink_getattr(struct vfsmount *mnt, struct dentry *de,
+                                     struct kstat *stat)
+{
+       return ll_getattr_dentry(de, stat, STATX_BASIC_STATS,
+                                AT_STATX_SYNC_AS_STAT, true);
+}
+#endif
+
 struct inode_operations ll_foreign_file_symlink_inode_operations = {
 #ifdef HAVE_IOP_GENERIC_READLINK
        .readlink       = generic_readlink,
@@ -838,20 +869,3 @@ struct inode_operations ll_foreign_dir_symlink_inode_operations = {
 #endif
        .listxattr      = ll_listxattr,
 };
-
-/* foreign fake-symlink version of ll_getattr() */
-#ifdef HAVE_INODEOPS_ENHANCED_GETATTR
-int ll_foreign_symlink_getattr(const struct path *path, struct kstat *stat,
-                              u32 request_mask, unsigned int flags)
-{
-       return ll_getattr_dentry(path->dentry, stat, request_mask, flags,
-                                true);
-}
-#else
-int ll_foreign_symlink_getattr(struct vfsmount *mnt, struct dentry *de,
-                              struct kstat *stat)
-{
-       return ll_getattr_dentry(de, stat, STATX_BASIC_STATS,
-                                AT_STATX_SYNC_AS_STAT, true);
-}
-#endif