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);
+
};
/*
.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)
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,
.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 = {
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 = {