X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosd%2Fosd_handler.c;h=68f2e3e758bebbb143e84f8b811d44c53baca175;hp=85f3e06428d74bfa04fdf72afa4bbd3cbb35df62;hb=2ce82af177059e9fe56f1a48a38b2b9338b74b4c;hpb=1f8b7d9dd5ecf9eecaf52327f114201c3c171554 diff --git a/lustre/osd/osd_handler.c b/lustre/osd/osd_handler.c index 85f3e06..68f2e3e 100644 --- a/lustre/osd/osd_handler.c +++ b/lustre/osd/osd_handler.c @@ -60,11 +60,6 @@ #include /* struct ptlrpc_thread */ #include -/* LUSTRE_OSD_NAME */ -#include -/* class_register_type(), class_unregister_type(), class_get_type() */ -#include -#include /* fid_is_local() */ #include @@ -98,51 +93,8 @@ struct osd_object { #endif }; -/* - * osd device. - */ -struct osd_device { - /* super-class */ - struct dt_device od_dt_dev; - /* information about underlying file system */ - struct lustre_mount_info *od_mount; - /* object index */ - struct osd_oi od_oi; - /* - * XXX temporary stuff for object index: directory where every object - * is named by its fid. - */ - struct dentry *od_obj_area; - - /* Environment for transaction commit callback. - * Currently, OSD is based on ext3/JBD. Transaction commit in ext3/JBD - * is serialized, that is there is no more than one transaction commit - * at a time (JBD journal_commit_transaction() is serialized). - * This means that it's enough to have _one_ lu_context. - */ - struct lu_env od_env_for_commit; - - /* - * Fid Capability - */ - unsigned int od_fl_capa:1; - unsigned long od_capa_timeout; - __u32 od_capa_alg; - struct lustre_capa_key *od_capa_keys; - struct hlist_head *od_capa_hash; - - /* - * statfs optimization: we cache a bit. - */ - cfs_time_t od_osfs_age; - struct kstatfs od_kstatfs; - spinlock_t od_osfs_lock; -}; - static int osd_root_get (const struct lu_env *env, struct dt_device *dev, struct lu_fid *f); -static int osd_statfs (const struct lu_env *env, - struct dt_device *dev, struct kstatfs *sfs); static int lu_device_is_osd (const struct lu_device *d); static void osd_mod_exit (void) __exit; @@ -155,7 +107,7 @@ static void osd_object_release(const struct lu_env *env, struct lu_object *l); static int osd_object_print (const struct lu_env *env, void *cookie, lu_printer_t p, const struct lu_object *o); -static void osd_device_free (const struct lu_env *env, +static struct lu_device *osd_device_free (const struct lu_env *env, struct lu_device *m); static void *osd_key_init (const struct lu_context *ctx, struct lu_context_key *key); @@ -252,8 +204,6 @@ 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; @@ -556,8 +506,8 @@ static int osd_object_print(const struct lu_env *env, void *cookie, /* * Concurrency: shouldn't matter. */ -static int osd_statfs(const struct lu_env *env, - struct dt_device *d, struct kstatfs *sfs) +int osd_statfs(const struct lu_env *env, struct dt_device *d, + struct kstatfs *sfs) { struct osd_device *osd = osd_dt_dev(d); struct super_block *sb = osd_sb(osd); @@ -621,11 +571,14 @@ static void osd_trans_commit_cb(struct journal_callback *jcb, int error) if (error) { CERROR("transaction @0x%p commit error: %d\n", th, error); } else { + struct lu_env *env = &osd_dt_dev(dev)->od_env_for_commit; /* * This od_env_for_commit is only for commit usage. see * "struct dt_device" */ - dt_txn_hook_commit(&osd_dt_dev(dev)->od_env_for_commit, th); + lu_context_enter(&env->le_ctx); + dt_txn_hook_commit(env, th); + lu_context_exit(&env->le_ctx); } lu_device_put(&dev->dd_lu_dev); @@ -1084,8 +1037,6 @@ static void osd_inode_setattr(const struct lu_env *env, inode->i_nlink = attr->la_nlink; if (bits & LA_RDEV) inode->i_rdev = attr->la_rdev; - if (bits & LA_BLKSIZE) - inode->i_blksize = attr->la_blksize; if (bits & LA_FLAGS) { struct ldiskfs_inode_info *li = LDISKFS_I(inode); @@ -1958,7 +1909,7 @@ static struct dt_rec *osd_it_rec(const struct lu_env *env, return (struct dt_rec *)iam_it_rec_get(&it->oi_it); } -static __u32 osd_it_store(const struct lu_env *env, const struct dt_it *di) +static __u64 osd_it_store(const struct lu_env *env, const struct dt_it *di) { struct osd_it *it = (struct osd_it *)di; @@ -1966,7 +1917,7 @@ static __u32 osd_it_store(const struct lu_env *env, const struct dt_it *di) } static int osd_it_load(const struct lu_env *env, - const struct dt_it *di, __u32 hash) + const struct dt_it *di, __u64 hash) { struct osd_it *it = (struct osd_it *)di; @@ -2249,7 +2200,13 @@ static void osd_key_exit(const struct lu_context *ctx, static int osd_device_init(const struct lu_env *env, struct lu_device *d, const char *name, struct lu_device *next) { - return lu_env_init(&osd_dev(d)->od_env_for_commit, NULL, LCT_MD_THREAD); + int rc; + /* context for commit hooks */ + rc = lu_context_init(&osd_dev(d)->od_env_for_commit.le_ctx, + LCT_MD_THREAD); + if (rc == 0) + rc = osd_procfs_init(osd_dev(d), name); + return rc; } static int osd_shutdown(const struct lu_env *env, struct osd_device *o) @@ -2309,17 +2266,24 @@ static int osd_mount(const struct lu_env *env, static struct lu_device *osd_device_fini(const struct lu_env *env, struct lu_device *d) { + int rc; ENTRY; shrink_dcache_sb(osd_sb(osd_dev(d))); osd_sync(env, lu2dt_dev(d)); + rc = osd_procfs_fini(osd_dev(d)); + if (rc) { + CERROR("proc fini error %d \n", rc); + RETURN (ERR_PTR(rc)); + } + if (osd_dev(d)->od_mount) server_put_mount(osd_dev(d)->od_mount->lmi_name, osd_dev(d)->od_mount->lmi_mnt); osd_dev(d)->od_mount = NULL; - lu_env_fini(&osd_dev(d)->od_env_for_commit); + lu_context_fini(&osd_dev(d)->od_env_for_commit.le_ctx); RETURN(NULL); } @@ -2351,13 +2315,16 @@ static struct lu_device *osd_device_alloc(const struct lu_env *env, return l; } -static void osd_device_free(const struct lu_env *env, struct lu_device *d) +static struct lu_device *osd_device_free(const struct lu_env *env, + struct lu_device *d) { struct osd_device *o = osd_dev(d); + ENTRY; cleanup_capa_hash(o->od_capa_hash); dt_device_fini(&o->od_dt_dev); OBD_FREE_PTR(o); + RETURN(NULL); } static int osd_process_config(const struct lu_env *env, @@ -2488,7 +2455,8 @@ static void osd_inode_getattr(const struct lu_env *env, attr->la_flags = LDISKFS_I(inode)->i_flags; attr->la_nlink = inode->i_nlink; attr->la_rdev = inode->i_rdev; - attr->la_blksize = inode->i_blksize; + attr->la_blksize = ll_inode_blksize(inode); + attr->la_blkbits = inode->i_blkbits; } /* @@ -2589,25 +2557,15 @@ static struct lu_device_type osd_device_type = { /* * lprocfs legacy support. */ -static struct lprocfs_vars lprocfs_osd_obd_vars[] = { - { 0 } -}; - -static struct lprocfs_vars lprocfs_osd_module_vars[] = { - { 0 } -}; - static struct obd_ops osd_obd_device_ops = { .o_owner = THIS_MODULE }; -LPROCFS_INIT_VARS(osd, lprocfs_osd_module_vars, lprocfs_osd_obd_vars); - static int __init osd_mod_init(void) { struct lprocfs_static_vars lvars; - lprocfs_init_vars(osd, &lvars); + lprocfs_osd_init_vars(&lvars); return class_register_type(&osd_obd_device_ops, NULL, lvars.module_vars, LUSTRE_OSD_NAME, &osd_device_type); }