Whamcloud - gitweb
Branch: b_new_cmd
authorwangdi <wangdi>
Thu, 8 Jun 2006 09:49:12 +0000 (09:49 +0000)
committerwangdi <wangdi>
Thu, 8 Jun 2006 09:49:12 +0000 (09:49 +0000)
add ref_add/del api for mdd/osd

lustre/include/dt_object.h
lustre/mdd/mdd_handler.c
lustre/osd/osd_handler.c

index 4770f1c..ead68c2 100644 (file)
@@ -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);
+
 };
 
 /*
index 12d61ff..a3fb7d0 100644 (file)
@@ -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 = {
index f59a395..e4b6104 100644 (file)
@@ -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 = {