Whamcloud - gitweb
Branch b1_8
authorbobijam <bobijam>
Wed, 9 Jul 2008 01:29:21 +0000 (01:29 +0000)
committerbobijam <bobijam>
Wed, 9 Jul 2008 01:29:21 +0000 (01:29 +0000)
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
lustre/ldlm/ldlm_lock.c
lustre/llite/file.c

index 4b9d0f5..e178cfe 100644 (file)
@@ -37,6 +37,13 @@ tbd Sun Microsystems, Inc.
          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   : normal
 Bugzilla   : 15210
 Description: add recount protection for osc callbacks, so avoid panic on shutdown
 
index 2c25f41..1225f2c 100644 (file)
@@ -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++;
index 2031dc4..2487e6a 100644 (file)
@@ -2744,10 +2744,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