From a95e9e1c4f845249f83498f9650aa9c49a0dca60 Mon Sep 17 00:00:00 2001 From: Isaac Huang Date: Sun, 18 May 2014 23:59:16 -0600 Subject: [PATCH 1/1] LU-4833 osd-zfs: object leak in __osd_object_create __osd_object_create() should free newly created object upon error. Signed-off-by: Isaac Huang Change-Id: Ie1d487765b8b4e85c3136161f21ab8260a6177b2 Reviewed-on: http://review.whamcloud.com/10362 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Mike Pershin Reviewed-by: Oleg Drokin --- lustre/osd-zfs/osd_object.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/lustre/osd-zfs/osd_object.c b/lustre/osd-zfs/osd_object.c index 151ad39..b502585 100644 --- a/lustre/osd-zfs/osd_object.c +++ b/lustre/osd-zfs/osd_object.c @@ -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; } /* -- 1.8.3.1