Whamcloud - gitweb
b=20183
authorzhanghc <zhanghc>
Tue, 18 Aug 2009 11:54:41 +0000 (11:54 +0000)
committerzhanghc <zhanghc>
Tue, 18 Aug 2009 11:54:41 +0000 (11:54 +0000)
fix a race in lov_update_create_set between lov_create and
osc_interpret_create/handle_async_create/cb_create_update

i=alexey.lyashkov@sun.com
i=andrew.perepechko@sun.com

lustre/lov/lov_internal.h
lustre/lov/lov_request.c

index 3c8ede2..19e9fd3 100644 (file)
@@ -82,6 +82,7 @@ struct lov_request_set {
         struct lov_lock_handles *set_lockh;
         struct list_head         set_list;
         cfs_waitq_t              set_waitq;
+        spinlock_t               set_lock;
 };
 
 extern cfs_mem_cache_t *lov_oinfo_slab;
index 2f7b8a4..9e898e3 100644 (file)
@@ -60,6 +60,7 @@ static void lov_init_set(struct lov_request_set *set)
         CFS_INIT_LIST_HEAD(&set->set_list);
         atomic_set(&set->set_refcount, 1);
         cfs_waitq_init(&set->set_waitq);
+        spin_lock_init(&set->set_lock);
 }
 
 static void lov_finish_set(struct lov_request_set *set)
@@ -672,9 +673,6 @@ int lov_update_create_set(struct lov_request_set *set,
         struct lov_obd *lov = &set->set_exp->exp_obd->u.lov;
         ENTRY;
 
-        req->rq_stripe = set->set_success;
-        loi = lsm->lsm_oinfo[req->rq_stripe];
-
         if (rc && lov->lov_tgts[req->rq_idx] &&
             lov->lov_tgts[req->rq_idx]->ltd_active) {
                 CERROR("error creating fid "LPX64" sub-object"
@@ -686,14 +684,19 @@ int lov_update_create_set(struct lov_request_set *set,
                         rc = -EIO;
                 }
         }
-        if (rc)
-                GOTO(out, rc);
+
+        spin_lock(&set->set_lock);
+        req->rq_stripe = set->set_success;
+        loi = lsm->lsm_oinfo[req->rq_stripe];
+        if (rc) {
+                lov_update_set(set, req, rc);
+                spin_unlock(&set->set_lock);
+                RETURN(rc);
+        }
 
         loi->loi_id = req->rq_oi.oi_oa->o_id;
         loi->loi_gr = req->rq_oi.oi_oa->o_gr;
         loi->loi_ost_idx = req->rq_idx;
-        CDEBUG(D_INODE, "objid "LPX64" has subobj "LPX64"/"LPU64" at idx %d\n",
-               lsm->lsm_object_id, loi->loi_id, loi->loi_id, req->rq_idx);
         loi_init(loi);
 
         if (oti && set->set_cookies)
@@ -701,8 +704,11 @@ int lov_update_create_set(struct lov_request_set *set,
         if (req->rq_oi.oi_oa->o_valid & OBD_MD_FLCOOKIE)
                 set->set_cookie_sent++;
 
-out:
         lov_update_set(set, req, rc);
+        spin_unlock(&set->set_lock);
+
+        CDEBUG(D_INODE, "objid "LPX64" has subobj "LPX64"/"LPU64" at idx %d\n",
+               lsm->lsm_object_id, loi->loi_id, loi->loi_id, req->rq_idx);
         RETURN(rc);
 }