Whamcloud - gitweb
LU-4833 osd-zfs: object leak in __osd_object_create 62/10362/3
authorIsaac Huang <he.huang@intel.com>
Mon, 19 May 2014 05:59:16 +0000 (23:59 -0600)
committerOleg Drokin <oleg.drokin@intel.com>
Thu, 12 Jun 2014 20:38:47 +0000 (20:38 +0000)
__osd_object_create() should free newly created
object upon error.

Signed-off-by: Isaac Huang <he.huang@intel.com>
Change-Id: Ie1d487765b8b4e85c3136161f21ab8260a6177b2
Reviewed-on: http://review.whamcloud.com/10362
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Mike Pershin <mike.pershin@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/osd-zfs/osd_object.c

index 151ad39..b502585 100644 (file)
@@ -1226,10 +1226,6 @@ int __osd_object_create(const struct lu_env *env, udmu_objset_t *uos,
        int      rc;
 
        LASSERT(tag);
-       spin_lock(&uos->lock);
-       uos->objects++;
-       spin_unlock(&uos->lock);
-
        /* Assert that the transaction has been assigned to a
           transaction group. */
        LASSERT(tx->tx_txg != 0);
@@ -1238,14 +1234,24 @@ int __osd_object_create(const struct lu_env *env, udmu_objset_t *uos,
        oid = dmu_object_alloc(uos->os, DMU_OT_PLAIN_FILE_CONTENTS, 0,
                               DMU_OT_SA, DN_MAX_BONUSLEN, tx);
        rc = -sa_buf_hold(uos->os, oid, tag, dbp);
-       if (rc)
-               return rc;
+       LASSERTF(rc == 0, "sa_buf_hold "LPU64" failed: %d\n", oid, rc);
 
        LASSERT(la->la_valid & LA_MODE);
        la->la_size = 0;
        la->la_nlink = 1;
 
-       return __osd_attr_init(env, uos, oid, tx, la, parent);
+       rc = __osd_attr_init(env, uos, oid, tx, la, parent);
+       if (rc != 0) {
+               sa_buf_rele(*dbp, tag);
+               *dbp = NULL;
+               dmu_object_free(uos->os, oid, tx);
+               return rc;
+       }
+
+       spin_lock(&uos->lock);
+       uos->objects++;
+       spin_unlock(&uos->lock);
+       return 0;
 }
 
 /*