From: nikita Date: Sun, 16 Apr 2006 19:48:05 +0000 (+0000) Subject: add ->{dt,md}_attr_{get,set} X-Git-Tag: v1_8_0_110~486^2~1982 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=c2102465e21a7391007214921ca9c7d33da97687;p=fs%2Flustre-release.git add ->{dt,md}_attr_{get,set} --- diff --git a/lustre/cmm/cmm_object.c b/lustre/cmm/cmm_object.c index cc4a165..06fe7ef 100644 --- a/lustre/cmm/cmm_object.c +++ b/lustre/cmm/cmm_object.c @@ -150,19 +150,21 @@ int cmm_mkdir(struct lu_context *ctxt, struct md_object *md_parent, 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, diff --git a/lustre/include/linux/lu_object.h b/lustre/include/linux/lu_object.h index 1834708..becdc08 100644 --- a/lustre/include/linux/lu_object.h +++ b/lustre/include/linux/lu_object.h @@ -540,6 +540,11 @@ struct dt_object_operations { 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); diff --git a/lustre/include/linux/md_object.h b/lustre/include/linux/md_object.h index f9dd38d..0de87aa 100644 --- a/lustre/include/linux/md_object.h +++ b/lustre/include/linux/md_object.h @@ -51,6 +51,11 @@ struct md_object_operations { 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); diff --git a/lustre/mdd/mdd_handler.c b/lustre/mdd/mdd_handler.c index 101f9d1..378aa01 100644 --- a/lustre/mdd/mdd_handler.c +++ b/lustre/mdd/mdd_handler.c @@ -144,6 +144,20 @@ static void mdd_object_free(struct lu_context *ctxt, struct lu_object *o) } 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) @@ -200,6 +214,7 @@ enum { 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, @@ -238,17 +253,6 @@ mdd_object_destroy(struct lu_context *ctxt, struct md_object *obj) 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, @@ -401,6 +405,37 @@ mdd_object_create(struct lu_context *ctxt, struct md_object *pobj, 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, @@ -421,7 +456,7 @@ mdd_xattr_set(struct lu_context *ctxt, struct md_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); @@ -689,6 +724,8 @@ static struct md_object_operations mdd_obj_ops = { .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, diff --git a/lustre/osd/osd_handler.c b/lustre/osd/osd_handler.c index a687f41..d4abee1 100644 --- a/lustre/osd/osd_handler.c +++ b/lustre/osd/osd_handler.c @@ -74,6 +74,8 @@ static void *osd_key_init (struct lu_context *ctx); 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); @@ -96,6 +98,7 @@ static struct lprocfs_vars lprocfs_osd_module_vars[]; 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. @@ -123,37 +126,15 @@ static struct lu_object *osd_object_alloc(struct lu_context *ctx, 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) @@ -222,24 +203,16 @@ static int osd_statfs(struct lu_context *ctx, 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, @@ -481,6 +454,22 @@ static int osd_fid_lookup(struct lu_context *ctx, 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. */