Whamcloud - gitweb
b=22573 do not skip previously granted locks in osc_lock_enqueue_wait().
[fs/lustre-release.git] / lustre / osc / osc_lock.c
index 0d4e383..5685124 100644 (file)
@@ -1037,7 +1037,7 @@ static int osc_lock_enqueue_wait(const struct lu_env *env,
         struct cl_lock          *lock    = olck->ols_cl.cls_lock;
         struct cl_lock_descr    *descr   = &lock->cll_descr;
         struct cl_object_header *hdr     = cl_object_header(descr->cld_obj);
-        struct cl_lock          *scan    = lock;
+        struct cl_lock          *scan;
         struct cl_lock          *conflict= NULL;
         int lockless                     = osc_lock_is_lockless(olck);
         int rc                           = 0;
@@ -1052,10 +1052,13 @@ static int osc_lock_enqueue_wait(const struct lu_env *env,
                 return 0;
 
         cfs_spin_lock(&hdr->coh_lock_guard);
-        cfs_list_for_each_entry_continue(scan, &hdr->coh_locks, cll_linkage) {
+        cfs_list_for_each_entry(scan, &hdr->coh_locks, cll_linkage) {
                 struct cl_lock_descr *cld = &scan->cll_descr;
                 const struct osc_lock *scan_ols;
 
+                if (scan == lock)
+                        break;
+
                 if (scan->cll_state < CLS_QUEUING ||
                     scan->cll_state == CLS_FREEING ||
                     cld->cld_start > descr->cld_end ||
@@ -1558,8 +1561,7 @@ static void osc_lock_lockless_state(const struct lu_env *env,
                  * host object */
                 if (cl_object_same(oio->oi_cl.cis_obj, slice->cls_obj))
                         oio->oi_lockless = 1;
-        } else
-                lock->ols_owner = NULL;
+        }
 }
 
 static int osc_lock_lockless_fits_into(const struct lu_env *env,
@@ -1572,9 +1574,7 @@ static int osc_lock_lockless_fits_into(const struct lu_env *env,
         if (!(need->cld_enq_flags & CEF_NEVER))
                 return 0;
 
-        /* To solve the problem of stacking echo client upon osc directly.
-         * see bug 22147 for details.
-         */
+        /* lockless lock should only be used by its owning io. b22147 */
         return (lock->ols_owner == osc_env_io(env));
 }