Whamcloud - gitweb
LU-7927 llite: Deadlock between ll_setattr and write/ll_fsync 65/19165/9
authorAndriy Skulysh <andriy.skulysh@seagate.com>
Tue, 23 Aug 2016 21:07:37 +0000 (16:07 -0500)
committerOleg Drokin <oleg.drokin@intel.com>
Fri, 2 Sep 2016 02:22:38 +0000 (02:22 +0000)
The patch http://review.whamcloud.com/10013 (commit 85bd36cc695)
"LU-4840 lfs: Use file lease to implement migration" moves
lli_trunc_sem into vvp layer.  It violates lli_trunc_sem/i_mutex
locking order.  So i_mutex should be taken after lli_trunc_sem now.

Change-Id: I2ecd52b7ae6eca74c6db7d94b1de1333560bc45d
Seagate-bug-id: MRP-3372
Signed-off-by: Andriy Skulysh <andriy.skulysh@seagate.com>
Reviewed-on: http://review.whamcloud.com/19165
Reviewed-by: Patrick Farrell <paf@cray.com>
Tested-by: Jenkins
Reviewed-by: James Simmons <uja.ornl@yahoo.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Ann Koehler <amk@cray.com>
Reviewed-by: Ben Evans <bevans@cray.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/llite/vvp_io.c

index 43e8563..625cb82 100644 (file)
@@ -661,10 +661,12 @@ static int vvp_io_setattr_start(const struct lu_env *env,
        struct inode            *inode = vvp_object_inode(io->ci_obj);
        struct ll_inode_info    *lli   = ll_i2info(inode);
 
-       inode_lock(inode);
        if (cl_io_is_trunc(io)) {
                down_write(&lli->lli_trunc_sem);
+               inode_lock(inode);
                inode_dio_wait(inode);
+       } else {
+               inode_lock(inode);
        }
 
        if (io->u.ci_setattr.sa_valid & TIMES_SET_FLAGS)
@@ -685,9 +687,11 @@ static void vvp_io_setattr_end(const struct lu_env *env,
                 * because osc has already notified to destroy osc_extents. */
                vvp_do_vmtruncate(inode, io->u.ci_setattr.sa_attr.lvb_size);
                inode_dio_write_done(inode);
+               inode_unlock(inode);
                up_write(&lli->lli_trunc_sem);
+       } else {
+               inode_unlock(inode);
        }
-       inode_unlock(inode);
 }
 
 static void vvp_io_setattr_fini(const struct lu_env *env,