Whamcloud - gitweb
LU-16637 llite: call truncate_inode_pages() under inode lock 84/50284/6
authorBobi Jam <bobijam@whamcloud.com>
Tue, 14 Mar 2023 02:02:12 +0000 (10:02 +0800)
committerOleg Drokin <green@whamcloud.com>
Tue, 21 Mar 2023 23:34:54 +0000 (23:34 +0000)
truncate_inode_pages() is required to be called under (and serialised
by) inode lock.

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I0f1a09c8756522f87a2e5d8030d12f80e2f630b4
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/50284
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/llite/llite_internal.h
lustre/llite/llite_lib.c
lustre/llite/vvp_object.c

index bf632d4..6e76c82 100644 (file)
@@ -1306,7 +1306,7 @@ int ll_update_inode(struct inode *inode, struct lustre_md *md);
 void ll_update_inode_flags(struct inode *inode, unsigned int ext_flags);
 void ll_update_dir_depth(struct inode *dir, struct inode *inode);
 int ll_read_inode2(struct inode *inode, void *opaque);
-void ll_truncate_inode_pages_final(struct inode *inode);
+void ll_truncate_inode_pages_final(struct inode *inode, struct cl_io *io);
 void ll_delete_inode(struct inode *inode);
 int ll_iocontrol(struct inode *inode, struct file *file,
                  unsigned int cmd, unsigned long arg);
index 054661e..cbe56d0 100644 (file)
@@ -2863,12 +2863,15 @@ void ll_update_dir_depth(struct inode *dir, struct inode *inode)
               PFID(&lli->lli_fid), lli->lli_dir_depth, lli->lli_inherit_depth);
 }
 
-void ll_truncate_inode_pages_final(struct inode *inode)
+void ll_truncate_inode_pages_final(struct inode *inode, struct cl_io *io)
 {
        struct address_space *mapping = &inode->i_data;
        unsigned long nrpages;
        unsigned long flags;
 
+       LASSERTF(io == NULL || inode_is_locked(inode), "io %p (type %d)\n",
+                io, io ? io->ci_type : 0);
+
        truncate_inode_pages_final(mapping);
 
        /* Workaround for LU-118: Note nrpages may not be totally updated when
@@ -2885,10 +2888,12 @@ void ll_truncate_inode_pages_final(struct inode *inode)
                ll_xa_unlock_irqrestore(&mapping->i_pages, flags);
        } /* Workaround end */
 
-       LASSERTF(nrpages == 0, "%s: inode="DFID"(%p) nrpages=%lu, "
+       LASSERTF(nrpages == 0, "%s: inode="DFID"(%p) nrpages=%lu "
+                "io %p (io_type %d), "
                 "see https://jira.whamcloud.com/browse/LU-118\n",
                 ll_i2sbi(inode)->ll_fsname,
-                PFID(ll_inode2fid(inode)), inode, nrpages);
+                PFID(ll_inode2fid(inode)), inode, nrpages,
+                io, io ? io->ci_type : 0);
 }
 
 int ll_read_inode2(struct inode *inode, void *opaque)
@@ -2962,7 +2967,7 @@ void ll_delete_inode(struct inode *inode)
                                   CL_FSYNC_LOCAL : CL_FSYNC_DISCARD, 1);
        }
 
-       ll_truncate_inode_pages_final(inode);
+       ll_truncate_inode_pages_final(inode, NULL);
        ll_clear_inode(inode);
        clear_inode(inode);
 
index b19b30f..650df1b 100644 (file)
@@ -155,6 +155,7 @@ static int vvp_conf_set(const struct lu_env *env, struct cl_object *obj,
 
 static int vvp_prune(const struct lu_env *env, struct cl_object *obj)
 {
+       struct cl_io *io = vvp_env_io(env)->vui_cl.cis_io;
        struct inode *inode = vvp_object_inode(obj);
        int rc;
        ENTRY;
@@ -166,9 +167,15 @@ static int vvp_prune(const struct lu_env *env, struct cl_object *obj)
                RETURN(rc);
        }
 
-       ll_truncate_inode_pages_final(inode);
+       if (io != NULL)
+               inode_lock(inode);
+
+       ll_truncate_inode_pages_final(inode, io);
        mapping_clear_exiting(inode->i_mapping);
 
+       if (io != NULL)
+               inode_unlock(inode);
+
        RETURN(0);
 }