From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752257AbbCZByH (ORCPT ); Wed, 25 Mar 2015 21:54:07 -0400 Received: from linuxhacker.ru ([217.76.32.60]:39196 "EHLO fiona.linuxhacker.ru" rhost-flags-OK-FAIL-OK-OK) by vger.kernel.org with ESMTP id S1752185AbbCZByE (ORCPT ); Wed, 25 Mar 2015 21:54:04 -0400 From: green@linuxhacker.ru To: Greg Kroah-Hartman , devel@driverdev.osuosl.org, Andreas Dilger Cc: Linux Kernel Mailing List , Lai Siyao , Oleg Drokin Subject: [PATCH 10/10] staging/lustre/xattr: xattr data may be gone with lock held Date: Wed, 25 Mar 2015 21:53:26 -0400 Message-Id: <1427334806-31466-11-git-send-email-green@linuxhacker.ru> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1427334806-31466-1-git-send-email-green@linuxhacker.ru> References: <1427334806-31466-1-git-send-email-green@linuxhacker.ru> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Lai Siyao Xattr cached data may be gone, but lock still held, in this case, refetch xattr from server, otherwise client will return error. Signed-off-by: Lai Siyao Reviewed-on: http://review.whamcloud.com/12952 Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-3544 Reviewed-by: Bobi Jam Reviewed-by: Nathaniel Clark Signed-off-by: Oleg Drokin --- drivers/staging/lustre/lustre/llite/xattr_cache.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/drivers/staging/lustre/lustre/llite/xattr_cache.c b/drivers/staging/lustre/lustre/llite/xattr_cache.c index da190f9..69ea92a 100644 --- a/drivers/staging/lustre/lustre/llite/xattr_cache.c +++ b/drivers/staging/lustre/lustre/llite/xattr_cache.c @@ -295,13 +295,18 @@ static int ll_xattr_find_get_lock(struct inode *inode, mutex_lock(&lli->lli_xattrs_enq_lock); - /* Try matching first. */ - mode = ll_take_md_lock(inode, MDS_INODELOCK_XATTR, &lockh, 0, LCK_PR); - if (mode != 0) { - /* fake oit in mdc_revalidate_lock() manner */ - oit->d.lustre.it_lock_handle = lockh.cookie; - oit->d.lustre.it_lock_mode = mode; - goto out; + /* inode may have been shrunk and recreated, so data is gone, match lock + * only when data exists. */ + if (ll_xattr_cache_valid(lli)) { + /* Try matching first. */ + mode = ll_take_md_lock(inode, MDS_INODELOCK_XATTR, &lockh, 0, + LCK_PR); + if (mode != 0) { + /* fake oit in mdc_revalidate_lock() manner */ + oit->d.lustre.it_lock_handle = lockh.cookie; + oit->d.lustre.it_lock_mode = mode; + goto out; + } } /* Enqueue if the lock isn't cached locally. */ -- 2.1.0