return next->mo_ops->moo_mkdir(ctxt, next, name, md_child);
}
-int cmm_xattr_get(struct lu_context *ctxt, struct md_object *obj,
- void *buf, int size, const char *name, struct md_params *arg)
+int cmm_attr_get(struct lu_context *ctxt, struct md_object *obj,
+ struct lu_attr *attr)
{
struct md_object *next = cmm2child_obj(md2cmm_obj(obj));
- return next->mo_ops->moo_xattr_get(ctxt, next, buf, size, name, arg);
+ return next->mo_ops->moo_attr_get(ctxt, next, attr);
}
static struct md_object_operations cmm_mo_ops = {
.moo_mkdir = cmm_mkdir,
- .moo_xattr_get = cmm_xattr_get,
+ .moo_attr_get = cmm_attr_get,
+// .moo_attr_set = cmm_attr_set,
// .moo_rename = cmm_rename,
// .moo_link = cmm_link,
+// .moo_xattr_get = cmm_xattr_get,
// .moo_xattr_set = cmm_xattr_set,
// .moo_index_insert = cmm_index_insert,
// .moo_index_delete = cmm_index_delete,
struct dt_object *dt,
struct thandle *th);
+ int (*do_attr_get)(struct lu_context *ctxt, struct dt_object *dt,
+ struct lu_attr *attr);
+ int (*do_attr_set)(struct lu_context *ctxt, struct dt_object *dt,
+ struct lu_attr *attr, struct thandle *handle);
+
int (*do_xattr_get)(struct lu_context *ctxt, struct dt_object *dt,
void *buf, int buf_len, const char *name,
struct md_params *arg);
struct md_object *sobj, const char *name,
struct md_params *arg);
+ int (*moo_attr_get)(struct lu_context *ctxt, struct md_object *dt,
+ struct lu_attr *attr);
+ int (*moo_attr_set)(struct lu_context *ctxt, struct md_object *dt,
+ struct lu_attr *attr);
+
int (*moo_xattr_get)(struct lu_context *ctxt, struct md_object *obj,
void *buf, int buf_len, const char *name,
struct md_params *arg);
}
static int
+mdd_attr_get(struct lu_context *ctxt,
+ struct md_object *obj, struct lu_attr *attr)
+{
+ struct mdd_object *mdd_obj = mdo2mddo(obj);
+ struct dt_object *next = mdd_object_child(mdd_obj);
+ int rc;
+
+ ENTRY;
+
+ rc = next->do_ops->do_attr_get(ctxt, next, attr);
+ RETURN(rc);
+}
+
+static int
mdd_xattr_get(struct lu_context *ctxt, struct md_object *obj, void *buf,
int buf_len, const char *name,
struct md_params *arg)
MDD_OBJECT_DESTROY_CREDITS = 10,
MDD_OBJECT_CREATE_CREDITS = 10,
MDD_ATTR_SET_CREDITS = 10,
+ MDD_XATTR_SET_CREDITS = 10,
MDD_INDEX_INSERT_CREDITS = 10,
MDD_INDEX_DELETE_CREDITS = 10,
MDD_LINK_CREDITS = 10,
static void mdd_object_release(struct lu_context *ctxt, struct lu_object *o)
{
- struct mdd_object *obj = mdd_obj(o);
- int rc;
- int nlink;
-
- rc = mdd_xattr_get(ctxt, &obj->mod_obj, &nlink,
- sizeof(nlink), "NLINK", NULL);
- if (rc == 0) {
- if (nlink == 0)
- rc = mdd_object_destroy(ctxt, &obj->mod_obj);
- } else
- CERROR("Failed to get nlink: %d. Pretending nonzero.\n", rc);
}
static int mdd_object_print(struct lu_context *ctxt,
RETURN(rc);
}
+
+static int
+__mdd_attr_set(struct lu_context *ctxt, struct md_object *obj,
+ struct lu_attr *attr, struct thandle *handle)
+{
+ struct dt_object *next = mdd_object_child(mdo2mddo(obj));
+ return next->do_ops->do_attr_set(ctxt, next, attr, handle);
+}
+
+static int
+mdd_attr_set(struct lu_context *ctxt,
+ struct md_object *obj, struct lu_attr *attr)
+{
+ struct mdd_device *mdd = mdo2mdd(obj);
+ struct thandle *handle;
+ int rc;
+ ENTRY;
+
+ handle = mdd_trans_start(ctxt, mdd, &TXN_PARAM(MDD_ATTR_SET_CREDITS));
+ if (!handle)
+ RETURN(-ENOMEM);
+
+ rc = __mdd_attr_set(ctxt, obj, attr, handle);
+
+ mdd_trans_stop(ctxt, mdd, handle);
+
+ RETURN(rc);
+}
+
+
+
static int
__mdd_xattr_set(struct lu_context *ctxt, struct mdd_device *mdd,
struct mdd_object *obj, void *buf,
int rc;
ENTRY;
- handle = mdd_trans_start(ctxt, mdd, &TXN_PARAM(MDD_ATTR_SET_CREDITS));
+ handle = mdd_trans_start(ctxt, mdd, &TXN_PARAM(MDD_XATTR_SET_CREDITS));
if (!handle)
RETURN(-ENOMEM);
.moo_mkdir = mdd_mkdir,
.moo_rename = mdd_rename,
.moo_link = mdd_link,
+ .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_index_insert = mdd_index_insert,
static void osd_key_fini (struct lu_context *ctx, void *data);
static int osd_fid_lookup (struct lu_context *ctx, struct osd_object *obj,
const struct lu_fid *fid);
+static int osd_inode_getattr (struct lu_context *ctx,
+ struct inode *inode, struct lu_attr *attr);
static struct osd_object *osd_obj (const struct lu_object *o);
static struct osd_device *osd_dev (const struct lu_device *d);
static struct lprocfs_vars lprocfs_osd_obd_vars[];
static struct lu_device_operations osd_lu_ops;
static struct lu_context_key osd_key;
+static struct dt_object_operations osd_obj_ops;
/*
* DT methods.
l = &mo->oo_dt.do_lu;
lu_object_init(l, NULL, d);
+ mo->oo_dt.do_ops = &osd_obj_ops;
return l;
} else
return NULL;
}
-static int osd_getattr(struct lu_context *ctx,
- struct inode *inode, struct lu_attr *attr)
-{
- //attr->la_atime = inode->i_atime;
- //attr->la_mtime = inode->i_mtime;
- //attr->la_ctime = inode->i_ctime;
- attr->la_mode = inode->i_mode;
- attr->la_size = inode->i_size;
- attr->la_blocks = inode->i_blocks;
- attr->la_uid = inode->i_uid;
- attr->la_gid = inode->i_gid;
- attr->la_flags = inode->i_flags;
- attr->la_nlink = inode->i_nlink;
- return 0;
-}
-
static int osd_object_init(struct lu_context *ctxt, struct lu_object *l)
{
- struct osd_object *o = osd_obj(l);
- int result;
-
- result = osd_fid_lookup(ctxt, o, lu_object_fid(l));
- if (result == 0)
- /* fill lu_attr in ctxt */
- result = osd_getattr(ctxt, o->oo_inode, &ctxt->lc_attr);
- return result;
+ return osd_fid_lookup(ctxt, osd_obj(l), lu_object_fid(l));
}
static void osd_object_free(struct lu_context *ctx, struct lu_object *l)
RETURN (result);
}
-static int osd_xattr_get(struct lu_context *ctxt, struct dt_object *dt,
- void *buf, int size, const char *name,
- struct md_params *arg)
+static int osd_attr_get(struct lu_context *ctxt, struct dt_object *dt,
+ struct lu_attr *attr)
{
- //struct osd_object *o = dt2osd_obj(dt);
- //struct osd_device *dev = osd_obj2dev(o);
- //struct super_block *sb = osd_sb(dev);
- //struct inode *inode = o->oo_inode;
- int result = -EOPNOTSUPP;
-
- ENTRY;
-
- memset(buf, 0, size);
- //TODO
- RETURN (result);
-
+ return osd_inode_getattr(ctxt, dt2osd_obj(dt)->oo_inode, attr);
}
+static struct dt_object_operations osd_obj_ops = {
+ .do_attr_get = osd_attr_get
+};
+
static struct dt_device_operations osd_dt_ops = {
.dt_root_get = osd_root_get,
.dt_config = osd_config,
RETURN(result);
}
+static int osd_inode_getattr(struct lu_context *ctx,
+ struct inode *inode, struct lu_attr *attr)
+{
+ //attr->la_atime = inode->i_atime;
+ //attr->la_mtime = inode->i_mtime;
+ //attr->la_ctime = inode->i_ctime;
+ attr->la_mode = inode->i_mode;
+ attr->la_size = inode->i_size;
+ attr->la_blocks = inode->i_blocks;
+ attr->la_uid = inode->i_uid;
+ attr->la_gid = inode->i_gid;
+ attr->la_flags = inode->i_flags;
+ attr->la_nlink = inode->i_nlink;
+ return 0;
+}
+
/*
* Helpers.
*/