Whamcloud - gitweb
Don't allow make backward step on assigning osc next id.
authorshadow <shadow>
Thu, 17 Sep 2009 08:21:53 +0000 (08:21 +0000)
committershadow <shadow>
Thu, 17 Sep 2009 08:21:53 +0000 (08:21 +0000)
Branch b1_8
b=19557
i=tappro
i=jay

lustre/ChangeLog
lustre/osc/osc_request.c

index 2092d93..83796db 100644 (file)
@@ -14,6 +14,12 @@ tbd Sun Microsystems, Inc.
          of Lustre filesystem with 4K stack may cause a stack overflow. For
          more information, please refer to bugzilla 17630.
 
+Severity   : normal
+Bugzilla   : 19557
+Description: Don't allow make backward step on assign osc next id.
+Details    : race between allocation next id and ll_sync thread can be cause
+             of set wrong osc next id and can be kill valid ost objects.
+
 Severity   : enhancement
 Bugzilla   : 20200
 Description: Added sanity-quota test to for lfs(1) to work with numeric uid/gid.
index 1285272..5ab3e72 100644 (file)
@@ -3984,18 +3984,30 @@ static int osc_set_info_async(struct obd_export *exp, obd_count keylen,
         OBD_FAIL_TIMEOUT(OBD_FAIL_OSC_SHUTDOWN, 10);
 
         if (KEY_IS(KEY_NEXT_ID)) {
+                obd_id new_val;
+                struct osc_creator *oscc = &obd->u.cli.cl_oscc;
+
                 if (vallen != sizeof(obd_id))
                         RETURN(-EINVAL);
-                obd->u.cli.cl_oscc.oscc_next_id = *((obd_id*)val) + 1;
+
+                /* avoid race between allocate new object and set next id
+                 * from ll_sync thread */
+                spin_lock(&oscc->oscc_lock);
+                new_val = *((obd_id*)val) + 1;
+                if (new_val > oscc->oscc_next_id)
+                        oscc->oscc_next_id = new_val;
+                spin_unlock(&oscc->oscc_lock);
+
                 CDEBUG(D_HA, "%s: set oscc_next_id = "LPU64"\n",
                        exp->exp_obd->obd_name,
-                       obd->u.cli.cl_oscc.oscc_next_id);
+                       oscc->oscc_next_id);
 
                 RETURN(0);
         }
 
         if (KEY_IS(KEY_UNLINKED)) {
                 struct osc_creator *oscc = &obd->u.cli.cl_oscc;
+
                 spin_lock(&oscc->oscc_lock);
                 oscc->oscc_flags &= ~OSCC_FLAG_NOSPC;
                 spin_unlock(&oscc->oscc_lock);