From: Andriy Skulysh Date: Thu, 27 Feb 2020 21:15:41 +0000 (+0200) Subject: LU-13467 llite: truncate deadlock with DoM files X-Git-Tag: 2.13.55~119 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=8958ecee22010dfa1b99220c2288f7369f490871;ds=sidebyside LU-13467 llite: truncate deadlock with DoM files All MDT intent RPCs are sent with inode mutex locked while read/write and setattr unlocks inode mutex on entry, takes LDLM lock and locks inode mutex again and sends the RPC. So a deadlock can occur since LDLM lock is the same in case of DoM. In fact read/write and setattr takes lli_trunc_sem, so inode mutex can be ommited in truncate case. Replace inode_lock with new lli_setattr_mutex to keep protection from concurrent setattr time updates. HPE-bug-id: LUS-8455 Change-Id: Ie294154306cc3b6cff977a2dff485e8d44145ed9 Reviewed-by: Andrew Perepechko Reviewed-by: Vitaly Fertman Signed-off-by: Andriy Skulysh Reviewed-on: https://review.whamcloud.com/38288 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Mike Pershin Reviewed-by: Andreas Dilger Reviewed-by: Oleg Drokin --- diff --git a/lustre/llite/llite_internal.h b/lustre/llite/llite_internal.h index 0302620..b504614 100644 --- a/lustre/llite/llite_internal.h +++ b/lustre/llite/llite_internal.h @@ -185,6 +185,7 @@ struct ll_inode_info { char *lli_symlink_name; struct ll_trunc_sem lli_trunc_sem; struct range_lock_tree lli_write_tree; + struct mutex lli_setattr_mutex; struct rw_semaphore lli_glimpse_sem; ktime_t lli_glimpse_time; diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c index 0aaae5f..d43e793 100644 --- a/lustre/llite/llite_lib.c +++ b/lustre/llite/llite_lib.c @@ -1037,6 +1037,7 @@ void ll_lli_init(struct ll_inode_info *lli) init_rwsem(&lli->lli_lsm_sem); } else { mutex_init(&lli->lli_size_mutex); + mutex_init(&lli->lli_setattr_mutex); lli->lli_symlink_name = NULL; ll_trunc_sem_init(&lli->lli_trunc_sem); range_lock_tree_init(&lli->lli_write_tree); diff --git a/lustre/llite/vvp_io.c b/lustre/llite/vvp_io.c index 85d630f..94df8b5 100644 --- a/lustre/llite/vvp_io.c +++ b/lustre/llite/vvp_io.c @@ -738,13 +738,13 @@ static int vvp_io_setattr_start(const struct lu_env *env, if (cl_io_is_trunc(io)) { trunc_sem_down_write(&lli->lli_trunc_sem); - inode_lock(inode); + mutex_lock(&lli->lli_setattr_mutex); inode_dio_wait(inode); } else if (cl_io_is_fallocate(io)) { inode_lock(inode); inode_dio_wait(inode); } else { - inode_lock(inode); + mutex_lock(&lli->lli_setattr_mutex); } if (io->u.ci_setattr.sa_avalid & TIMES_SET_FLAGS) @@ -764,12 +764,12 @@ static void vvp_io_setattr_end(const struct lu_env *env, /* Truncate in memory pages - they must be clean pages * because osc has already notified to destroy osc_extents. */ vvp_do_vmtruncate(inode, io->u.ci_setattr.sa_attr.lvb_size); - inode_unlock(inode); + mutex_unlock(&lli->lli_setattr_mutex); trunc_sem_up_write(&lli->lli_trunc_sem); } else if (cl_io_is_fallocate(io)) { inode_unlock(inode); } else { - inode_unlock(inode); + mutex_unlock(&lli->lli_setattr_mutex); } }