From ef09bbec09d6c04b7beab2d7eb066059b0e0a655 Mon Sep 17 00:00:00 2001 From: nikita Date: Sun, 23 Apr 2006 19:00:46 +0000 Subject: [PATCH] - add struct lu_object_operations - add ->loo_exists() - add comments (for MDAPI DLD) - split part lu_object.h into dt_object.h --- lustre/cmm/cmm_device.c | 1 - lustre/cmm/cmm_internal.h | 2 - lustre/cmm/cmm_object.c | 28 +++-- lustre/fld/fld_seq.c | 2 + lustre/include/linux/Makefile.am | 2 +- lustre/include/linux/dt_object.h | 179 +++++++++++++++++++++++++++++++ lustre/include/linux/lu_object.h | 217 +++++++++++++++++--------------------- lustre/include/linux/lustre_fid.h | 13 +++ lustre/include/linux/md_object.h | 12 --- lustre/llite/dcache.c | 6 +- lustre/mdd/mdd_handler.c | 91 ++++++++-------- lustre/mdd/mdd_internal.h | 12 ++- lustre/mdt/mdt_handler.c | 20 +++- lustre/mgs/mgs_llog.c | 200 +++++++++++++++++------------------ lustre/obdclass/lu_object.c | 4 +- lustre/osd/osd_handler.c | 36 ++++++- lustre/osd/osd_internal.h | 2 +- 17 files changed, 525 insertions(+), 302 deletions(-) create mode 100644 lustre/include/linux/dt_object.h diff --git a/lustre/cmm/cmm_device.c b/lustre/cmm/cmm_device.c index 7760207..5eef9ef 100644 --- a/lustre/cmm/cmm_device.c +++ b/lustre/cmm/cmm_device.c @@ -105,7 +105,6 @@ static struct lu_device_operations cmm_lu_ops = { .ldo_object_init = cmm_object_init, .ldo_object_free = cmm_object_free, .ldo_object_release = cmm_object_release, - .ldo_object_print = cmm_object_print, .ldo_process_config = cmm_process_config }; diff --git a/lustre/cmm/cmm_internal.h b/lustre/cmm/cmm_internal.h index fbf81b0..3012c22 100644 --- a/lustre/cmm/cmm_internal.h +++ b/lustre/cmm/cmm_internal.h @@ -94,8 +94,6 @@ void cmm_object_free(struct lu_context *ctx, struct lu_object *o); void cmm_object_release(struct lu_context *ctxt, struct lu_object *o); //int cmm_getattr(struct lu_object *o, struct lu_attr *a); //int cmm_setattr(struct lu_object *o, struct lu_attr *a); -int cmm_object_print(struct lu_context *ctx, - struct seq_file *f, const struct lu_object *o); /* cmm md operations */ int cmm_config(struct lu_context *ctx, struct md_device *md, const char *name, diff --git a/lustre/cmm/cmm_object.c b/lustre/cmm/cmm_object.c index 662b08b..547aa33 100644 --- a/lustre/cmm/cmm_object.c +++ b/lustre/cmm/cmm_object.c @@ -35,6 +35,7 @@ #include "cmm_internal.h" static struct md_object_operations cmm_mo_ops; +static struct lu_object_operations cmm_obj_ops; struct lu_object *cmm_object_alloc(struct lu_context *ctx, struct lu_device *d) @@ -49,6 +50,7 @@ struct lu_object *cmm_object_alloc(struct lu_context *ctx, o = &mo->cmo_obj.mo_lu; lu_object_init(o, NULL, d); mo->cmo_obj.mo_ops = &cmm_mo_ops; + o->lo_ops = &cmm_obj_ops; RETURN(o); } else RETURN(NULL); @@ -62,17 +64,17 @@ int cmm_object_init(struct lu_context *ctxt, struct lu_object *o) //struct lu_fid *fid = &o->lo_header->loh_fid; //int mds_index; ENTRY; - + /* under device can be MDD or MDC */ #if 0 mds = cmm_fld_lookup(fid); if (mds_index != d->local_index) under = &d->cmm_lmv->md_lu_dev; - else + else #endif under = &d->cmm_child->md_lu_dev; - - + + below = under->ld_ops->ldo_object_alloc(ctxt, under); if (below != NULL) { lu_object_add(o, below); @@ -93,8 +95,15 @@ void cmm_object_release(struct lu_context *ctxt, struct lu_object *o) return; } -int cmm_object_print(struct lu_context *ctx, - struct seq_file *f, const struct lu_object *o) +static int cmm_object_exists(struct lu_context *ctx, struct lu_object *o) +{ + struct lu_object *next = lu_object_next(o); + + return next->lo_ops->loo_object_exists(ctx, next); +} + +static int cmm_object_print(struct lu_context *ctx, + struct seq_file *f, const struct lu_object *o) { return seq_printf(f, LUSTRE_CMM0_NAME"-object@%p", o); } @@ -180,9 +189,10 @@ static struct md_object_operations cmm_mo_ops = { // .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, -// .moo_object_create = cmm_object_create, }; +static struct lu_object_operations cmm_obj_ops = { + .loo_object_print = cmm_object_print, + .loo_object_exists = cmm_object_exists +}; diff --git a/lustre/fld/fld_seq.c b/lustre/fld/fld_seq.c index ee1e23a..23cb75d 100644 --- a/lustre/fld/fld_seq.c +++ b/lustre/fld/fld_seq.c @@ -37,8 +37,10 @@ #include #include +#include #include #include +#include #include "fld_internal.h" static int fld_handle(struct lu_context *ctx, diff --git a/lustre/include/linux/Makefile.am b/lustre/include/linux/Makefile.am index 13ca549..13f1389 100644 --- a/lustre/include/linux/Makefile.am +++ b/lustre/include/linux/Makefile.am @@ -15,4 +15,4 @@ EXTRA_DIST = lprocfs_status.h lustre_debug.h lustre_ha.h lustre_lib.h \ lustre_export.h lustre_log.h obd_echo.h \ lustre_compat25.h lustre_fsfilt.h lustre_import.h lustre_mds.h lustre_mdc.h \ lustre_acl.h obd.h lvfs.h lvfs_linux.h lustre_cfg.h lustre_lite.h lustre_idl.h \ - lustre_quota.h lustre_ucache.h lustre_ver.h.in lustre_param.h lu_object.h lustre_fid.h + lustre_quota.h lustre_ucache.h lustre_ver.h.in lustre_param.h lu_object.h lustre_fid.h md_object.h diff --git a/lustre/include/linux/dt_object.h b/lustre/include/linux/dt_object.h new file mode 100644 index 0000000..c58d390 --- /dev/null +++ b/lustre/include/linux/dt_object.h @@ -0,0 +1,179 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * + * Copyright (C) 2006 Cluster File Systems, Inc. + * + * This file is part of Lustre, http://www.lustre.org. + * + * Lustre is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * Lustre is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Lustre; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#ifndef __LINUX_DT_OBJECT_H +#define __LINUX_DT_OBJECT_H + +/* + * Sub-class of lu_object with methods common for "data" objects in OST stack. + * + * Data objects behave like regular files: you can read/write them, get and + * set their attributes. Implementation of dt interface is supposed to + * implement some form of garbage collection, normally reference counting + * (nlink) based one. + * + * Examples: osd (lustre/osd) is am implementation of dt interface. + */ + + +/* + * super-class definitions. + */ +#include + +#include +#include + +struct seq_file; +struct proc_dir_entry; +struct lustre_cfg; + +struct md_params; +struct thandle; +struct txn_param; +struct dt_device; +struct dt_object; + +/* + * Lock mode for DT objects. + */ +enum dt_lock_mode { + DT_WRITE_LOCK = 1, + DT_READ_LOCK = 2, +}; + +/* + * Operations on dt device. + */ +struct dt_device_operations { + /* + * Method for getting/setting device wide back stored config data, + * like last used meta-sequence, etc. + */ + int (*dt_config) (struct lu_context *ctx, + struct dt_device *dev, const char *name, + void *buf, int size, int mode); + /* + * Return device-wide statistics. + */ + int (*dt_statfs)(struct lu_context *ctx, + struct dt_device *dev, struct kstatfs *sfs); + /* + * Start transaction, described by @param. + */ + struct thandle *(*dt_trans_start)(struct lu_context *ctx, + struct dt_device *dev, + struct txn_param *param); + /* + * Finish previously started transaction. + */ + void (*dt_trans_stop)(struct lu_context *ctx, struct thandle *th); + /* + * Return fid of root index object. + */ + int (*dt_root_get)(struct lu_context *ctx, + struct dt_device *dev, struct lu_fid *f); + + int (*dt_object_create)(struct lu_context *ctxt, struct dt_object *dt, + struct md_params *arg, struct thandle *th); + + int (*dt_object_destroy)(struct lu_context *ctxt, + struct dt_object *dt, struct thandle *th); + +}; + +struct dt_object_operations { + void (*do_object_lock)(struct lu_context *ctx, + struct dt_object *dt, enum dt_lock_mode mode); + void (*do_object_unlock)(struct lu_context *ctx, + struct dt_object *dt, enum dt_lock_mode mode); + + 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); + + int (*do_xattr_set)(struct lu_context *ctxt, struct dt_object *dt, + void *buf, int buf_len, const char *name, + struct md_params *arg, struct thandle *handle); + +}; + +struct dt_body_operations { + int (*dbo_read)(struct lu_context *ctxt, struct dt_object *dt, ...); + int (*dbo_write)(struct lu_context *ctxt, struct dt_object *dt, ...); + int (*dbo_truncate)(struct lu_context *ctxt, struct dt_object *dt, ...); + int (*dbo_seek)(struct lu_context *ctxt, struct dt_object *dt, ...); +}; + +struct dt_index_operations { + int (*dio_index_insert)(struct lu_context *ctxt, + struct dt_object *dt, + struct lu_fid *fid, const char *name, + struct md_params *arg, + struct thandle *handle); + + int (*dio_index_delete)(struct lu_context *ctxt, + struct dt_object *dt, + struct lu_fid *fid, const char *name, + struct md_params *arg, + struct thandle *handle); +}; + +struct dt_device { + struct lu_device dd_lu_dev; + struct dt_device_operations *dd_ops; +}; + +static inline int lu_device_is_dt(const struct lu_device *d) +{ + return ergo(d != NULL, d->ld_type->ldt_tags & LU_DEVICE_DT); +} + +static inline struct dt_device * lu2dt_dev(struct lu_device *l) +{ + LASSERT(lu_device_is_dt(l)); + return container_of0(l, struct dt_device, dd_lu_dev); +} + +struct dt_object { + struct lu_object do_lu; + struct dt_object_operations *do_ops; + struct dt_body_operations *do_body_ops; + struct dt_index_operations *do_index_ops; +}; + +struct txn_param { + unsigned int tp_credits; +}; + +#define TXN_PARAM_INIT(credits) { \ + .tp_credits = (credits) \ +} + +#define TXN_PARAM(...) ((struct txn_param)TXN_PARAM_INIT(__VA_ARGS__)) + +#endif /* __LINUX_DT_OBJECT_H */ diff --git a/lustre/include/linux/lu_object.h b/lustre/include/linux/lu_object.h index bd54eae..8983297 100644 --- a/lustre/include/linux/lu_object.h +++ b/lustre/include/linux/lu_object.h @@ -83,7 +83,9 @@ struct lustre_cfg; * 3. avoiding recursion. * * Generic code tries to replace recursion through layers by iterations - * where possible. + * where possible. Additionally to the end of reducing stack consumption, + * data, when practically possible, are allocated through lu_context_key + * interface rather than on stack. * */ @@ -156,15 +158,18 @@ struct lu_device_operations { */ void (*ldo_object_release)(struct lu_context *ctx, struct lu_object *o); + /* process config specific for device */ + int (*ldo_process_config)(struct lu_device *, struct lustre_cfg *); + +}; + +struct lu_object_operations { + int (*loo_object_exists)(struct lu_context *ctx, struct lu_object *o); /* * Debugging helper. Print given object. */ - int (*ldo_object_print)(struct lu_context *ctx, + int (*loo_object_print)(struct lu_context *ctx, struct seq_file *f, const struct lu_object *o); - - /* process config specific for device */ - int (*ldo_process_config)(struct lu_device *, struct lustre_cfg *); - }; /* @@ -306,23 +311,27 @@ struct lu_object { /* * Header for this object. */ - struct lu_object_header *lo_header; + struct lu_object_header *lo_header; /* * Device for this layer. */ - struct lu_device *lo_dev; + struct lu_device *lo_dev; + /* + * Operations for this object. + */ + struct lu_object_operations *lo_ops; /* * Linkage into list of all layers. */ - struct list_head lo_linkage; + struct list_head lo_linkage; /* * Depth. Top level layer depth is 0. */ - int lo_depth; + int lo_depth; /* * Flags from enum lu_object_flags. */ - unsigned long lo_flags; + unsigned long lo_flags; }; enum lu_object_header_flags { @@ -336,6 +345,14 @@ enum lu_object_header_flags { /* * "Compound" object, consisting of multiple layers. + * + * Compound object with given fid is unique with given lu_site. + * + * Note, that object does *not* necessary correspond to the real object in the + * persistent storage: object is an anchor for locking and method calling, so + * it is created for things like not-yet-existing child created by mkdir or + * create calls. ->loo_exists() can be used to check whether object is backed + * by persistent storage entity. */ struct lu_object_header { /* @@ -493,6 +510,10 @@ static inline void lu_object_get(struct lu_object *o) spin_unlock(&o->lo_dev->ld_site->ls_guard); } +/* + * Return true of object will not be cached after last reference to it is + * released. + */ static inline int lu_object_is_dying(struct lu_object_header *h) { return test_bit(LU_OBJECT_HEARD_BANSHEE, &h->loh_flags); @@ -529,19 +550,80 @@ struct lu_object *lu_object_locate(struct lu_object_header *h, /* * lu_context. Execution context for lu_object methods. Currently associated * with thread. + * + * All lu_object methods, except device and device type methods (called during + * system initialization and shutdown) are executed "within" some + * lu_context. This means, that pointer to some "current" lu_context is passed + * as an argument to all methods. + * + * All service ptlrpc threads create lu_context as part of their + * initialization. It is possible to create "stand-alone" context for other + * execution environments (like system calls). + * + * lu_object methods mainly use lu_context through lu_context_key interface + * that allows each layer to associate arbitrary pieces of data with each + * context (see pthread_key_create(3) for similar interface). + * */ struct lu_context { + /* + * Theoretically we'd want to use lu_objects and lu_contexts on the + * client side too. On the other hand, we don't want to allocate + * values of server-side keys for the client contexts and vice versa. + * + * To achieve this, set of tags in introduced. Contexts and keys are + * marked with tags. Key value are created only for context whose set + * of tags has non-empty intersection with one for key. NOT YET + * IMPLEMENTED. + */ __u32 lc_tags; + /* + * Object attribute. This is stuffed directly into context, because we + * know it advance it will be needed. As an alternative, it can be + * allocated through special key. + */ struct lu_attr lc_attr; + /* + * Pointer to the home service thread. NULL for other execution + * contexts. + */ struct ptlrpc_thread *lc_thread; + /* + * Pointer to an array with key values. Internal implementation + * detail. + */ void **lc_value; }; +/* + * lu_context_key interface. Similar to pthread_key. + */ + +/* + * Key. Represents per-context value slot. + */ struct lu_context_key { + /* + * Value constructor. This is called when new value is created for a + * context. Returns pointer to new value of error pointer. + */ void *(*lct_init)(struct lu_context *ctx); + /* + * Value destructor. Called when context with previously allocated + * value of this slot is destroyed. @data is a value that was returned + * by matching call to ->lct_init(). + */ void (*lct_fini)(struct lu_context *ctx, void *data); + /* + * Internal implementation detail: index within ->lc_value[] reserved + * for this key. + */ int lct_index; + /* + * Internal implementation detail: number of values created for this + * key. + */ unsigned lct_used; }; @@ -555,116 +637,5 @@ void lu_context_fini(struct lu_context *ctx); void lu_context_enter(struct lu_context *ctx); void lu_context_exit(struct lu_context *ctx); -/* - * DT device interface. XXX Probably should go elsewhere. - */ -struct md_params; -struct thandle; -struct txn_param; -struct dt_device; -struct dt_object; - -enum dt_lock_mode { - DT_WRITE_LOCK = 1, - DT_READ_LOCK = 2, -}; - -struct dt_device_operations { - /* method for getting/setting device wide back stored config data, like - * last used meta-sequence, etc. */ - int (*dt_config) (struct lu_context *ctx, - struct dt_device *dev, const char *name, - void *buf, int size, int mode); - int (*dt_statfs)(struct lu_context *ctx, - struct dt_device *dev, struct kstatfs *sfs); - struct thandle *(*dt_trans_start)(struct lu_context *ctx, - struct dt_device *dev, - struct txn_param *param); - void (*dt_trans_stop)(struct lu_context *ctx, struct thandle *th); - int (*dt_root_get)(struct lu_context *ctx, - struct dt_device *dev, struct lu_fid *f); -}; - -struct dt_object_operations { - void (*do_object_lock)(struct lu_context *ctx, - struct dt_object *dt, enum dt_lock_mode mode); - void (*do_object_unlock)(struct lu_context *ctx, - struct dt_object *dt, enum dt_lock_mode mode); - - int (*do_object_create)(struct lu_context *ctxt, - struct dt_object *dt, - struct dt_object *child, - struct md_params *arg, struct thandle *th); - - int (*do_object_destroy)(struct lu_context *ctxt, - 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); - - int (*do_xattr_set)(struct lu_context *ctxt, struct dt_object *dt, - void *buf, int buf_len, const char *name, - struct md_params *arg, struct thandle *handle); - - int (*do_index_insert)(struct lu_context *ctxt, - struct dt_object *dt, - struct lu_fid *fid, const char *name, - struct md_params *arg, - struct thandle *handle); - - int (*do_index_delete)(struct lu_context *ctxt, - struct dt_object *dt, - struct lu_fid *fid, const char *name, - struct md_params *arg, - struct thandle *handle); -}; - -struct dt_device { - struct lu_device dd_lu_dev; - struct dt_device_operations *dd_ops; -}; - -static inline int lu_device_is_dt(const struct lu_device *d) -{ - return ergo(d != NULL, d->ld_type->ldt_tags & LU_DEVICE_DT); -} - -static inline struct dt_device * lu2dt_dev(struct lu_device *l) -{ - LASSERT(lu_device_is_dt(l)); - return container_of0(l, struct dt_device, dd_lu_dev); -} - -struct dt_object { - struct lu_object do_lu; - struct dt_object_operations *do_ops; -}; - -struct txn_param { - unsigned int tp_credits; -}; - -#define TXN_PARAM_INIT(credits) { \ - .tp_credits = (credits) \ -} - -#define TXN_PARAM(...) ((struct txn_param)TXN_PARAM_INIT(__VA_ARGS__)) - -struct fld { - struct proc_dir_entry *fld_proc_entry; - struct ptlrpc_service *fld_service; - struct dt_device *fld_dt; -}; - -int fld_server_init(struct fld *fld, struct dt_device *dt); -void fld_server_fini(struct fld *fld); - -#endif /* __LINUX_OBD_CLASS_H */ +#endif /* __LINUX_LU_OBJECT_H */ diff --git a/lustre/include/linux/lustre_fid.h b/lustre/include/linux/lustre_fid.h index b2893a4..ed92c64 100644 --- a/lustre/include/linux/lustre_fid.h +++ b/lustre/include/linux/lustre_fid.h @@ -69,4 +69,17 @@ static inline int fid_is_local(struct lu_site *site, const struct lu_fid *fid) void fid_to_le(struct lu_fid *dst, const struct lu_fid *src); +/* + * fld (fid location database) interface. + */ +struct fld { + struct proc_dir_entry *fld_proc_entry; + struct ptlrpc_service *fld_service; + struct dt_device *fld_dt; +}; + +int fld_server_init(struct fld *fld, struct dt_device *dt); +void fld_server_fini(struct fld *fld); + + #endif /* __LINUX_OBD_CLASS_H */ diff --git a/lustre/include/linux/md_object.h b/lustre/include/linux/md_object.h index 80c5ef0..4870f22 100644 --- a/lustre/include/linux/md_object.h +++ b/lustre/include/linux/md_object.h @@ -63,18 +63,6 @@ struct md_object_operations { int (*moo_xattr_set)(struct lu_context *ctxt, struct md_object *obj, void *buf, int buf_len, const char *name, struct md_params *arg); - - /* FLD maintanence related handlers */ - int (*moo_index_insert)(struct lu_context *ctxt, - struct md_object *pobj, struct md_object *obj, - const char *name, struct md_params *arg); - - int (*moo_index_delete)(struct lu_context *ctxt, - struct md_object *pobj, struct md_object *obj, - const char *name, struct md_params *arg); - - int (*moo_object_create)(struct lu_context *, struct md_object *, - struct md_object *, struct md_params *); }; struct md_device_operations { diff --git a/lustre/llite/dcache.c b/lustre/llite/dcache.c index 6de6ce9..8287c11 100644 --- a/lustre/llite/dcache.c +++ b/lustre/llite/dcache.c @@ -244,7 +244,7 @@ void ll_lookup_finish_locks(struct lookup_intent *it, struct dentry *dentry) LASSERT(dentry != NULL); sbi = ll_i2sbi(dentry->d_inode); - + if (it->d.lustre.it_lock_mode && dentry->d_inode != NULL) { struct inode *inode = dentry->d_inode; CDEBUG(D_DLMTRACE, "setting l_data to inode %p (%lu/%u)\n", @@ -314,7 +314,7 @@ int ll_revalidate_it(struct dentry *de, int lookup_flags, LASSERT(it); parent = de->d_parent->d_inode; - + ll_prepare_md_op_data(&op_data, parent, NULL, de->d_name.name, de->d_name.len, 0); @@ -402,7 +402,7 @@ int ll_revalidate_it(struct dentry *de, int lookup_flags, unlock_kernel(); handle = (flag) ? &ldd->lld_mnt_och : &ldd->lld_cwd_och; - rc = obd_pin(sbi->ll_md_exp, &ll_i2info(inode)->lli_fid, + rc = obd_pin(sbi->ll_md_exp, &ll_i2info(inode)->lli_fid, handle, flag); if (rc) { diff --git a/lustre/mdd/mdd_handler.c b/lustre/mdd/mdd_handler.c index 4aad606..846fb57 100644 --- a/lustre/mdd/mdd_handler.c +++ b/lustre/mdd/mdd_handler.c @@ -41,6 +41,7 @@ #include #include +#include #include "mdd_internal.h" @@ -57,6 +58,7 @@ static void mdd_unlock(struct lu_context *ctx, struct mdd_object *obj, enum dt_lock_mode mode); static struct md_object_operations mdd_obj_ops; +static struct lu_object_operations mdd_lu_obj_ops; static int lu_device_is_mdd(struct lu_device *d) { @@ -111,9 +113,10 @@ static struct lu_object *mdd_object_alloc(struct lu_context *ctxt, o = &mdo->mod_obj.mo_lu; lu_object_init(o, NULL, d); mdo->mod_obj.mo_ops = &mdd_obj_ops; - return (&mdo->mod_obj.mo_lu); + o->lo_ops = &mdd_lu_obj_ops; + return &mdo->mod_obj.mo_lu; } else - return(NULL); + return NULL; } static int mdd_object_init(struct lu_context *ctxt, struct lu_object *o) @@ -173,14 +176,13 @@ mdd_xattr_get(struct lu_context *ctxt, struct md_object *obj, void *buf, } static int -__mdd_object_destroy(struct lu_context *ctxt, struct mdd_device *mdd, - struct mdd_object *obj, +__mdd_object_destroy(struct lu_context *ctxt, struct mdd_object *obj, struct thandle *handle) { - int rc = 0; - struct dt_object *next = mdd_object_child(obj); - - rc = next->do_ops->do_object_destroy(ctxt, next, handle); + struct mdd_device *mdd = mdo2mdd(&obj->mod_obj); + int rc; + rc = mdd_child_ops(mdd)->dt_object_destroy(ctxt, mdd_object_child(obj), + handle); RETURN(rc); } @@ -240,8 +242,7 @@ mdd_object_destroy(struct lu_context *ctxt, struct md_object *obj) if (open_orphan(mdd_obj)) rc = mdd_add_orphan(mdd, mdd_obj, handle); else { - rc = __mdd_object_destroy(ctxt, mdd, - mdd_obj, handle); + rc = __mdd_object_destroy(ctxt, mdd_obj, handle); if (rc == 0) rc = mdd_add_unlink_log(mdd, mdd_obj, handle); } @@ -255,6 +256,13 @@ static void mdd_object_release(struct lu_context *ctxt, struct lu_object *o) { } +static int mdd_object_exists(struct lu_context *ctx, struct lu_object *o) +{ + struct lu_object *next = lu_object_next(o); + + return next->lo_ops->loo_object_exists(ctx, next); +} + static int mdd_object_print(struct lu_context *ctxt, struct seq_file *f, const struct lu_object *o) { @@ -318,10 +326,14 @@ static struct lu_device_operations mdd_lu_ops = { .ldo_object_init = mdd_object_init, .ldo_object_free = mdd_object_free, .ldo_object_release = mdd_object_release, - .ldo_object_print = mdd_object_print, .ldo_process_config = mdd_process_config }; +static struct lu_object_operations mdd_lu_obj_ops = { + .loo_object_print = mdd_object_print, + .loo_object_exists = mdd_object_exists +}; + static struct dt_object* mdd_object_child(struct mdd_object *o) { return container_of0(lu_object_next(&o->mod_obj.mo_lu), @@ -372,28 +384,22 @@ static void mdd_trans_stop(struct lu_context *ctxt, } static int -__mdd_object_create(struct lu_context *ctxt, struct mdd_device *mdd, - struct mdd_object *pobj, - struct mdd_object *child, struct md_params *arg, - struct thandle *handle) +__mdd_object_create(struct lu_context *ctxt, struct mdd_object *obj, + struct md_params *arg, struct thandle *handle) { + struct mdd_device *mdd = mdo2mdd(&obj->mod_obj); int rc; - struct dt_object *next = mdd_object_child(pobj); ENTRY; - rc = next->do_ops->do_object_create(ctxt, next, mdd_object_child(child), - arg, handle); + rc = mdd_child_ops(mdd)->dt_object_create(ctxt, mdd_object_child(obj), + arg, handle); /*XXX increase the refcount of the object or not?*/ RETURN(rc); } -static int -mdd_object_create(struct lu_context *ctxt, struct md_object *pobj, - struct md_object *child, struct md_params *arg) +static int mdd_object_create(struct lu_context *ctxt, struct mdd_device *mdd, + struct mdd_object *child, struct md_params *arg) { - struct mdd_device *mdd = mdo2mdd(pobj); - struct mdd_object *mdd_pobj = mdo2mddo(pobj); - struct mdd_object *mdd_child = mdo2mddo(child); struct thandle *handle; int rc; ENTRY; @@ -403,7 +409,7 @@ mdd_object_create(struct lu_context *ctxt, struct md_object *pobj, if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); - rc = __mdd_object_create(ctxt, mdd, mdd_pobj, mdd_child, arg, handle); + rc = __mdd_object_create(ctxt, child, arg, handle); mdd_trans_stop(ctxt, mdd, handle); @@ -490,8 +496,9 @@ __mdd_index_insert(struct lu_context *ctxt, struct mdd_device *mdd, mdd_lock2(ctxt, pobj, obj); - rc = next->do_ops->do_index_insert(ctxt, next, mdd_object_getfid(obj), - name, arg, handle); + rc = next->do_index_ops->dio_index_insert(ctxt, next, + mdd_object_getfid(obj), + name, arg, handle); mdd_unlock2(ctxt, pobj, obj); RETURN(rc); @@ -531,8 +538,9 @@ __mdd_index_delete(struct lu_context *ctxt, struct mdd_device *mdd, mdd_lock2(ctxt, pobj, obj); - rc = next->do_ops->do_index_delete(ctxt, next, mdd_object_getfid(obj), - name, arg, handle); + rc = next->do_index_ops->dio_index_delete(ctxt, next, + mdd_object_getfid(obj), + name, arg, handle); mdd_unlock2(ctxt, pobj, obj); RETURN(rc); @@ -647,7 +655,10 @@ mdd_rename(struct lu_context *ctxt, struct md_object *src_pobj, if (rc) GOTO(cleanup, rc); - rc = __mdd_object_destroy(ctxt, mdd, mdd_sobj, handle); + /* + * XXX nikita: huh? What is this? + */ + rc = __mdd_object_destroy(ctxt, mdd_sobj, handle); if (rc) GOTO(cleanup, rc); cleanup: @@ -671,8 +682,7 @@ mdd_mkdir(struct lu_context *ctxt, struct md_object *pobj, mdd_lock(ctxt, mdo2mddo(pobj), DT_WRITE_LOCK); - rc = __mdd_object_create(ctxt, mdd, mdo2mddo(pobj), mdo2mddo(child), - NULL, handle); + rc = __mdd_object_create(ctxt, mdo2mddo(child), NULL, handle); if (rc) GOTO(cleanup, rc); @@ -726,16 +736,13 @@ struct md_device_operations mdd_ops = { }; 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, - .moo_index_delete = mdd_index_delete, - .moo_object_create = mdd_object_create, + .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, }; static struct obd_ops mdd_obd_device_ops = { diff --git a/lustre/mdd/mdd_internal.h b/lustre/mdd/mdd_internal.h index 96e1aaa..77f6236 100644 --- a/lustre/mdd/mdd_internal.h +++ b/lustre/mdd/mdd_internal.h @@ -4,6 +4,16 @@ #ifndef _MDD_INTERNAL_H #define _MDD_INTERNAL_H +#include + +#include + +struct dt_device; +struct file; +struct lr_server_data; +struct dentry; +struct llog_handle; + struct mdd_device { struct md_device mdd_md_dev; struct dt_device *mdd_child; @@ -31,6 +41,4 @@ struct mdd_object { struct md_object mod_obj; }; -int mdd_object_put(struct mdd_device *mdd, struct mdd_object *obj); -void mdd_object_get(struct mdd_device *mdd, struct mdd_object *obj); #endif diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 939e443..9aed555 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -50,6 +50,9 @@ #include /* struct obd_device */ #include +/* lu2dt_dev() */ +#include + /* struct mds_client_data */ #include "../mds/mds_internal.h" @@ -64,7 +67,8 @@ static int mdt_handle (struct ptlrpc_request *req); static struct mdt_device *mdt_dev (struct lu_device *d); static struct lu_fid *mdt_object_fid(struct mdt_object *o); -static struct lu_context_key mdt_thread_key; +static struct lu_context_key mdt_thread_key; +static struct lu_object_operations mdt_obj_ops; /* object operations */ static int mdt_md_mkdir(struct mdt_thread_info *info, struct mdt_device *d, @@ -1339,6 +1343,7 @@ static struct lu_object *mdt_object_alloc(struct lu_context *ctxt, lu_object_header_init(h); lu_object_init(o, h, d); lu_object_add_top(h, o); + o->lo_ops = &mdt_obj_ops; return o; } else return NULL; @@ -1374,6 +1379,13 @@ static void mdt_object_release(struct lu_context *ctxt, struct lu_object *o) { } +static int mdt_object_exists(struct lu_context *ctx, struct lu_object *o) +{ + struct lu_object *next = lu_object_next(o); + + return next->lo_ops->loo_object_exists(ctx, next); +} + static int mdt_object_print(struct lu_context *ctxt, struct seq_file *f, const struct lu_object *o) { @@ -1385,10 +1397,14 @@ static struct lu_device_operations mdt_lu_ops = { .ldo_object_init = mdt_object_init, .ldo_object_free = mdt_object_free, .ldo_object_release = mdt_object_release, - .ldo_object_print = mdt_object_print, .ldo_process_config = mdt_process_config }; +static struct lu_object_operations mdt_obj_ops = { + .loo_object_print = mdt_object_print, + .loo_object_exists = mdt_object_exists +}; + /* mds_connect_internal */ static int mdt_connect0(struct mdt_device *mdt, struct obd_export *exp, struct obd_connect_data *data) diff --git a/lustre/mgs/mgs_llog.c b/lustre/mgs/mgs_llog.c index 0a01b08..c7890c6 100644 --- a/lustre/mgs/mgs_llog.c +++ b/lustre/mgs/mgs_llog.c @@ -49,7 +49,7 @@ /********************** Class fns ********************/ static int class_dentry_readdir(struct obd_device *obd, struct dentry *dir, - struct vfsmount *inmnt, + struct vfsmount *inmnt, struct list_head *dentry_list){ /* see mds_cleanup_pending */ struct lvfs_run_ctxt saved; @@ -58,7 +58,7 @@ static int class_dentry_readdir(struct obd_device *obd, struct dentry *dir, struct vfsmount *mnt; int rc = 0; ENTRY; - + push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); dentry = dget(dir); if (IS_ERR(dentry)) @@ -73,12 +73,12 @@ static int class_dentry_readdir(struct obd_device *obd, struct dentry *dir, if (IS_ERR(file)) /* dentry_open_it() drops the dentry, mnt refs */ GOTO(out_pop, rc = PTR_ERR(file)); - + INIT_LIST_HEAD(dentry_list); rc = l_readdir(file, dentry_list); filp_close(file, 0); /* filp_close->fput() drops the dentry, mnt refs */ - + out_pop: pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); RETURN(rc); @@ -92,7 +92,7 @@ out_pop: */ /* FIXME is it better to have a separate db file, instead of parsing the info out of the client log? */ -static int mgs_fsdb_handler(struct llog_handle *llh, struct llog_rec_hdr *rec, +static int mgs_fsdb_handler(struct llog_handle *llh, struct llog_rec_hdr *rec, void *data) { struct fs_db *fsdb = (struct fs_db *)data; @@ -116,21 +116,21 @@ static int mgs_fsdb_handler(struct llog_handle *llh, struct llog_rec_hdr *rec, lcfg = (struct lustre_cfg *)cfg_buf; - CDEBUG(D_INFO, "cmd %x %s %s\n", lcfg->lcfg_command, + CDEBUG(D_INFO, "cmd %x %s %s\n", lcfg->lcfg_command, lustre_cfg_string(lcfg, 0), lustre_cfg_string(lcfg, 1)); - /* Figure out ost indicies */ + /* Figure out ost indicies */ /* lov_modify_tgts add 0:lov1 1:ost1_UUID 2(index):0 3(gen):1 */ if (lcfg->lcfg_command == LCFG_LOV_ADD_OBD || lcfg->lcfg_command == LCFG_LOV_DEL_OBD) { index = simple_strtoul(lustre_cfg_string(lcfg, 2), NULL, 10); CDEBUG(D_MGS, "OST index for %s is %u (%s)\n", - lustre_cfg_string(lcfg, 1), index, + lustre_cfg_string(lcfg, 1), index, lustre_cfg_string(lcfg, 2)); set_bit(index, fsdb->fsdb_ost_index_map); } - + /* Figure out mdt indicies */ /* attach 0:MDC_uml1_mdsA_MNT_client 1:mdc 2:1d834_MNT_client_03f */ if ((lcfg->lcfg_command == LCFG_ATTACH) && @@ -167,7 +167,7 @@ static int mgs_get_fsdb_from_llog(struct obd_device *obd, char *logname, ENTRY; push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); - + rc = llog_create(llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT), &loghandle, NULL, logname); if (rc) @@ -239,9 +239,9 @@ static struct fs_db *mgs_new_fsdb(struct obd_device *obd, char *fsname) struct mgs_obd *mgs = &obd->u.mgs; struct fs_db *fsdb; ENTRY; - + OBD_ALLOC_PTR(fsdb); - if (!fsdb) + if (!fsdb) RETURN(NULL); OBD_ALLOC(fsdb->fsdb_ost_index_map, INDEX_MAP_SIZE); @@ -250,16 +250,16 @@ static struct fs_db *mgs_new_fsdb(struct obd_device *obd, char *fsname) CERROR("No memory for index maps\n"); GOTO(err, 0); } - + strncpy(fsdb->fsdb_name, fsname, sizeof(fsdb->fsdb_name)); sema_init(&fsdb->fsdb_sem, 1); list_add(&fsdb->fsdb_list, &mgs->mgs_fs_db_list); RETURN(fsdb); err: - if (fsdb->fsdb_ost_index_map) + if (fsdb->fsdb_ost_index_map) OBD_FREE(fsdb->fsdb_ost_index_map, INDEX_MAP_SIZE); - if (fsdb->fsdb_mdt_index_map) + if (fsdb->fsdb_mdt_index_map) OBD_FREE(fsdb->fsdb_mdt_index_map, INDEX_MAP_SIZE); OBD_FREE_PTR(fsdb); RETURN(NULL); @@ -300,20 +300,20 @@ static inline int name_create(char *prefix, char *suffix, char **newname) { LASSERT(newname); OBD_ALLOC(*newname, strlen(prefix) + strlen(suffix) + 1); - if (!*newname) + if (!*newname) return -ENOMEM; sprintf(*newname, "%s%s", prefix, suffix); return 0; } static inline void name_destroy(char *name) -{ +{ if (name) OBD_FREE(name, strlen(name) + 1); } -static int mgs_find_or_make_fsdb(struct obd_device *obd, char *name, +static int mgs_find_or_make_fsdb(struct obd_device *obd, char *name, struct fs_db **dbh) { struct mgs_obd *mgs = &obd->u.mgs; @@ -332,7 +332,7 @@ static int mgs_find_or_make_fsdb(struct obd_device *obd, char *name, CDEBUG(D_MGS, "Creating new db\n"); fsdb = mgs_new_fsdb(obd, name); up(&mgs->mgs_sem); - if (!fsdb) + if (!fsdb) return -ENOMEM; /* populate the db from the client llog */ @@ -348,12 +348,12 @@ static int mgs_find_or_make_fsdb(struct obd_device *obd, char *name, } *dbh = fsdb; - + return 0; } /* 1 = index in use - 0 = index unused + 0 = index unused -1= empty client log */ int mgs_check_index(struct obd_device *obd, struct mgs_target_info *mti) { @@ -364,23 +364,23 @@ int mgs_check_index(struct obd_device *obd, struct mgs_target_info *mti) LASSERT(!(mti->mti_flags & LDD_F_NEED_INDEX)); - rc = mgs_find_or_make_fsdb(obd, mti->mti_fsname, &fsdb); + rc = mgs_find_or_make_fsdb(obd, mti->mti_fsname, &fsdb); if (rc) { CERROR("Can't get db for %s\n", mti->mti_fsname); RETURN(rc); } - if (fsdb->fsdb_flags & FSDB_EMPTY) + if (fsdb->fsdb_flags & FSDB_EMPTY) RETURN(-1); - if (mti->mti_flags & LDD_F_SV_TYPE_OST) + if (mti->mti_flags & LDD_F_SV_TYPE_OST) imap = fsdb->fsdb_ost_index_map; - else if (mti->mti_flags & LDD_F_SV_TYPE_MDT) + else if (mti->mti_flags & LDD_F_SV_TYPE_MDT) imap = fsdb->fsdb_mdt_index_map; else RETURN(-EINVAL); - if (test_bit(mti->mti_stripe_index, imap)) + if (test_bit(mti->mti_stripe_index, imap)) RETURN(1); RETURN(0); } @@ -393,15 +393,15 @@ int mgs_set_index(struct obd_device *obd, struct mgs_target_info *mti) int rc = 0; ENTRY; - rc = mgs_find_or_make_fsdb(obd, mti->mti_fsname, &fsdb); + rc = mgs_find_or_make_fsdb(obd, mti->mti_fsname, &fsdb); if (rc) { CERROR("Can't get db for %s\n", mti->mti_fsname); RETURN(rc); } - if (mti->mti_flags & LDD_F_SV_TYPE_OST) + if (mti->mti_flags & LDD_F_SV_TYPE_OST) imap = fsdb->fsdb_ost_index_map; - else if (mti->mti_flags & LDD_F_SV_TYPE_MDT) + else if (mti->mti_flags & LDD_F_SV_TYPE_MDT) imap = fsdb->fsdb_mdt_index_map; else RETURN(-EINVAL); @@ -415,7 +415,7 @@ int mgs_set_index(struct obd_device *obd, struct mgs_target_info *mti) /* Remove after CMD */ /* Now it removed finally! - if ((mti->mti_flags & LDD_F_SV_TYPE_MDT) && + if ((mti->mti_flags & LDD_F_SV_TYPE_MDT) && (mti->mti_stripe_index > 0)) { LCONSOLE_ERROR("MDT index must = 0 (until Clustered MetaData " "feature is ready.)\n"); @@ -425,12 +425,12 @@ int mgs_set_index(struct obd_device *obd, struct mgs_target_info *mti) if (mti->mti_stripe_index >= INDEX_MAP_SIZE * 8) { LCONSOLE_ERROR("Server %s requested index %d, but the" - "max index is %d.\n", + "max index is %d.\n", mti->mti_svname, mti->mti_stripe_index, INDEX_MAP_SIZE * 8); RETURN(-ERANGE); } - + if (test_bit(mti->mti_stripe_index, imap)) { if (mti->mti_flags & LDD_F_VIRGIN) { LCONSOLE_ERROR("Server %s requested index %d, but that " @@ -449,12 +449,12 @@ int mgs_set_index(struct obd_device *obd, struct mgs_target_info *mti) server_make_name(mti->mti_flags, mti->mti_stripe_index, mti->mti_fsname, mti->mti_svname); - CDEBUG(D_MGS, "Set index for %s to %d\n", mti->mti_svname, + CDEBUG(D_MGS, "Set index for %s to %d\n", mti->mti_svname, mti->mti_stripe_index); RETURN(0); } - + /******************** config log recording functions *********************/ static int record_lcfg(struct obd_device *obd, struct llog_handle *llh, @@ -465,7 +465,7 @@ static int record_lcfg(struct obd_device *obd, struct llog_handle *llh, int buflen, rc; LASSERT(llh); - LASSERT(llh->lgh_ctxt); + LASSERT(llh->lgh_ctxt); buflen = lustre_cfg_len(lcfg->lcfg_bufcount, lcfg->lcfg_buflens); @@ -490,44 +490,44 @@ static int record_base(struct obd_device *obd, struct llog_handle *llh, struct lustre_cfg_bufs bufs; struct lustre_cfg *lcfg; int rc; - + CDEBUG(D_MGS, "lcfg %s %#x %s %s %s %s\n", cfgname, - cmd, s1, s2, s3, s4); + cmd, s1, s2, s3, s4); lustre_cfg_bufs_reset(&bufs, cfgname); - if (s1) + if (s1) lustre_cfg_bufs_set_string(&bufs, 1, s1); - if (s2) + if (s2) lustre_cfg_bufs_set_string(&bufs, 2, s2); - if (s3) + if (s3) lustre_cfg_bufs_set_string(&bufs, 3, s3); - if (s4) + if (s4) lustre_cfg_bufs_set_string(&bufs, 4, s4); lcfg = lustre_cfg_new(cmd, &bufs); lcfg->lcfg_nid = nid; rc = record_lcfg(obd, llh, lcfg); - + lustre_cfg_free(lcfg); - + if (rc) { CERROR("error %d: lcfg %s %#x %s %s %s %s\n", rc, cfgname, - cmd, s1, s2, s3, s4); + cmd, s1, s2, s3, s4); } return(rc); } -static inline int record_add_uuid(struct obd_device *obd, - struct llog_handle *llh, +static inline int record_add_uuid(struct obd_device *obd, + struct llog_handle *llh, uint64_t nid, char *uuid) { return record_base(obd,llh,NULL,nid,LCFG_ADD_UUID,uuid,0,0,0); } -static inline int record_add_conn(struct obd_device *obd, +static inline int record_add_conn(struct obd_device *obd, struct llog_handle *llh, char *devname, char *uuid) @@ -542,7 +542,7 @@ static inline int record_attach(struct obd_device *obd, struct llog_handle *llh, } static inline int record_setup(struct obd_device *obd, struct llog_handle *llh, - char *devname, + char *devname, char *s1, char *s2, char *s3, char *s4) { return record_base(obd,llh,devname,0,LCFG_SETUP,s1,s2,s3,s4); @@ -610,7 +610,7 @@ static inline int record_lmv_add(struct obd_device *obd, { return record_base(obd,llh,lmv_name,0,LCFG_ADD_MDC, mdt_uuid,index,gen,0); -} +} static inline int record_cmm_add(struct obd_device *obd, struct llog_handle *llh, @@ -619,7 +619,7 @@ static inline int record_cmm_add(struct obd_device *obd, { return record_base(obd,llh,cmm_name,0,LCFG_ADD_MDC, mdt_uuid,index,gen,0); -} +} @@ -631,16 +631,16 @@ static inline int record_lov_add(struct obd_device *obd, { return record_base(obd,llh,lov_name,0,LCFG_LOV_ADD_OBD, ost_uuid,index,gen,0); -} +} -static inline int record_mount_opt(struct obd_device *obd, +static inline int record_mount_opt(struct obd_device *obd, struct llog_handle *llh, char *profile, char *lov_name, char *mdc_name) { return record_base(obd,llh,NULL,0,LCFG_MOUNTOPT, profile,lov_name,mdc_name,0); -} +} static int record_marker(struct obd_device *obd, struct llog_handle *llh, struct fs_db *fsdb, __u32 flags, @@ -652,12 +652,12 @@ static int record_marker(struct obd_device *obd, struct llog_handle *llh, struct lustre_cfg *lcfg; int rc; - if (flags & CM_START) + if (flags & CM_START) fsdb->fsdb_gen++; marker.cm_step = fsdb->fsdb_gen; marker.cm_flags = flags; - strncpy(marker.cm_svname, svname, sizeof(marker.cm_svname)); - strncpy(marker.cm_comment, comment, sizeof(marker.cm_comment)); + strncpy(marker.cm_svname, svname, sizeof(marker.cm_svname)); + strncpy(marker.cm_comment, comment, sizeof(marker.cm_comment)); do_gettimeofday(&tv); marker.cm_createtime = tv.tv_sec; marker.cm_canceltime = 0; @@ -671,13 +671,13 @@ static int record_marker(struct obd_device *obd, struct llog_handle *llh, return rc; } -static int record_start_log(struct obd_device *obd, +static int record_start_log(struct obd_device *obd, struct llog_handle **llh, char *name) { static struct obd_uuid cfg_uuid = { .uuid = "config_uuid" }; struct lvfs_run_ctxt saved; int rc = 0; - + if (*llh) { GOTO(out, rc = -EBUSY); } @@ -706,10 +706,10 @@ static int record_end_log(struct obd_device *obd, struct llog_handle **llh) int rc = 0; push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); - + rc = llog_close(*llh); *llh = NULL; - + pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); RETURN(rc); } @@ -739,7 +739,7 @@ static int mgs_log_is_empty(struct obd_device *obd, char *name) /* write an lcfg directly into a log (with markers) */ static int mgs_write_log_direct(struct obd_device *obd, struct fs_db *fsdb, - char *logname, char *obdname, + char *logname, char *obdname, struct lustre_cfg *lcfg) { struct llog_handle *llh = NULL; @@ -747,13 +747,13 @@ static int mgs_write_log_direct(struct obd_device *obd, struct fs_db *fsdb, ENTRY; rc = record_start_log(obd, &llh, logname); - rc = record_marker(obd, llh, fsdb, CM_START, obdname, "param"); - + rc = record_marker(obd, llh, fsdb, CM_START, obdname, "param"); + rc = record_lcfg(obd, llh, lcfg); - rc = record_marker(obd, llh, fsdb, CM_END, obdname, "param"); + rc = record_marker(obd, llh, fsdb, CM_END, obdname, "param"); rc = record_end_log(obd, &llh); - + RETURN(rc); } @@ -767,8 +767,8 @@ int mgs_write_log_direct_all(struct obd_device *obd, struct fs_db *fsdb, char *logname; int rc, len = strlen(fsname); ENTRY; - - /* We need to set params for any future logs + + /* We need to set params for any future logs as well. FIXME Append this file to every new log. */ name_create(fsname, "-params", &logname); if (mgs_log_is_empty(obd, logname)) { @@ -785,7 +785,7 @@ int mgs_write_log_direct_all(struct obd_device *obd, struct fs_db *fsdb, CERROR("Can't read %s dir\n", MOUNT_CONFIGS_DIR); RETURN(rc); } - + /* Could use fsdb index maps instead of directory listing */ list_for_each_entry_safe(dirent, n, &dentry_list, lld_list) { list_del(&dirent->lld_list); @@ -796,7 +796,7 @@ int mgs_write_log_direct_all(struct obd_device *obd, struct fs_db *fsdb, } OBD_FREE(dirent, sizeof(*dirent)); } - + RETURN(rc); } struct temp_comp @@ -807,7 +807,7 @@ struct temp_comp }; static int mgs_steal_llog_handler(struct llog_handle *llh, - struct llog_rec_hdr *rec, + struct llog_rec_hdr *rec, void *data) { struct obd_device * obd; @@ -942,8 +942,8 @@ static int mgs_steal_llog_handler(struct llog_handle *llh, char *uuid; char *index; char *gen; - char *dash; - + char *dash; + LASSERT(got_an_osc_or_mdc == 1); name_create(lustre_cfg_string(lcfg, 0),"",&name); uuid = lustre_cfg_string(lcfg, 1); @@ -953,7 +953,7 @@ static int mgs_steal_llog_handler(struct llog_handle *llh, *(++dash)='m'; *(++dash)='d'; *(++dash)='t'; - + rc = record_start_log(obd, &mdt_llh, mti->mti_svname); rc = record_lov_add(obd,mdt_llh,name,uuid,index,gen); rc = record_end_log(obd, &mdt_llh); @@ -965,8 +965,8 @@ static int mgs_steal_llog_handler(struct llog_handle *llh, char *uuid; char *index; char *gen; - char *dash; - + char *dash; + LASSERT(got_an_osc_or_mdc == 2); name_create(lustre_cfg_string(lcfg, 0),"",&name); uuid = lustre_cfg_string(lcfg, 1); @@ -979,7 +979,7 @@ static int mgs_steal_llog_handler(struct llog_handle *llh, *(++dash)='c'; *(++dash)='m'; *(++dash)='m'; - + rc = record_start_log(obd, &mdt_llh, mti->mti_svname); rc = record_cmm_add(obd,mdt_llh,name,uuid,index,gen); rc = record_end_log(obd, &mdt_llh); @@ -1000,7 +1000,7 @@ static int mgs_steal_llog_for_mdt_from_client(struct obd_device *obd, ENTRY; push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); - + rc = llog_create(llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT), &loghandle, NULL, client_name); if (rc) @@ -1025,7 +1025,7 @@ out_pop: #if 0 /* lmv is the second thing for client logs */ /* copied from mgs_write_log_lov. Please refer to that. */ -static int mgs_write_log_lmv(struct obd_device *obd, struct fs_db *fsdb, +static int mgs_write_log_lmv(struct obd_device *obd, struct fs_db *fsdb, struct mgs_target_info *mti, char *logname, char *lmvname) { @@ -1046,12 +1046,12 @@ static int mgs_write_log_lmv(struct obd_device *obd, struct fs_db *fsdb, uuid = (char *)lmvdesc->ld_uuid.uuid; rc = record_start_log(obd, &llh, logname); - rc = record_marker(obd, llh, fsdb, CM_START, lmvname, "lmv setup"); + rc = record_marker(obd, llh, fsdb, CM_START, lmvname, "lmv setup"); rc = record_attach(obd, llh, lmvname, "lmv", uuid); rc = record_lmv_setup(obd, llh, lmvname, lmvdesc); - rc = record_marker(obd, llh, fsdb, CM_END, lmvname, "lmv setup"); + rc = record_marker(obd, llh, fsdb, CM_END, lmvname, "lmv setup"); rc = record_end_log(obd, &llh); - + OBD_FREE(lmvdesc, sizeof(*lmvdesc)); RETURN(rc); } @@ -1059,7 +1059,7 @@ static int mgs_write_log_lmv(struct obd_device *obd, struct fs_db *fsdb, #endif /* lov is the first thing in the mdt and client logs */ -static int mgs_write_log_lov(struct obd_device *obd, struct fs_db *fsdb, +static int mgs_write_log_lov(struct obd_device *obd, struct fs_db *fsdb, struct mgs_target_info *mti, char *logname, char *lovname) { @@ -1083,7 +1083,7 @@ static int mgs_write_log_lov(struct obd_device *obd, struct fs_db *fsdb, RETURN(-ENOMEM); lovdesc->ld_magic = LOV_DESC_MAGIC; lovdesc->ld_tgt_count = 0; - /* Defaults. Can be changed later by lcfg config_param */ + /* Defaults. Can be changed later by lcfg config_param */ lovdesc->ld_default_stripe_count = 1; lovdesc->ld_pattern = LOV_PATTERN_RAID0; lovdesc->ld_default_stripe_size = 1024 * 1024; @@ -1095,12 +1095,12 @@ static int mgs_write_log_lov(struct obd_device *obd, struct fs_db *fsdb, /* This should always be the first entry in a log. rc = mgs_clear_log(obd, logname); */ rc = record_start_log(obd, &llh, logname); - rc = record_marker(obd, llh, fsdb, CM_START, lovname, "lov setup"); + rc = record_marker(obd, llh, fsdb, CM_START, lovname, "lov setup"); rc = record_attach(obd, llh, lovname, "lov", uuid); rc = record_lov_setup(obd, llh, lovname, lovdesc); - rc = record_marker(obd, llh, fsdb, CM_END, lovname, "lov setup"); + rc = record_marker(obd, llh, fsdb, CM_END, lovname, "lov setup"); rc = record_end_log(obd, &llh); - + OBD_FREE(lovdesc, sizeof(*lovdesc)); RETURN(rc); } @@ -1129,11 +1129,11 @@ static int mgs_write_log_failnids(struct obd_device *obd, while (class_find_param(ptr, PARAM_FAILNODE, &ptr) == 0) { while (class_parse_nid(ptr, &nid, &ptr) == 0) { if (failnodeuuid == NULL) { - /* We don't know the failover node name, + /* We don't know the failover node name, so just use the first nid as the uuid */ rc = name_create(libcfs_nid2str(nid), "", &failnodeuuid); - if (rc) + if (rc) return rc; } CDEBUG(D_MGS, "add nid %s for failover uuid %s, " @@ -1168,7 +1168,7 @@ static int mgs_write_log_mdc_to_lmv(struct obd_device *obd, struct fs_db *fsdb, //This should not happen! RETURN (-EINVAL); } - + CDEBUG(D_MGS, "adding mdc for %s to log %s:lmv(%s)\n", mti->mti_svname, logname, lmvname); @@ -1178,7 +1178,7 @@ static int mgs_write_log_mdc_to_lmv(struct obd_device *obd, struct fs_db *fsdb, name_create(lmvname, "_UUID", &lmvuuid); rc = record_start_log(obd, &llh, logname); - rc = record_marker(obd, llh, fsdb, CM_START, mti->mti_svname, + rc = record_marker(obd, llh, fsdb, CM_START, mti->mti_svname, "add mdc to lmv"); for (i = 0; i < mti->mti_nid_count; i++) { CDEBUG(D_MGS, "add nid %s for mdt\n", libcfs_nid2str(mti->mti_nids[i])); @@ -1190,9 +1190,9 @@ static int mgs_write_log_mdc_to_lmv(struct obd_device *obd, struct fs_db *fsdb, snprintf(index, sizeof(index), "%d", mti->mti_stripe_index); rc = record_lmv_add(obd, llh, lmvname, mti->mti_uuid, index, "1"); rc = record_marker(obd, llh, fsdb, CM_END, mti->mti_svname, - "add mdc to lmv"); + "add mdc to lmv"); rc = record_end_log(obd, &llh); - + name_destroy(lmvuuid); name_destroy(mdcuuid); name_destroy(mdcname); @@ -1216,7 +1216,7 @@ static int mgs_write_log_mdc_to_mds(struct obd_device *obd, struct fs_db *fsdb, //This should not happen! RETURN (-EINVAL); } - + CDEBUG(D_MGS, "adding mdc for %s to %s\n", mti->mti_svname, tgtname); name_create(libcfs_nid2str(mti->mti_nids[0]), "", &nodeuuid); @@ -1238,9 +1238,9 @@ static int mgs_write_log_mdc_to_mds(struct obd_device *obd, struct fs_db *fsdb, snprintf(index, sizeof(index), "%d", mti->mti_stripe_index); rc = record_base(obd, llh, tgtname, 0, LCFG_ADD_MDC, mdcuuid, index, "1", 0); - rc = record_marker(obd, llh, fsdb, CM_END, tgtname, "add mdc to cmm"); + rc = record_marker(obd, llh, fsdb, CM_END, tgtname, "add mdc to cmm"); rc = record_end_log(obd, &llh); - + name_destroy(mdcuuid); name_destroy(mdcname); name_destroy(nodeuuid); @@ -1260,16 +1260,16 @@ static int mgs_write_log_mdt0(struct obd_device *obd, struct fs_db *fsdb, OBD_ALLOC(uuid, sizeof(struct obd_uuid)); if (uuid == NULL) RETURN(-ENOMEM); - + sprintf((char *)uuid, "%s_UUID", dev); /* add MDT itself */ rc = record_start_log(obd, &llh, log); - rc = record_marker(obd, llh, fsdb, CM_START, dev, "add mdt"); + rc = record_marker(obd, llh, fsdb, CM_START, dev, "add mdt"); rc = record_attach(obd, llh, dev, LUSTRE_MDT0_NAME, uuid); rc = record_setup(obd, llh, dev, uuid, 0, 0, 0); - rc = record_marker(obd, llh, fsdb, CM_END, dev, "add mdt"); + rc = record_marker(obd, llh, fsdb, CM_END, dev, "add mdt"); rc = record_end_log(obd, &llh); - + OBD_FREE(uuid, sizeof(*uuid)); RETURN(rc); } @@ -1289,7 +1289,7 @@ static int mgs_write_log_mds(struct obd_device *obd, struct fs_db *fsdb, CDEBUG(D_MGS, "writing new mds %s\n", mti->mti_svname); /* Make up our own uuid */ - snprintf(mti->mti_uuid, sizeof(mti->mti_uuid), "%s_UUID", mti->mti_svname); + snprintf(mti->mti_uuid, sizeof(mti->mti_uuid), "%s_UUID", mti->mti_svname); name_create(mti->mti_fsname, "-mdtmdt", &mdtname); name_create(mti->mti_fsname, "-mdtlov", &lovname); diff --git a/lustre/obdclass/lu_object.c b/lustre/obdclass/lu_object.c index 6f9a6bf..17d9f92 100644 --- a/lustre/obdclass/lu_object.c +++ b/lustre/obdclass/lu_object.c @@ -166,9 +166,9 @@ int lu_object_print(struct lu_context *ctx, depth = scan->lo_depth; if (depth <= o->lo_depth && scan != o) break; - LASSERT(lu_object_ops(scan)->ldo_object_print != NULL); + LASSERT(scan->lo_ops->loo_object_print != NULL); nob += seq_printf(f, "%*.*s", depth, depth, ruler); - nob += lu_object_ops(scan)->ldo_object_print(ctx, f, scan); + nob += scan->lo_ops->loo_object_print(ctx, f, scan); nob += seq_printf(f, "\n"); } return nob; diff --git a/lustre/osd/osd_handler.c b/lustre/osd/osd_handler.c index 01d250a..fb9270b 100644 --- a/lustre/osd/osd_handler.c +++ b/lustre/osd/osd_handler.c @@ -65,6 +65,7 @@ static int osd_type_init (struct lu_device_type *t); static void osd_type_fini (struct lu_device_type *t); static int osd_object_init (struct lu_context *ctxt, struct lu_object *l); static void osd_object_release(struct lu_context *ctxt, struct lu_object *l); +static int osd_object_exists (struct lu_context *ctx, struct lu_object *o); static int osd_object_print (struct lu_context *ctx, struct seq_file *f, const struct lu_object *o); static void osd_device_free (struct lu_device *m); @@ -93,12 +94,15 @@ static struct lu_fid *osd_inode_get_fid(const struct inode *inode, static struct lu_device_type_operations osd_device_type_ops; static struct lu_device_type osd_device_type; +static struct lu_object_operations osd_lu_obj_ops; static struct obd_ops osd_obd_device_ops; 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; +static struct dt_body_operations osd_body_ops; +static struct dt_index_operations osd_index_ops; /* * DT methods. @@ -127,6 +131,7 @@ 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; + l->lo_ops = &osd_lu_obj_ops; return l; } else return NULL; @@ -134,7 +139,19 @@ static struct lu_object *osd_object_alloc(struct lu_context *ctx, static int osd_object_init(struct lu_context *ctxt, struct lu_object *l) { - return osd_fid_lookup(ctxt, osd_obj(l), lu_object_fid(l)); + struct osd_object *obj = osd_obj(l); + int result; + + 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; + } + } + return result; } static void osd_object_free(struct lu_context *ctx, struct lu_object *l) @@ -164,6 +181,11 @@ static void osd_object_release(struct lu_context *ctxt, struct lu_object *l) set_bit(LU_OBJECT_HEARD_BANSHEE, &l->lo_header->loh_flags); } +static int osd_object_exists(struct lu_context *ctx, struct lu_object *o) +{ + return osd_obj(o)->oo_inode != NULL; +} + static int osd_object_print(struct lu_context *ctx, struct seq_file *f, const struct lu_object *l) { @@ -213,6 +235,12 @@ static struct dt_object_operations osd_obj_ops = { .do_attr_get = osd_attr_get }; +static struct dt_body_operations osd_body_ops = { +}; + +static struct dt_index_operations osd_index_ops = { +}; + static struct dt_device_operations osd_dt_ops = { .dt_root_get = osd_root_get, .dt_config = osd_config, @@ -519,13 +547,17 @@ static struct super_block *osd_sb(const struct osd_device *dev) return dev->od_mount->lmi_mnt->mnt_sb; } +static struct lu_object_operations osd_lu_obj_ops = { + .loo_object_print = osd_object_print, + .loo_object_exists = osd_object_exists +}; + static struct lu_device_operations osd_lu_ops = { .ldo_object_alloc = osd_object_alloc, .ldo_object_init = osd_object_init, .ldo_object_free = osd_object_free, .ldo_object_release = osd_object_release, .ldo_object_delete = osd_object_delete, - .ldo_object_print = osd_object_print, .ldo_process_config = osd_process_config }; diff --git a/lustre/osd/osd_internal.h b/lustre/osd/osd_internal.h index 0bdac67..02dcc47 100644 --- a/lustre/osd/osd_internal.h +++ b/lustre/osd/osd_internal.h @@ -34,7 +34,7 @@ /* struct rw_semaphore */ #include -#include +#include #include "osd_oi.h" -- 1.8.3.1