From ce313016637e3a1dd28fde1d9773e9225ecb5f1b Mon Sep 17 00:00:00 2001 From: bobijam Date: Wed, 9 Jul 2008 01:31:13 +0000 Subject: [PATCH] Branch b1_6 b=15825 o=green i=shadow, bobijam Description: Kernel BUG tries to release flock Details : Lustre does not destroy flock lock before last reference goes away. So always drop flock locks when client is evicted and perform unlock regardless of successfulness of speaking to MDS. --- lustre/ChangeLog | 7 +++++++ lustre/ldlm/ldlm_lock.c | 1 + lustre/llite/file.c | 6 ++++-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lustre/ChangeLog b/lustre/ChangeLog index 7e8525a..46be4f4 100644 --- a/lustre/ChangeLog +++ b/lustre/ChangeLog @@ -36,6 +36,13 @@ tbd Sun Microsystems, Inc. 'tunefs.lustre --param="ost.quota_type=ug2" $MDTDEV' For more information, please refer to bugzilla 13904. +Severity : normal +Bugzilla : 15825 +Description: Kernel BUG tries to release flock +Details : Lustre does not destroy flock lock before last reference goes + away. So always drop flock locks when client is evicted and + perform unlock regardless of successfulness of speaking to MDS. + Severity : enhancement Bugzilla : 16189 Description: Update to RHEL4 kernel-2.6.9-67.0.20. diff --git a/lustre/ldlm/ldlm_lock.c b/lustre/ldlm/ldlm_lock.c index 2c25f41..1225f2c 100644 --- a/lustre/ldlm/ldlm_lock.c +++ b/lustre/ldlm/ldlm_lock.c @@ -193,6 +193,7 @@ void ldlm_lock_add_to_lru_nolock(struct ldlm_lock *lock) struct ldlm_namespace *ns = lock->l_resource->lr_namespace; lock->l_last_used = cfs_time_current(); LASSERT(list_empty(&lock->l_lru)); + LASSERT(lock->l_resource->lr_type != LDLM_FLOCK); list_add_tail(&lock->l_lru, &ns->ns_unused_list); LASSERT(ns->ns_nr_unused >= 0); ns->ns_nr_unused++; diff --git a/lustre/llite/file.c b/lustre/llite/file.c index 66e4f8a..36f15fb 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -2745,10 +2745,12 @@ int ll_file_flock(struct file *file, int cmd, struct file_lock *file_lock) rc = ldlm_cli_enqueue(sbi->ll_mdc_exp, NULL, &einfo, res_id, &flock, &flags, NULL, 0, NULL, &lockh, 0); - if ((file_lock->fl_flags & FL_FLOCK) && (rc == 0)) + if ((file_lock->fl_flags & FL_FLOCK) && + (rc == 0 || file_lock->fl_type == F_UNLCK)) ll_flock_lock_file_wait(file, file_lock, (cmd == F_SETLKW)); #ifdef HAVE_F_OP_FLOCK - if ((file_lock->fl_flags & FL_POSIX) && (rc == 0) && + if ((file_lock->fl_flags & FL_POSIX) && + (rc == 0 || file_lock->fl_type == F_UNLCK) && !(flags & LDLM_FL_TEST_LOCK)) posix_lock_file_wait(file, file_lock); #endif -- 1.8.3.1