From 3732b884f387b80b23c3ba3039e2198dc596dc67 Mon Sep 17 00:00:00 2001 From: nikita Date: Mon, 6 Nov 2006 11:21:29 +0000 Subject: [PATCH] osd: fix ipd handling for iterators. --- lustre/osd/osd_handler.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/lustre/osd/osd_handler.c b/lustre/osd/osd_handler.c index 42df505..d405773 100644 --- a/lustre/osd/osd_handler.c +++ b/lustre/osd/osd_handler.c @@ -1678,8 +1678,9 @@ static int osd_index_insert(const struct lu_env *env, struct dt_object *dt, * Iterator operations. */ struct osd_it { - struct osd_object *oi_obj; - struct iam_iterator oi_it; + struct osd_object *oi_obj; + struct iam_path_descr *oi_ipd; + struct iam_iterator oi_it; }; static struct dt_it *osd_it_init(const struct lu_env *env, @@ -1699,27 +1700,31 @@ static struct dt_it *osd_it_init(const struct lu_env *env, CAPA_OPC_BODY_READ)) return ERR_PTR(-EACCES); - ipd = osd_ipd_get(env, bag); - if (ipd == NULL) - return ERR_PTR(-ENOMEM); - flags = writable ? IAM_IT_MOVE|IAM_IT_WRITE : IAM_IT_MOVE; OBD_ALLOC_PTR(it); if (it != NULL) { - it->oi_obj = obj; - lu_object_get(lo); - iam_it_init(&it->oi_it, bag, flags, ipd); + ipd = osd_ipd_get(env, bag); + if (ipd != NULL) { + it->oi_obj = obj; + it->oi_ipd = ipd; + lu_object_get(lo); + iam_it_init(&it->oi_it, bag, flags, ipd); + return (struct dt_it *)it; + } else + OBD_FREE_PTR(it); + } - osd_ipd_put(env, bag, ipd); - return (struct dt_it *)it; + return ERR_PTR(-ENOMEM); } static void osd_it_fini(const struct lu_env *env, struct dt_it *di) { - struct osd_it *it = (struct osd_it *)di; + struct osd_it *it = (struct osd_it *)di; + struct osd_object *obj = it->oi_obj; iam_it_fini(&it->oi_it); - lu_object_put(env, &it->oi_obj->oo_dt.do_lu); + osd_ipd_put(env, &obj->oo_container, it->oi_ipd); + lu_object_put(env, &obj->oo_dt.do_lu); OBD_FREE_PTR(it); } -- 1.8.3.1