From: Yan, Zheng Date: Sun, 21 Jul 2013 12:25:26 +0000 (+0800) Subject: ceph: wake up writer if vmtruncate work get blocked X-Git-Tag: v3.12-rc2~16^2~43 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=85ce127a9adf5ab9e9d57ddf64c858927d5e546d;p=kernel%2Fkernel-generic.git ceph: wake up writer if vmtruncate work get blocked To write data, the writer first acquires the i_mutex, then try getting caps. The writer may sleep while holding the i_mutex. If the MDS revokes Fb cap in this case, vmtruncate work can't do its job because i_mutex is locked. We should wake up the writer and let it truncate the pages. Signed-off-by: Yan, Zheng Reviewed-by: Sage Weil --- diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index 4906ada..55aaddb 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c @@ -1465,7 +1465,14 @@ static void ceph_vmtruncate_work(struct work_struct *work) struct inode *inode = &ci->vfs_inode; dout("vmtruncate_work %p\n", inode); - mutex_lock(&inode->i_mutex); + if (!mutex_trylock(&inode->i_mutex)) { + /* + * the i_mutex can be hold by a writer who is waiting for + * caps. wake up waiters, they will do pending vmtruncate. + */ + wake_up_all(&ci->i_cap_wq); + mutex_lock(&inode->i_mutex); + } __ceph_do_pending_vmtruncate(inode); mutex_unlock(&inode->i_mutex); iput(inode);