Whamcloud - gitweb
LU-17504 build: fix gcc-13 [-Werror=stringop-overread] error
[fs/lustre-release.git] / lustre / llite / llite_foreign_symlink.c
index b9ee7da..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);
@@ -797,23 +801,25 @@ failed:
 
 /* foreign fake-symlink version of ll_getattr() */
 #if defined(HAVE_USER_NAMESPACE_ARG)
-int ll_foreign_symlink_getattr(struct user_namespace *mnt_userns,
-                              const struct path *path, struct kstat *stat,
-                              u32 request_mask, unsigned int flags)
+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)
-int ll_foreign_symlink_getattr(const struct path *path, struct kstat *stat,
-                              u32 request_mask, unsigned int flags)
+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
-int ll_foreign_symlink_getattr(struct vfsmount *mnt, struct dentry *de,
-                              struct kstat *stat)
+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);