From 0cb0bede48fdb510c9019c8d621ae30f84871288 Mon Sep 17 00:00:00 2001 From: nikita Date: Tue, 16 May 2006 17:03:46 +0000 Subject: [PATCH] add few dt_index_operations stubs --- lustre/osd/osd_handler.c | 123 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 115 insertions(+), 8 deletions(-) diff --git a/lustre/osd/osd_handler.c b/lustre/osd/osd_handler.c index 9ac7fb7..32c9aa7 100644 --- a/lustre/osd/osd_handler.c +++ b/lustre/osd/osd_handler.c @@ -84,6 +84,8 @@ static void osd_device_free (struct lu_device *m); static int osd_device_init (struct lu_device *d, struct lu_device *); static void *osd_key_init (struct lu_context *ctx); static void osd_key_fini (struct lu_context *ctx, void *data); +static int osd_has_index (struct osd_object *obj); +static void osd_object_init0 (struct osd_object *obj); 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, @@ -92,6 +94,14 @@ static int osd_inode_get_fid (struct osd_device *d, const struct inode *inode, struct lu_fid *fid); static int osd_param_is_sane (const struct osd_device *dev, const struct txn_param *param); +static int osd_index_lookup (struct lu_context *ctxt, struct dt_object *dt, + struct dt_rec *rec, const struct dt_key *key); +static int osd_index_insert (struct lu_context *ctxt, struct dt_object *dt, + const struct dt_rec *rec, + const struct dt_key *key, + struct thandle *handle); +static int osd_index_probe (struct lu_context *ctxt, struct dt_object *dt, + const struct dt_index_features *feat); static struct osd_object *osd_obj (const struct lu_object *o); static struct osd_device *osd_dev (const struct lu_device *d); @@ -162,6 +172,16 @@ static struct lu_object *osd_object_alloc(struct lu_context *ctx, return NULL; } +static void osd_object_init0(struct osd_object *obj) +{ + LASSERT(obj->oo_inode != NULL); + + if (osd_has_index(obj)) + obj->oo_dt.do_index_ops = &osd_index_ops; + else + obj->oo_dt.do_body_ops = &osd_body_ops; +} + static int osd_object_init(struct lu_context *ctxt, struct lu_object *l) { struct osd_object *obj = osd_obj(l); @@ -169,12 +189,8 @@ static int osd_object_init(struct lu_context *ctxt, struct lu_object *l) result = osd_fid_lookup(ctxt, obj, lu_object_fid(l)); if (result == 0) { - if (obj->oo_inode != NULL) { - if (S_ISDIR(obj->oo_inode->i_mode)) - obj->oo_dt.do_index_ops = &osd_index_ops; - else - obj->oo_dt.do_body_ops = &osd_body_ops; - } + if (obj->oo_inode != NULL) + osd_object_init0(obj); } return result; } @@ -384,6 +400,9 @@ static int osd_create_pre(struct osd_thread_info *info, struct osd_object *obj, static int osd_create_post(struct osd_thread_info *info, struct osd_object *obj, struct lu_attr *attr, struct thandle *th) { + LASSERT(obj->oo_inode != NULL); + + osd_object_init0(obj); return 0; } @@ -527,15 +546,98 @@ static struct dt_object_operations osd_obj_ops = { static struct dt_body_operations osd_body_ops = { }; +/* + * Index operations. + */ + +/* + * XXX This is temporary solution: inode operations are used until iam is + * ready. + */ +static int osd_index_lookup(struct lu_context *ctxt, struct dt_object *dt, + struct dt_rec *rec, const struct dt_key *key) +{ + struct osd_object *obj = osd_dt_obj(dt); + struct osd_device *osd = osd_obj2dev(obj); + struct inode *dir; + + int result; + + /* + * XXX temporary solution. + */ + struct dentry *dentry; + struct qstr str = { + .name = (const char *)key, + .len = strlen((const char *)key) + }; + + LASSERT(osd_has_index(obj)); + LASSERT(osd->od_obj_area != NULL); + + dir = obj->oo_inode; + LASSERT(dir->i_op != NULL && dir->i_op->lookup != NULL); + + dentry = d_alloc(NULL, &str); + if (dentry != NULL) { + struct dentry *d; + + /* + * XXX passing NULL for nameidata should work for + * ext3/ldiskfs. + */ + d = dir->i_op->lookup(dir, dentry, NULL); + if (d == NULL) { + /* + * normal case, result is in @dentry. + */ + if (dentry->d_inode != NULL) { + struct lu_fid *fid = (struct lu_fid *)rec; + /* + * Build fid from inode. + */ + fid->f_seq = 0; /* XXX hard-coded */ + fid->f_oid = dentry->d_inode->i_ino; + fid->f_ver = dentry->d_inode->i_generation; + result = 0; + } else + result = -ENOENT; + } else { + /* What? Disconnected alias? Ppheeeww... */ + CERROR("Aliasing where not expected\n"); + result = -EIO; + dput(d); + } + dput(dentry); + } else + result = -ENOMEM; + return result; +} + static int osd_index_insert(struct lu_context *ctxt, struct dt_object *dt, - const struct lu_fid *fid, const char *name, + const struct dt_rec *rec, const struct dt_key *key, struct thandle *handle) { return 0; } +struct dt_index_features dt_directory_features; + +static int osd_index_probe(struct lu_context *ctxt, struct dt_object *dt, + const struct dt_index_features *feat) +{ + struct osd_object *obj = osd_dt_obj(dt); + + if (feat == &dt_directory_features) + return 1; + else + return 0; /* nothing yet is supported */ +} + static struct dt_index_operations osd_index_ops = { - .dio_index_insert = osd_index_insert, + .dio_lookup = osd_index_lookup, + .dio_insert = osd_index_insert, + .dio_probe = osd_index_probe }; /* @@ -894,6 +996,11 @@ static journal_t *osd_journal(const struct osd_device *dev) return LDISKFS_SB(osd_sb(dev))->s_journal; } +static int osd_has_index(struct osd_object *obj) +{ + return S_ISDIR(obj->oo_inode->i_mode); +} + static struct lu_object_operations osd_lu_obj_ops = { .loo_object_init = osd_object_init, .loo_object_delete = osd_object_delete, -- 1.8.3.1