Whamcloud - gitweb
b=14340
[fs/lustre-release.git] / lustre / osd / osd_handler.c
index 85f3e06..68f2e3e 100644 (file)
 #include <obd_support.h>
 /* struct ptlrpc_thread */
 #include <lustre_net.h>
-/* LUSTRE_OSD_NAME */
-#include <obd.h>
-/* class_register_type(), class_unregister_type(), class_get_type() */
-#include <obd_class.h>
-#include <lustre_disk.h>
 
 /* fid_is_local() */
 #include <lustre_fid.h>
@@ -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);
 }