From: wangdi Date: Thu, 8 Jun 2006 09:49:12 +0000 (+0000) Subject: Branch: b_new_cmd X-Git-Tag: v1_8_0_110~486^2~1653 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=fccc55df6bb3d5935705229a0055951aa637ac3e;p=fs%2Flustre-release.git Branch: b_new_cmd add ref_add/del api for mdd/osd --- diff --git a/lustre/include/dt_object.h b/lustre/include/dt_object.h index 4770f1c..ead68c2 100644 --- a/lustre/include/dt_object.h +++ b/lustre/include/dt_object.h @@ -221,6 +221,22 @@ struct dt_object_operations { struct dt_object *dt, const struct dt_index_features *feat, struct dt_index_cookie *cookie); + /* + * Add nlink of the object + * precondition: lu_object_exists(ctxt, &dt->do_lu); + */ + + int (*do_object_ref_add)(const struct lu_context *ctxt, + struct dt_object *dt); + + /* + * Del nlink of the object + * precondition: lu_object_exists(ctxt, &dt->do_lu); + */ + + int (*do_object_ref_del)(const struct lu_context *ctxt, + struct dt_object *dt); + }; /* diff --git a/lustre/mdd/mdd_handler.c b/lustre/mdd/mdd_handler.c index 12d61ff..a3fb7d0 100644 --- a/lustre/mdd/mdd_handler.c +++ b/lustre/mdd/mdd_handler.c @@ -438,7 +438,7 @@ static struct lu_object_operations mdd_lu_obj_ops = { .loo_object_release = mdd_object_release, .loo_object_free = mdd_object_free, .loo_object_print = mdd_object_print, - .loo_object_exists = mdd_object_exists + .loo_object_exists = mdd_object_exists, }; static struct dt_object* mdd_object_child(struct mdd_object *o) @@ -879,6 +879,37 @@ static int mdd_statfs(const struct lu_context *ctx, RETURN(rc); } +static int mdd_ref_add(const struct lu_context *ctxt, struct md_object *obj) +{ + struct mdd_object *mdd_obj = mdo2mddo(obj); + struct dt_object *next; + int rc; + ENTRY; + + if (!mdd_object_exists(ctxt, &obj->mo_lu)) { + next = mdd_object_child(mdd_obj); + rc = next->do_ops->do_object_ref_add(ctxt, next); + } else + rc = -ENOENT; + RETURN(rc); +} + +static int mdd_ref_del(const struct lu_context *ctxt, struct md_object *obj) +{ + struct mdd_object *mdd_obj = mdo2mddo(obj); + struct dt_object *next; + int rc; + ENTRY; + + if (!mdd_object_exists(ctxt, &obj->mo_lu)) { + next = mdd_object_child(mdd_obj); + rc = next->do_ops->do_object_ref_del(ctxt, next); + } else + rc = -ENOENT; + + RETURN(0); +} + struct md_device_operations mdd_ops = { .mdo_root_get = mdd_root_get, .mdo_config = mdd_config, @@ -894,12 +925,15 @@ static struct md_dir_operations mdd_dir_ops = { .mdo_name_insert = mdd_mkname }; + static struct md_object_operations mdd_obj_ops = { .moo_attr_get = mdd_attr_get, .moo_attr_set = mdd_attr_set, .moo_xattr_get = mdd_xattr_get, .moo_xattr_set = mdd_xattr_set, - .moo_object_create = mdd_object_create + .moo_object_create = mdd_object_create, + .moo_ref_add = mdd_ref_add, + .moo_ref_del = mdd_ref_del, }; static struct obd_ops mdd_obd_device_ops = { diff --git a/lustre/osd/osd_handler.c b/lustre/osd/osd_handler.c index f59a395..e4b6104 100644 --- a/lustre/osd/osd_handler.c +++ b/lustre/osd/osd_handler.c @@ -593,12 +593,43 @@ static int osd_object_create(const struct lu_context *ctx, struct dt_object *dt, return result; } +static void osd_inode_inc_link(const struct lu_context *ctxt, + struct inode *inode) +{ + inode->i_nlink ++; +} + + +static void osd_inode_dec_link(const struct lu_context *ctxt, + struct inode *inode) +{ + inode->i_nlink --; +} + +static int osd_object_ref_add(const struct lu_context *ctxt, + struct dt_object *dt) +{ + LASSERT(lu_object_exists(ctxt, &dt->do_lu)); + osd_inode_inc_link(ctxt, osd_dt_obj(dt)->oo_inode); + return 0; +} + +static int osd_object_ref_del(const struct lu_context *ctxt, + struct dt_object *dt) +{ + LASSERT(lu_object_exists(ctxt, &dt->do_lu)); + osd_inode_dec_link(ctxt, osd_dt_obj(dt)->oo_inode); + return 0; +} + static struct dt_object_operations osd_obj_ops = { .do_object_lock = osd_object_lock, .do_object_unlock = osd_object_unlock, .do_attr_get = osd_attr_get, .do_object_create = osd_object_create, - .do_object_index_try = osd_index_try + .do_object_index_try = osd_index_try, + .do_object_ref_add = osd_object_ref_add, + .do_object_ref_del = osd_object_ref_del }; static struct dt_body_operations osd_body_ops = {