From 5d60fd75152d10d699ce6e1cc128f12aa6cc86a6 Mon Sep 17 00:00:00 2001 From: Andriy Skulysh Date: Tue, 23 Aug 2016 16:07:37 -0500 Subject: [PATCH] LU-7927 llite: Deadlock between ll_setattr and write/ll_fsync 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 Reviewed-on: http://review.whamcloud.com/19165 Reviewed-by: Patrick Farrell Tested-by: Jenkins Reviewed-by: James Simmons Tested-by: Maloo Reviewed-by: Ann Koehler Reviewed-by: Ben Evans Reviewed-by: Oleg Drokin --- lustre/llite/vvp_io.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lustre/llite/vvp_io.c b/lustre/llite/vvp_io.c index 43e8563..625cb82 100644 --- a/lustre/llite/vvp_io.c +++ b/lustre/llite/vvp_io.c @@ -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, -- 1.8.3.1