Whamcloud - gitweb
LU-1302 mgs: mgs uses llog over OSD
authorMikhail Pershin <tappro@whamcloud.com>
Tue, 25 Sep 2012 08:50:41 +0000 (12:50 +0400)
committerOleg Drokin <green@whamcloud.com>
Fri, 28 Sep 2012 03:51:42 +0000 (23:51 -0400)
- llog over OSD in MGS. Switch llog_test to work over OSD too.
- local_oid_store_init() don't create names for llog because all
  llogs have names in O/d/n
- Enable all llog tests functionality

Signed-off-by: Mikhail Pershin <tappro@whamcloud.com>
Change-Id: I60cc5ec7094a2640d7fc0a0d87519c56b1383557
Reviewed-on: http://review.whamcloud.com/4104
Tested-by: Hudson
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: Maloo <whamcloud.maloo@gmail.com>
14 files changed:
lustre/include/obd_class.h
lustre/liblustre/llite_lib.c
lustre/lvfs/lvfs_linux.c
lustre/mdc/mdc_request.c
lustre/mgc/mgc_request.c
lustre/mgs/mgs_fs.c
lustre/mgs/mgs_handler.c
lustre/mgs/mgs_internal.h
lustre/mgs/mgs_llog.c
lustre/mgs/mgs_nids.c
lustre/obdclass/llog_test.c
lustre/obdclass/local_storage.c
lustre/obdclass/obd_config.c
lustre/osd-ldiskfs/osd_handler.c

index cee9da9..f5522ef 100644 (file)
@@ -165,10 +165,10 @@ struct config_llog_instance {
         int                 cfg_last_idx; /* for partial llog processing */
         int                 cfg_flags;
 };
-int class_config_parse_llog(struct llog_ctxt *ctxt, char *name,
-                            struct config_llog_instance *cfg);
-int class_config_dump_llog(struct llog_ctxt *ctxt, char *name,
-                           struct config_llog_instance *cfg);
+int class_config_parse_llog(const struct lu_env *env, struct llog_ctxt *ctxt,
+                           char *name, struct config_llog_instance *cfg);
+int class_config_dump_llog(const struct lu_env *env, struct llog_ctxt *ctxt,
+                          char *name, struct config_llog_instance *cfg);
 
 enum {
         CONFIG_T_CONFIG  = 0,
index b197f7e..a024f29 100644 (file)
@@ -173,7 +173,7 @@ int liblustre_process_log(struct config_llog_instance *cfg,
 
         ctxt = llog_get_context(exp->exp_obd, LLOG_CONFIG_REPL_CTXT);
         cfg->cfg_flags |= CFG_F_COMPAT146;
-        rc = class_config_parse_llog(ctxt, profile, cfg);
+       rc = class_config_parse_llog(NULL, ctxt, profile, cfg);
         llog_ctxt_put(ctxt);
         if (rc) {
                 CERROR("class_config_parse_llog failed: rc = %d\n", rc);
index f206e7e..a79fecc 100644 (file)
@@ -117,6 +117,10 @@ static void pop_group_info(struct lvfs_run_ctxt *save,
 void push_ctxt(struct lvfs_run_ctxt *save, struct lvfs_run_ctxt *new_ctx,
                struct lvfs_ucred *uc)
 {
+       /* if there is underlaying dt_device then push_ctxt is not needed */
+       if (new_ctx->dt != NULL)
+               return;
+
         //ASSERT_NOT_KERNEL_CTXT("already in kernel context!\n");
         ASSERT_CTXT_MAGIC(new_ctx->magic);
         OBD_SET_CTXT_MAGIC(save);
@@ -165,6 +169,10 @@ EXPORT_SYMBOL(push_ctxt);
 void pop_ctxt(struct lvfs_run_ctxt *saved, struct lvfs_run_ctxt *new_ctx,
               struct lvfs_ucred *uc)
 {
+       /* if there is underlaying dt_device then pop_ctxt is not needed */
+       if (new_ctx->dt != NULL)
+               return;
+
         ASSERT_CTXT_MAGIC(saved->magic);
         ASSERT_KERNEL_CTXT("popping non-kernel context!\n");
 
index c17d2c8..88a42ab 100644 (file)
@@ -1486,7 +1486,8 @@ static int mdc_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
                 GOTO(out, rc);
         case OBD_IOC_PARSE: {
                 ctxt = llog_get_context(exp->exp_obd, LLOG_CONFIG_REPL_CTXT);
-                rc = class_config_parse_llog(ctxt, data->ioc_inlbuf1, NULL);
+               rc = class_config_parse_llog(NULL, ctxt, data->ioc_inlbuf1,
+                                            NULL);
                 llog_ctxt_put(ctxt);
                 GOTO(out, rc);
         }
index 8b208e7..b1553ba 100644 (file)
@@ -1757,7 +1757,8 @@ static int mgc_process_cfg_log(struct obd_device *mgc,
         /* logname and instance info should be the same, so use our
            copy of the instance for the update.  The cfg_last_idx will
            be updated here. */
-        rc = class_config_parse_llog(ctxt, cld->cld_logname, &cld->cld_cfg);
+       rc = class_config_parse_llog(NULL, ctxt, cld->cld_logname,
+                                    &cld->cld_cfg);
         EXIT;
 
 out_pop:
index 6bab713..e5b1fb6 100644 (file)
 
 #define DEBUG_SUBSYSTEM S_MGS
 
-#include <linux/module.h>
-#include <linux/kmod.h>
-#include <linux/version.h>
-#include <linux/sched.h>
-#include <linux/mount.h>
-#include <obd_class.h>
-#include <obd_support.h>
-#include <lustre_disk.h>
-#include <lustre_lib.h>
-#include <lustre_fsfilt.h>
-#include <libcfs/list.h>
 #include <lustre_fid.h>
 #include "mgs_internal.h"
 
@@ -116,134 +105,14 @@ int mgs_client_free(struct obd_export *exp)
         return 0;
 }
 
-/* Same as mds_lvfs_fid2dentry */
-/* Look up an entry by inode number. */
-/* this function ONLY returns valid dget'd dentries with an initialized inode
-   or errors */
-static struct dentry *mgs_lvfs_fid2dentry(__u64 id, __u32 gen,
-                                          __u64 gr, void *data)
-{
-        struct fsfilt_fid  fid;
-        struct obd_device *obd = (struct obd_device *)data;
-       struct mgs_device *mgs = lu2mgs_dev(obd->obd_lu_dev);
-        ENTRY;
-
-        CDEBUG(D_DENTRY, "--> mgs_fid2dentry: ino/gen %lu/%u, sb %p\n",
-              (unsigned long)id, gen, mgs->mgs_sb);
-
-        if (id == 0)
-                RETURN(ERR_PTR(-ESTALE));
-
-        fid.ino = id;
-        fid.gen = gen;
-
-       RETURN(fsfilt_fid2dentry(obd, mgs->mgs_vfsmnt, &fid, 0));
-}
-
-struct lvfs_callback_ops mgs_lvfs_ops = {
-        l_fid2dentry:     mgs_lvfs_fid2dentry,
-};
-
-int mgs_fs_setup_old(const struct lu_env *env, struct mgs_device *mgs)
-{
-       struct obd_device *obd = mgs->mgs_obd;
-       struct dt_device_param p;
-       struct vfsmount *mnt;
-        struct lvfs_run_ctxt saved;
-        struct dentry *dentry;
-        int rc;
-        ENTRY;
-
-       dt_conf_get(env, mgs->mgs_bottom, &p);
-       mnt = p.ddp_mnt;
-       if (mnt == NULL) {
-               CERROR("%s: no proper support for OSD yet\n", obd->obd_name);
-               RETURN(-ENODEV);
-       }
-
-        /* FIXME what's this?  Do I need it? */
-        rc = cfs_cleanup_group_info();
-        if (rc)
-                RETURN(rc);
-
-        mgs->mgs_vfsmnt = mnt;
-        mgs->mgs_sb = mnt->mnt_root->d_inode->i_sb;
-
-       obd->obd_fsops = fsfilt_get_ops(mt_str(p.ddp_mount_type));
-       if (IS_ERR(obd->obd_fsops))
-               RETURN(PTR_ERR(obd->obd_fsops));
-
-        rc = fsfilt_setup(obd, mgs->mgs_sb);
-        if (rc)
-                RETURN(rc);
-
-        OBD_SET_CTXT_MAGIC(&obd->obd_lvfs_ctxt);
-        obd->obd_lvfs_ctxt.pwdmnt = mnt;
-        obd->obd_lvfs_ctxt.pwd = mnt->mnt_root;
-        obd->obd_lvfs_ctxt.fs = get_ds();
-        obd->obd_lvfs_ctxt.cb_ops = mgs_lvfs_ops;
-
-        push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
-
-        /* Setup the configs dir */
-        dentry = simple_mkdir(cfs_fs_pwd(current->fs), mnt, MOUNT_CONFIGS_DIR, 0777, 1);
-        if (IS_ERR(dentry)) {
-                rc = PTR_ERR(dentry);
-                CERROR("cannot create %s directory: rc = %d\n",
-                       MOUNT_CONFIGS_DIR, rc);
-                GOTO(err_pop, rc);
-        }
-       mgs->mgs_configs_dir_old = dentry;
-
-        /* create directory to store nid table versions */
-        dentry = simple_mkdir(cfs_fs_pwd(current->fs), mnt, MGS_NIDTBL_DIR,
-                              0777, 1);
-        if (IS_ERR(dentry)) {
-                rc = PTR_ERR(dentry);
-                CERROR("cannot create %s directory: rc = %d\n",
-                       MOUNT_CONFIGS_DIR, rc);
-                GOTO(err_pop, rc);
-        } else {
-                dput(dentry);
-        }
-
-err_pop:
-        pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
-        return rc;
-}
-
-int mgs_fs_cleanup_old(const struct lu_env *env, struct mgs_device *mgs)
-{
-       struct obd_device *obd = mgs->mgs_obd;
-        struct lvfs_run_ctxt saved;
-        int rc = 0;
-
-        class_disconnect_exports(obd); /* cleans up client info too */
-
-        push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
-
-       if (mgs->mgs_configs_dir_old) {
-               l_dput(mgs->mgs_configs_dir_old);
-               mgs->mgs_configs_dir_old = NULL;
-       }
-
-        shrink_dcache_sb(mgs->mgs_sb);
-
-        pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
-
-       if (obd->obd_fsops)
-               fsfilt_put_ops(obd->obd_fsops);
-
-        return rc;
-}
-
 int mgs_fs_setup(const struct lu_env *env, struct mgs_device *mgs)
 {
-       struct lu_fid     fid;
-       struct dt_object *o;
-       struct lu_fid     rfid;
-       struct dt_object *root;
-       int rc;
+       struct lu_fid            fid;
+       struct dt_object        *o;
+       struct lu_fid            rfid;
+       struct dt_object        *root;
+       int                      rc;
+
        ENTRY;
 
        /* FIXME what's this?  Do I need it? */
@@ -251,6 +120,9 @@ int mgs_fs_setup(const struct lu_env *env, struct mgs_device *mgs)
        if (rc)
                RETURN(rc);
 
+       OBD_SET_CTXT_MAGIC(&mgs->mgs_obd->obd_lvfs_ctxt);
+       mgs->mgs_obd->obd_lvfs_ctxt.dt = mgs->mgs_bottom;
+
        /* XXX: fix when support for N:1 layering is implemented */
        LASSERT(mgs->mgs_dt_dev.dd_lu_dev.ld_site);
        mgs->mgs_dt_dev.dd_lu_dev.ld_site->ls_top_dev =
@@ -302,19 +174,11 @@ out_los:
 out:
        mgs->mgs_dt_dev.dd_lu_dev.ld_site->ls_top_dev = NULL;
 
-       if (rc == 0) {
-               rc = mgs_fs_setup_old(env, mgs);
-               if (rc)
-                       mgs_fs_cleanup(env, mgs);
-       }
-
        return rc;
 }
 
 int mgs_fs_cleanup(const struct lu_env *env, struct mgs_device *mgs)
 {
-       mgs_fs_cleanup_old(env, mgs);
-
        class_disconnect_exports(mgs->mgs_obd); /* cleans up client info too */
 
        if (mgs->mgs_configs_dir) {
index 29b7ab7..b1804c3 100644 (file)
 #define DEBUG_SUBSYSTEM S_MGS
 #define D_MGS D_CONFIG
 
-#ifdef __KERNEL__
-# include <linux/module.h>
-# include <linux/pagemap.h>
-# include <linux/miscdevice.h>
-# include <linux/init.h>
-#else
-# include <liblustre.h>
-#endif
-
 #include <obd_class.h>
-#include <lustre_dlm.h>
 #include <lprocfs_status.h>
-#include <lustre_fsfilt.h>
-#include <lustre_disk.h>
 #include <lustre_param.h>
-#include <lustre_log.h>
 
 #include "mgs_internal.h"
 
@@ -144,32 +131,6 @@ static int mgs_disconnect(struct obd_export *exp)
 
 static int mgs_handle(struct ptlrpc_request *req);
 
-static int mgs_llog_init(struct obd_device *obd, struct obd_llog_group *olg,
-                        struct obd_device *tgt, int *index)
-{
-       int rc;
-
-       ENTRY;
-
-       LASSERT(olg == &obd->obd_olg);
-       rc = llog_setup(NULL, obd, olg, LLOG_CONFIG_ORIG_CTXT, obd,
-                       &llog_lvfs_ops);
-       RETURN(rc);
-}
-
-static int mgs_llog_finish(struct obd_device *obd, int count)
-{
-       struct llog_ctxt *ctxt;
-
-       ENTRY;
-
-       ctxt = llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT);
-       if (ctxt)
-               llog_cleanup(NULL, ctxt);
-
-       RETURN(0);
-}
-
 static int mgs_completion_ast_config(struct ldlm_lock *lock, int flags,
                                      void *cbdata)
 {
@@ -371,10 +332,10 @@ static int mgs_handle_target_reg(struct ptlrpc_request *req)
                 if (rc <= 0)
                         /* Nothing wrong, or fatal error */
                         GOTO(out_nolock, rc);
-        } else {
-                if (!(mti->mti_flags & LDD_F_NO_PRIMNODE)
-                    && (rc = mgs_check_failover_reg(mti)))
-                        GOTO(out_nolock, rc);
+       } else if (!(mti->mti_flags & LDD_F_NO_PRIMNODE)) {
+               rc = mgs_check_failover_reg(mti);
+               if (rc)
+                       GOTO(out_nolock, rc);
         }
 
         OBD_FAIL_TIMEOUT(OBD_FAIL_MGS_PAUSE_TARGET_REG, 10);
@@ -848,19 +809,16 @@ static int mgs_iocontrol_pool(const struct lu_env *env,
        struct mgs_thread_info *mgi = mgs_env_info(env);
         int rc;
         struct lustre_cfg *lcfg = NULL;
-        struct llog_rec_hdr rec;
         char *poolname = NULL;
         ENTRY;
 
         OBD_ALLOC(poolname, LOV_MAXPOOLNAME + 1);
        if (poolname == NULL)
                RETURN(-ENOMEM);
-        rec.lrh_len = llog_data_len(data->ioc_plen1);
 
-        if (data->ioc_type == LUSTRE_CFG_TYPE) {
-                rec.lrh_type = OBD_CFG_REC;
-        } else {
-                CERROR("unknown cfg record type:%d \n", data->ioc_type);
+       if (data->ioc_type != LUSTRE_CFG_TYPE) {
+               CERROR("%s: unknown cfg record type: %d\n",
+                      mgs->mgs_obd->obd_name, data->ioc_type);
                GOTO(out_pool, rc = -EINVAL);
         }
 
@@ -931,7 +889,6 @@ int mgs_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
 {
        struct mgs_device *mgs = exp2mgs_dev(exp);
         struct obd_ioctl_data *data = karg;
-        struct lvfs_run_ctxt saved;
        struct lu_env env;
         int rc = 0;
 
@@ -947,14 +904,10 @@ int mgs_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
         case OBD_IOC_PARAM: {
                struct mgs_thread_info *mgi = mgs_env_info(&env);
                 struct lustre_cfg *lcfg;
-                struct llog_rec_hdr rec;
-
-                rec.lrh_len = llog_data_len(data->ioc_plen1);
 
-                if (data->ioc_type == LUSTRE_CFG_TYPE) {
-                        rec.lrh_type = OBD_CFG_REC;
-                } else {
-                        CERROR("unknown cfg record type:%d \n", data->ioc_type);
+               if (data->ioc_type != LUSTRE_CFG_TYPE) {
+                       CERROR("%s: unknown cfg record type: %d\n",
+                              mgs->mgs_obd->obd_name, data->ioc_type);
                        GOTO(out, rc = -EINVAL);
                 }
 
@@ -982,31 +935,32 @@ out_free:
 
         case OBD_IOC_DUMP_LOG: {
                 struct llog_ctxt *ctxt;
+
                ctxt = llog_get_context(mgs->mgs_obd, LLOG_CONFIG_ORIG_CTXT);
-               push_ctxt(&saved, &mgs->mgs_obd->obd_lvfs_ctxt, NULL);
-                rc = class_config_dump_llog(ctxt, data->ioc_inlbuf1, NULL);
-               pop_ctxt(&saved, &mgs->mgs_obd->obd_lvfs_ctxt, NULL);
+               rc = class_config_dump_llog(&env, ctxt, data->ioc_inlbuf1,
+                                           NULL);
                 llog_ctxt_put(ctxt);
 
                break;
         }
 
+       case OBD_IOC_LLOG_CANCEL:
+       case OBD_IOC_LLOG_REMOVE:
         case OBD_IOC_LLOG_CHECK:
         case OBD_IOC_LLOG_INFO:
         case OBD_IOC_LLOG_PRINT: {
                 struct llog_ctxt *ctxt;
 
                ctxt = llog_get_context(mgs->mgs_obd, LLOG_CONFIG_ORIG_CTXT);
-               push_ctxt(&saved, &ctxt->loc_exp->exp_obd->obd_lvfs_ctxt, NULL);
-               rc = llog_ioctl(NULL, ctxt, cmd, data);
-               pop_ctxt(&saved, &ctxt->loc_exp->exp_obd->obd_lvfs_ctxt, NULL);
+               rc = llog_ioctl(&env, ctxt, cmd, data);
                llog_ctxt_put(ctxt);
                break;
         }
 
         default:
-                CDEBUG(D_INFO, "unknown command %x\n", cmd);
-               rc = -EINVAL;
+               CERROR("%s: unknown command %#x\n",
+                      mgs->mgs_obd->obd_name,  cmd);
+               rc = -ENOTTY;
                break;
         }
 out:
@@ -1052,11 +1006,13 @@ out:
 static int mgs_init0(const struct lu_env *env, struct mgs_device *mgs,
                     struct lu_device_type *ldt, struct lustre_cfg *lcfg)
 {
-       static struct ptlrpc_service_conf       conf;
-       struct lprocfs_static_vars  lvars = { 0 };
-       struct obd_device          *obd;
-       struct lustre_mount_info   *lmi;
-       int                         rc;
+       static struct ptlrpc_service_conf        conf;
+       struct lprocfs_static_vars               lvars = { 0 };
+       struct obd_device                       *obd;
+       struct lustre_mount_info                *lmi;
+       struct llog_ctxt                        *ctxt;
+       int                                      rc;
+
        ENTRY;
 
        lmi = server_get_mount(lustre_cfg_string(lcfg, 0));
@@ -1096,10 +1052,18 @@ static int mgs_init0(const struct lu_env *env, struct mgs_device *mgs,
                GOTO(err_ns, rc);
        }
 
-       rc = obd_llog_init(obd, &obd->obd_olg, obd, NULL);
+       rc = llog_setup(env, obd, &obd->obd_olg, LLOG_CONFIG_ORIG_CTXT,
+                       obd, &llog_osd_ops);
        if (rc)
                GOTO(err_fs, rc);
 
+       /* XXX: we need this trick till N:1 stack is supported
+        * set "current" directory for named llogs */
+       ctxt = llog_get_context(mgs->mgs_obd, LLOG_CONFIG_ORIG_CTXT);
+       LASSERT(ctxt);
+       ctxt->loc_dir = mgs->mgs_configs_dir;
+       llog_ctxt_put(ctxt);
+
        /* No recovery for MGC's */
        obd->obd_replayable = 0;
 
@@ -1159,6 +1123,11 @@ static int mgs_init0(const struct lu_env *env, struct mgs_device *mgs,
 err_lproc:
        lproc_mgs_cleanup(mgs);
 err_llog:
+       ctxt = llog_get_context(mgs->mgs_obd, LLOG_CONFIG_ORIG_CTXT);
+       if (ctxt) {
+               ctxt->loc_dir = NULL;
+               llog_cleanup(env, ctxt);
+       }
 err_fs:
        /* No extra cleanup needed for llog_init_commit_thread() */
        mgs_fs_cleanup(env, mgs);
@@ -1302,8 +1271,10 @@ static struct lu_device *mgs_device_alloc(const struct lu_env *env,
 static struct lu_device *mgs_device_fini(const struct lu_env *env,
                                         struct lu_device *d)
 {
-       struct mgs_device *mgs = lu2mgs_dev(d);
-       struct obd_device *obd = mgs->mgs_obd;
+       struct mgs_device       *mgs = lu2mgs_dev(d);
+       struct obd_device       *obd = mgs->mgs_obd;
+       struct llog_ctxt        *ctxt;
+
        ENTRY;
 
        LASSERT(mgs->mgs_bottom);
@@ -1318,7 +1289,11 @@ static struct lu_device *mgs_device_fini(const struct lu_env *env,
        mgs_cleanup_fsdb_list(mgs);
        lproc_mgs_cleanup(mgs);
 
-       obd_llog_finish(obd, 0);
+       ctxt = llog_get_context(mgs->mgs_obd, LLOG_CONFIG_ORIG_CTXT);
+       if (ctxt) {
+               ctxt->loc_dir = NULL;
+               llog_cleanup(env, ctxt);
+       }
 
        mgs_fs_cleanup(env, mgs);
 
@@ -1376,8 +1351,6 @@ static struct obd_ops mgs_obd_ops = {
         .o_init_export     = mgs_init_export,
         .o_destroy_export  = mgs_destroy_export,
         .o_iocontrol       = mgs_iocontrol,
-        .o_llog_init       = mgs_llog_init,
-        .o_llog_finish     = mgs_llog_finish
 };
 
 static int __init mgs_init(void)
index 099f62c..a13a301 100644 (file)
@@ -38,7 +38,9 @@
 #define _MGS_INTERNAL_H
 
 #include <libcfs/libcfs.h>
+#include <lustre_log.h>
 #include <lustre_export.h>
+#include <dt_object.h>
 
 #define MGSSELF_NAME    "_mgs"
 
@@ -141,7 +143,6 @@ struct fs_db {
         struct mgs_nidtbl    fsdb_nidtbl;
 
         /* async thread to notify clients */
-        struct obd_device   *fsdb_obd;
        struct mgs_device   *fsdb_mgs;
         cfs_waitq_t          fsdb_notify_waitq;
         cfs_completion_t     fsdb_notify_comp;
@@ -155,17 +156,12 @@ struct fs_db {
         unsigned int         fsdb_notify_count;
 };
 
-/* mgs_llog.c */
-int class_dentry_readdir(const struct lu_env *env,
-                        struct mgs_device *mgs, cfs_list_t *list);
-
 struct mgs_device {
        struct dt_device                 mgs_dt_dev;
        struct ptlrpc_service           *mgs_service;
        struct dt_device                *mgs_bottom;
        struct obd_export               *mgs_bottom_exp;
        struct dt_object                *mgs_configs_dir;
-       struct dentry                   *mgs_configs_dir_old;
        struct dt_object                *mgs_nidtbl_dir;
        cfs_list_t                       mgs_fs_db_list;
        cfs_spinlock_t                   mgs_lock; /* covers mgs_fs_db_list */
@@ -173,8 +169,6 @@ struct mgs_device {
        cfs_time_t                       mgs_start_time;
        struct obd_device               *mgs_obd;
        struct local_oid_storage        *mgs_los;
-       struct vfsmount                 *mgs_vfsmnt;
-       struct super_block              *mgs_sb;
        cfs_mutex_t                      mgs_mutex;
 };
 
@@ -249,13 +243,13 @@ int lproc_mgs_add_live(struct mgs_device *mgs, struct fs_db *fsdb);
 int lproc_mgs_del_live(struct mgs_device *mgs, struct fs_db *fsdb);
 void lprocfs_mgs_init_vars(struct lprocfs_static_vars *lvars);
 #else
-static inline int lproc_mgs_setup(struct obd_device *dev)
+static inline int lproc_mgs_setup(struct mgs_device *mgs)
 {return 0;}
-static inline int lproc_mgs_cleanup(struct obd_device *obd)
+static inline int lproc_mgs_cleanup(struct mgs_device *mgs)
 {return 0;}
-static inline int lproc_mgs_add_live(struct mgs_device *obd, struct fs_db *fsdb)
+static inline int lproc_mgs_add_live(struct mgs_device *mgs, struct fs_db *fsdb)
 {return 0;}
-static inline int lproc_mgs_del_live(struct mgs_device *obd, struct fs_db *fsdb)
+static inline int lproc_mgs_del_live(struct mgs_device *mgs, struct fs_db *fsdb)
 {return 0;}
 static void lprocfs_mgs_init_vars(struct lprocfs_static_vars *lvars)
 {
@@ -275,13 +269,11 @@ enum {
 void mgs_counter_incr(struct obd_export *exp, int opcode);
 void mgs_stats_counter_init(struct lprocfs_stats *stats);
 
-struct temp_comp
-{
+struct temp_comp {
        struct mgs_target_info  *comp_tmti;
        struct mgs_target_info  *comp_mti;
        struct fs_db            *comp_fsdb;
-       struct mgs_device       *comp_mgs;
-       const struct lu_env     *comp_env;
+       struct obd_device       *comp_obd;
 };
 
 struct mgs_thread_info {
@@ -398,4 +390,8 @@ static inline struct mgs_direntry *mgs_direntry_alloc(int len)
        return de;
 }
 
+/* mgs_llog.c */
+int class_dentry_readdir(const struct lu_env *env, struct mgs_device *mgs,
+                        cfs_list_t *list);
+
 #endif /* _MGS_INTERNAL_H */
index cd5264e..230a5e9 100644 (file)
 #include <lustre_param.h>
 #include <lustre_sec.h>
 #include <lquota.h>
-#include <lustre_log.h>
 
 #include "mgs_internal.h"
 
 /********************** Class functions ********************/
 
-/* Caller must list_del and mgs_dirent_free() each dentry from the list */
 int class_dentry_readdir(const struct lu_env *env,
                         struct mgs_device *mgs, cfs_list_t *list)
 {
@@ -260,13 +258,13 @@ static int mgs_get_fsdb_from_llog(const struct lu_env *env,
                                  struct mgs_device *mgs,
                                  struct fs_db *fsdb)
 {
-        char *logname;
-        struct llog_handle *loghandle;
-        struct lvfs_run_ctxt saved;
-        struct llog_ctxt *ctxt;
-        struct mgs_fsdb_handler_data d = { fsdb, 0 };
-        int rc, rc2;
-        ENTRY;
+       char                            *logname;
+       struct llog_handle              *loghandle;
+       struct llog_ctxt                *ctxt;
+       struct mgs_fsdb_handler_data     d = { fsdb, 0 };
+       int rc;
+
+       ENTRY;
 
        ctxt = llog_get_context(mgs->mgs_obd, LLOG_CONFIG_ORIG_CTXT);
         LASSERT(ctxt != NULL);
@@ -274,27 +272,22 @@ static int mgs_get_fsdb_from_llog(const struct lu_env *env,
        if (rc)
                GOTO(out_put, rc);
         cfs_mutex_lock(&fsdb->fsdb_mutex);
-       push_ctxt(&saved, &mgs->mgs_obd->obd_lvfs_ctxt, NULL);
-       rc = llog_open_create(NULL, ctxt, &loghandle, NULL, logname);
+       rc = llog_open_create(env, ctxt, &loghandle, NULL, logname);
        if (rc)
                GOTO(out_pop, rc);
 
-       rc = llog_init_handle(NULL, loghandle, LLOG_F_IS_PLAIN, NULL);
+       rc = llog_init_handle(env, loghandle, LLOG_F_IS_PLAIN, NULL);
        if (rc)
                GOTO(out_close, rc);
 
        if (llog_get_size(loghandle) <= 1)
                cfs_set_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags);
 
-       rc = llog_process_or_fork(env, loghandle, mgs_fsdb_handler, (void *)&d,
-                                 NULL, false);
+       rc = llog_process(env, loghandle, mgs_fsdb_handler, (void *)&d, NULL);
        CDEBUG(D_INFO, "get_db = %d\n", rc);
 out_close:
-       rc2 = llog_close(NULL, loghandle);
-        if (!rc)
-                rc = rc2;
+       llog_close(env, loghandle);
 out_pop:
-       pop_ctxt(&saved, &mgs->mgs_obd->obd_lvfs_ctxt, NULL);
         cfs_mutex_unlock(&fsdb->fsdb_mutex);
         name_destroy(&logname);
 out_put:
@@ -649,7 +642,7 @@ static int mgs_modify_handler(const struct lu_env *env,
                 /* Header and tail are added back to lrh_len in
                    llog_lvfs_write_rec */
                 rec->lrh_len = cfg_len;
-               rc = llog_write(NULL, llh, rec, NULL, 0, (void *)lcfg,
+               rc = llog_write(env, llh, rec, NULL, 0, (void *)lcfg,
                                rec->lrh_index);
                 if (!rc)
                          mml->mml_modified++;
@@ -658,33 +651,38 @@ static int mgs_modify_handler(const struct lu_env *env,
         RETURN(rc);
 }
 
-/* Modify an existing config log record (for CM_SKIP or CM_EXCLUDE) */
+/**
+ * Modify an existing config log record (for CM_SKIP or CM_EXCLUDE)
+ * Return code:
+ * 0 - modified successfully,
+ * 1 - no modification was done
+ * negative - error
+ */
 static int mgs_modify(const struct lu_env *env, struct mgs_device *mgs,
                      struct fs_db *fsdb, struct mgs_target_info *mti,
                      char *logname, char *devname, char *comment, int flags)
 {
         struct llog_handle *loghandle;
-        struct lvfs_run_ctxt saved;
         struct llog_ctxt *ctxt;
         struct mgs_modify_lookup *mml;
-        int rc, rc2;
+       int rc;
+
         ENTRY;
 
-        CDEBUG(D_MGS, "modify %s/%s/%s fl=%x\n", logname, devname, comment,
-               flags);
+       LASSERT(cfs_mutex_is_locked(&fsdb->fsdb_mutex));
+       CDEBUG(D_MGS, "modify %s/%s/%s fl=%x\n", logname, devname, comment,
+              flags);
 
        ctxt = llog_get_context(mgs->mgs_obd, LLOG_CONFIG_ORIG_CTXT);
         LASSERT(ctxt != NULL);
-       push_ctxt(&saved, &mgs->mgs_obd->obd_lvfs_ctxt, NULL);
-       rc = llog_open(NULL, ctxt, &loghandle, NULL, logname,
-                      LLOG_OPEN_EXISTS);
+       rc = llog_open(env, ctxt, &loghandle, NULL, logname, LLOG_OPEN_EXISTS);
        if (rc < 0) {
                if (rc == -ENOENT)
                        rc = 0;
                GOTO(out_pop, rc);
        }
 
-       rc = llog_init_handle(NULL, loghandle, LLOG_F_IS_PLAIN, NULL);
+       rc = llog_init_handle(env, loghandle, LLOG_F_IS_PLAIN, NULL);
         if (rc)
                 GOTO(out_close, rc);
 
@@ -700,21 +698,18 @@ static int mgs_modify(const struct lu_env *env, struct mgs_device *mgs,
         mml->mml_marker.cm_flags = flags;
         mml->mml_marker.cm_canceltime = flags ? cfs_time_current_sec() : 0;
         mml->mml_modified = 0;
-       rc = llog_process_or_fork(env, loghandle, mgs_modify_handler,
-                                 (void *)mml, NULL, false);
-        if (!rc && !mml->mml_modified)
+       rc = llog_process(env, loghandle, mgs_modify_handler, (void *)mml,
+                         NULL);
+       if (!rc && !mml->mml_modified)
                rc = 1;
         OBD_FREE_PTR(mml);
 
 out_close:
-       rc2 = llog_close(NULL, loghandle);
-        if (!rc)
-                rc = rc2;
+       llog_close(env, loghandle);
 out_pop:
-       pop_ctxt(&saved, &mgs->mgs_obd->obd_lvfs_ctxt, NULL);
        if (rc < 0)
-                CERROR("modify %s/%s failed %d\n",
-                       mti->mti_svname, comment, rc);
+               CERROR("%s: modify %s/%s failed: rc = %d\n",
+                      mgs->mgs_obd->obd_name, mti->mti_svname, comment, rc);
         llog_ctxt_put(ctxt);
         RETURN(rc);
 }
@@ -722,12 +717,10 @@ out_pop:
 /******************** config log recording functions *********************/
 
 static int record_lcfg(const struct lu_env *env, struct llog_handle *llh,
-                         struct lustre_cfg *lcfg)
+                      struct lustre_cfg *lcfg)
 {
-        struct lvfs_run_ctxt   saved;
-        struct llog_rec_hdr    rec;
-        int buflen, rc;
-       struct obd_device *obd = llh->lgh_ctxt->loc_obd;
+       struct llog_rec_hdr      rec;
+       int                      buflen, rc;
 
         if (!lcfg || !llh)
                 return -ENOMEM;
@@ -739,10 +732,8 @@ static int record_lcfg(const struct lu_env *env, struct llog_handle *llh,
         rec.lrh_len = llog_data_len(buflen);
         rec.lrh_type = OBD_CFG_REC;
 
-        push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
         /* idx = -1 means append */
-       rc = llog_write(NULL, llh, &rec, NULL, 0, (void *)lcfg, -1);
-        pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
+       rc = llog_write(env, llh, &rec, NULL, 0, (void *)lcfg, -1);
         if (rc)
                 CERROR("failed %d\n", rc);
         return rc;
@@ -910,83 +901,72 @@ static int record_marker(const struct lu_env *env,
        return rc;
 }
 
-static int record_start_log(const struct lu_env *env,
-                           struct mgs_device *mgs,
-                            struct llog_handle **llh, char *name)
+static int record_start_log(const struct lu_env *env, struct mgs_device *mgs,
+                           struct llog_handle **llh, char *name)
 {
-        static struct obd_uuid cfg_uuid = { .uuid = "config_uuid" };
-        struct lvfs_run_ctxt saved;
-        struct llog_ctxt *ctxt;
-        int rc = 0;
+       static struct obd_uuid   cfg_uuid = { .uuid = "config_uuid" };
+       struct llog_ctxt        *ctxt;
+       int                      rc = 0;
 
-        if (*llh)
-                GOTO(out, rc = -EBUSY);
+       if (*llh)
+               GOTO(out, rc = -EBUSY);
 
        ctxt = llog_get_context(mgs->mgs_obd, LLOG_CONFIG_ORIG_CTXT);
         if (!ctxt)
                 GOTO(out, rc = -ENODEV);
        LASSERT(ctxt->loc_obd == mgs->mgs_obd);
 
-       push_ctxt(&saved, &mgs->mgs_obd->obd_lvfs_ctxt, NULL);
-       rc = llog_open_create(NULL, ctxt, llh, NULL, name);
+       rc = llog_open_create(env, ctxt, llh, NULL, name);
        if (rc)
                GOTO(out_ctxt, rc);
-       rc = llog_init_handle(NULL, *llh, LLOG_F_IS_PLAIN, &cfg_uuid);
-       if (rc) {
-               llog_close(NULL, *llh);
-               *llh = NULL;
-       }
+       rc = llog_init_handle(env, *llh, LLOG_F_IS_PLAIN, &cfg_uuid);
+       if (rc)
+               llog_close(env, *llh);
 out_ctxt:
-       pop_ctxt(&saved, &mgs->mgs_obd->obd_lvfs_ctxt, NULL);
        llog_ctxt_put(ctxt);
 out:
-       if (rc)
-               CERROR("Can't start log %s: %d\n", name, rc);
+       if (rc) {
+               CERROR("%s: can't start log %s: rc = %d\n",
+                      mgs->mgs_obd->obd_name, name, rc);
+               *llh = NULL;
+       }
        RETURN(rc);
 }
 
 static int record_end_log(const struct lu_env *env, struct llog_handle **llh)
 {
-        struct lvfs_run_ctxt saved;
-       struct obd_device *obd = (*llh)->lgh_ctxt->loc_obd;
-        int rc = 0;
-
-        push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
+       int rc;
 
-       rc = llog_close(NULL, *llh);
-        *llh = NULL;
+       rc = llog_close(env, *llh);
+       *llh = NULL;
 
-        pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
-        RETURN(rc);
+       return rc;
 }
 
 static int mgs_log_is_empty(const struct lu_env *env,
                            struct mgs_device *mgs, char *name)
 {
-        struct lvfs_run_ctxt saved;
         struct llog_handle *llh;
         struct llog_ctxt *ctxt;
         int rc = 0;
 
        ctxt = llog_get_context(mgs->mgs_obd, LLOG_CONFIG_ORIG_CTXT);
         LASSERT(ctxt != NULL);
-       push_ctxt(&saved, &mgs->mgs_obd->obd_lvfs_ctxt, NULL);
-       rc = llog_open(NULL, ctxt, &llh, NULL, name, LLOG_OPEN_EXISTS);
+       rc = llog_open(env, ctxt, &llh, NULL, name, LLOG_OPEN_EXISTS);
        if (rc < 0) {
                if (rc == -ENOENT)
                        rc = 0;
                GOTO(out_ctxt, rc);
        }
 
-       llog_init_handle(NULL, llh, LLOG_F_IS_PLAIN, NULL);
+       llog_init_handle(env, llh, LLOG_F_IS_PLAIN, NULL);
        if (rc)
                GOTO(out_close, rc);
        rc = llog_get_size(llh);
 
 out_close:
-       llog_close(NULL, llh);
+       llog_close(env, llh);
 out_ctxt:
-       pop_ctxt(&saved, &mgs->mgs_obd->obd_lvfs_ctxt, NULL);
        llog_ctxt_put(ctxt);
        /* header is record 1 */
        return (rc <= 1);
@@ -1120,6 +1100,7 @@ static int mgs_steal_llog_handler(const struct lu_env *env,
                                  struct llog_rec_hdr *rec, void *data)
 {
        struct mgs_device *mgs;
+       struct obd_device *obd;
         struct mgs_target_info *mti, *tmti;
         struct fs_db *fsdb;
         int cfg_len = rec->lrh_len;
@@ -1139,7 +1120,9 @@ static int mgs_steal_llog_handler(const struct lu_env *env,
         mti = ((struct temp_comp*)data)->comp_mti;
         tmti = ((struct temp_comp*)data)->comp_tmti;
         fsdb = ((struct temp_comp*)data)->comp_fsdb;
-       mgs = ((struct temp_comp*)data)->comp_mgs;
+       obd = ((struct temp_comp *)data)->comp_obd;
+       mgs = lu2mgs_dev(obd->obd_lu_dev);
+       LASSERT(mgs);
 
         if (rec->lrh_type != OBD_CFG_REC) {
                 CERROR("unhandled lrh_type: %#x\n", rec->lrh_type);
@@ -1281,7 +1264,6 @@ static int mgs_steal_llog_for_mdt_from_client(const struct lu_env *env,
                                               struct temp_comp* comp)
 {
         struct llog_handle *loghandle;
-        struct lvfs_run_ctxt saved;
         struct mgs_target_info *tmti;
         struct llog_ctxt *ctxt;
        int rc;
@@ -1296,11 +1278,9 @@ static int mgs_steal_llog_for_mdt_from_client(const struct lu_env *env,
                GOTO(out_ctxt, rc = -ENOMEM);
 
        comp->comp_tmti = tmti;
-       comp->comp_mgs = mgs;
-
-       push_ctxt(&saved, &mgs->mgs_obd->obd_lvfs_ctxt, NULL);
+       comp->comp_obd = mgs->mgs_obd;
 
-       rc = llog_open(NULL, ctxt, &loghandle, NULL, client_name,
+       rc = llog_open(env, ctxt, &loghandle, NULL, client_name,
                       LLOG_OPEN_EXISTS);
        if (rc < 0) {
                if (rc == -ENOENT)
@@ -1308,7 +1288,7 @@ static int mgs_steal_llog_for_mdt_from_client(const struct lu_env *env,
                GOTO(out_pop, rc);
        }
 
-       rc = llog_init_handle(NULL, loghandle, LLOG_F_IS_PLAIN, NULL);
+       rc = llog_init_handle(env, loghandle, LLOG_F_IS_PLAIN, NULL);
        if (rc)
                GOTO(out_close, rc);
 
@@ -1316,9 +1296,8 @@ static int mgs_steal_llog_for_mdt_from_client(const struct lu_env *env,
                                  (void *)comp, NULL, false);
        CDEBUG(D_MGS, "steal llog re = %d\n", rc);
 out_close:
-       llog_close(NULL, loghandle);
+       llog_close(env, loghandle);
 out_pop:
-       pop_ctxt(&saved, &mgs->mgs_obd->obd_lvfs_ctxt, NULL);
        OBD_FREE_PTR(tmti);
 out_ctxt:
        llog_ctxt_put(ctxt);
@@ -2633,7 +2612,6 @@ int mgs_get_fsdb_srpc_from_llog(const struct lu_env *env,
                                 struct fs_db *fsdb)
 {
         struct llog_handle        *llh = NULL;
-        struct lvfs_run_ctxt       saved;
         struct llog_ctxt          *ctxt;
         char                      *logname;
         struct mgs_srpc_read_data  msrd;
@@ -2651,17 +2629,15 @@ int mgs_get_fsdb_srpc_from_llog(const struct lu_env *env,
        if (mgs_log_is_empty(env, mgs, logname))
                 GOTO(out, rc = 0);
 
-       push_ctxt(&saved, &mgs->mgs_obd->obd_lvfs_ctxt, NULL);
-
-       rc = llog_open(NULL, ctxt, &llh, NULL, logname,
+       rc = llog_open(env, ctxt, &llh, NULL, logname,
                       LLOG_OPEN_EXISTS);
        if (rc < 0) {
                if (rc == -ENOENT)
                        rc = 0;
-               GOTO(out_pop, rc);
+               GOTO(out, rc);
        }
 
-       rc = llog_init_handle(NULL, llh, LLOG_F_IS_PLAIN, NULL);
+       rc = llog_init_handle(env, llh, LLOG_F_IS_PLAIN, NULL);
         if (rc)
                 GOTO(out_close, rc);
 
@@ -2671,13 +2647,11 @@ int mgs_get_fsdb_srpc_from_llog(const struct lu_env *env,
         msrd.msrd_fsdb = fsdb;
         msrd.msrd_skip = 0;
 
-       rc = llog_process_or_fork(env, llh, mgs_srpc_read_handler,
-                                 (void *)&msrd, NULL, false);
+       rc = llog_process(env, llh, mgs_srpc_read_handler, (void *)&msrd,
+                         NULL);
 
 out_close:
-       llog_close(NULL, llh);
-out_pop:
-       pop_ctxt(&saved, &mgs->mgs_obd->obd_lvfs_ctxt, NULL);
+       llog_close(env, llh);
 out:
         llog_ctxt_put(ctxt);
         name_destroy(&logname);
@@ -3099,29 +3073,25 @@ out_up:
 
 int mgs_erase_log(const struct lu_env *env, struct mgs_device *mgs, char *name)
 {
-       struct lvfs_run_ctxt     saved;
        struct llog_ctxt        *ctxt;
        int                      rc = 0;
-       struct obd_device *obd = mgs->mgs_obd;
 
-       ctxt = llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT);
+       ctxt = llog_get_context(mgs->mgs_obd, LLOG_CONFIG_ORIG_CTXT);
        if (ctxt == NULL) {
                CERROR("%s: MGS config context doesn't exist\n",
-                      obd->obd_name);
+                      mgs->mgs_obd->obd_name);
                rc = -ENODEV;
        } else {
-               push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
-               rc = llog_erase(NULL, ctxt, NULL, name);
+               rc = llog_erase(env, ctxt, NULL, name);
                /* llog may not exist */
                if (rc == -ENOENT)
                        rc = 0;
-               pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
                llog_ctxt_put(ctxt);
        }
 
        if (rc)
-               CERROR("%s: failed to clear log %s: %d\n", obd->obd_name,
-                      name, rc);
+               CERROR("%s: failed to clear log %s: %d\n",
+                      mgs->mgs_obd->obd_name, name, rc);
 
        return rc;
 }
index 2465b87..6141a00 100644 (file)
@@ -274,7 +274,8 @@ out_put:
 #define MGS_NIDTBL_VERSION_INIT 2
 
 static int nidtbl_read_version(const struct lu_env *env,
-                              struct mgs_device *mgs, struct mgs_nidtbl *tbl)
+                              struct mgs_device *mgs, struct mgs_nidtbl *tbl,
+                              u64 *version)
 {
        struct dt_object *fsdb;
        struct lu_fid     fid;
@@ -292,10 +293,12 @@ static int nidtbl_read_version(const struct lu_env *env,
        LASSERT(mgs->mgs_nidtbl_dir);
        rc = dt_lookup_dir(env, mgs->mgs_nidtbl_dir, tbl->mn_fsdb->fsdb_name,
                           &fid);
-       if (rc == -ENOENT)
-               RETURN(MGS_NIDTBL_VERSION_INIT);
-       else if (rc < 0)
+       if (rc == -ENOENT) {
+               *version = MGS_NIDTBL_VERSION_INIT;
+               RETURN(0);
+       } else if (rc < 0) {
                RETURN(rc);
+       }
 
        fsdb = dt_locate_at(env, mgs->mgs_bottom, &fid,
                            &mgs->mgs_dt_dev.dd_lu_dev);
@@ -303,13 +306,15 @@ static int nidtbl_read_version(const struct lu_env *env,
                RETURN(PTR_ERR(fsdb));
 
        rc = dt_read(env, fsdb, &buf, &off);
-       if (rc == buf.lb_len)
-               rc = le64_to_cpu(tmpver);
-       else if (rc == 0)
-               rc = MGS_NIDTBL_VERSION_INIT;
-       else
+       if (rc == buf.lb_len) {
+               *version = le64_to_cpu(tmpver);
+               rc = 0;
+       } else if (rc == 0) {
+               *version = MGS_NIDTBL_VERSION_INIT;
+       } else {
                CERROR("%s: read version file %s error %d\n",
                       mgs->mgs_obd->obd_name, tbl->mn_fsdb->fsdb_name, rc);
+       }
        lu_object_put(env, &fsdb->do_lu);
        RETURN(rc);
 }
@@ -387,17 +392,23 @@ static void mgs_nidtbl_fini_fs(struct fs_db *fsdb)
 static int mgs_nidtbl_init_fs(const struct lu_env *env, struct fs_db *fsdb)
 {
         struct mgs_nidtbl *tbl = &fsdb->fsdb_nidtbl;
+       int rc;
 
         CFS_INIT_LIST_HEAD(&tbl->mn_targets);
         cfs_mutex_init(&tbl->mn_lock);
         tbl->mn_nr_targets = 0;
         tbl->mn_fsdb = fsdb;
         cfs_mutex_lock(&tbl->mn_lock);
-       tbl->mn_version = nidtbl_read_version(env, fsdb->fsdb_mgs, tbl);
+       rc = nidtbl_read_version(env, fsdb->fsdb_mgs, tbl, &tbl->mn_version);
         cfs_mutex_unlock(&tbl->mn_lock);
-        CDEBUG(D_MGS, "IR: current version is %llu\n", tbl->mn_version);
+       if (rc < 0)
+               CERROR("%s: IR: failed to read current version, rc = %d\n",
+                      fsdb->fsdb_mgs->mgs_obd->obd_name, rc);
+       else
+               CDEBUG(D_MGS, "IR: current version is %llu\n",
+                      tbl->mn_version);
 
-        return 0;
+       return rc;
 }
 
 /* --------- Imperative Recovery relies on nidtbl stuff ------- */
@@ -473,7 +484,6 @@ int mgs_ir_init_fs(const struct lu_env *env, struct mgs_device *mgs,
         CFS_INIT_LIST_HEAD(&fsdb->fsdb_clients);
 
         /* start notify thread */
-       fsdb->fsdb_obd = mgs->mgs_obd;
        fsdb->fsdb_mgs = mgs;
         cfs_atomic_set(&fsdb->fsdb_notify_phase, 0);
         cfs_waitq_init(&fsdb->fsdb_notify_waitq);
@@ -680,15 +690,13 @@ int mgs_get_ir_logs(struct ptlrpc_request *req)
         ptlrpc_free_bulk(desc);
 
 out:
-        if (pages) {
-                for (i = 0; i < nrpages; i++) {
-                        if (pages[i] == NULL)
-                                break;
-                        cfs_free_page(pages[i]);
-                }
-                OBD_FREE(pages, sizeof(*pages) * nrpages);
-        }
-        return rc;
+       for (i = 0; i < nrpages; i++) {
+               if (pages[i] == NULL)
+                       break;
+               cfs_free_page(pages[i]);
+       }
+       OBD_FREE(pages, sizeof(*pages) * nrpages);
+       return rc;
 }
 
 static int lprocfs_ir_set_state(struct fs_db *fsdb, const char *buf)
index 1e41e31..56fab6a 100644 (file)
@@ -158,7 +158,7 @@ static int llog_test_2(const struct lu_env *env, struct obd_device *obd,
                GOTO(out_put, rc);
        }
 
-       llog_init_handle(env, *llh, LLOG_F_IS_PLAIN, &uuid);
+       rc = llog_init_handle(env, *llh, LLOG_F_IS_PLAIN, &uuid);
        if (rc) {
                CERROR("2a: can't init llog handle: %d\n", rc);
                GOTO(out_close_llh, rc);
@@ -343,7 +343,7 @@ static int llog_test_4(const struct lu_env *env, struct obd_device *obd)
                CERROR("4a: llog_create with name %s failed: %d\n", name, rc);
                GOTO(ctxt_release, rc);
         }
-       llog_init_handle(env, cath, LLOG_F_IS_CAT, &uuid);
+       rc = llog_init_handle(env, cath, LLOG_F_IS_CAT, &uuid);
        if (rc) {
                CERROR("4a: can't init llog handle: %d\n", rc);
                GOTO(out, rc);
@@ -352,11 +352,6 @@ static int llog_test_4(const struct lu_env *env, struct obd_device *obd)
        num_recs++;
        cat_logid = cath->lgh_id;
 
-       /* XXX: there is known issue with tests 4b, MGS is not able to add
-        * anonymous plain llog, si we exit now to allow following tests run.
-        * It is fixed in upcoming llog over OSD code */
-       GOTO(out, rc);
-
        CWARN("4b: write 1 record into the catalog\n");
        rc = llog_cat_add(env, cath, &lmr.lmr_hdr, &cookie, NULL);
        if (rc != 1) {
@@ -438,15 +433,18 @@ static int cat_print_cb(const struct lu_env *env, struct llog_handle *llh,
                        struct llog_rec_hdr *rec, void *data)
 {
        struct llog_logid_rec   *lir = (struct llog_logid_rec *)rec;
+       struct lu_fid            fid;
 
        if (rec->lrh_type != LLOG_LOGID_MAGIC) {
                CERROR("invalid record in catalog\n");
                RETURN(-EINVAL);
        }
 
-       CWARN("seeing record at index %d - "LPX64":%x in log "LPX64"\n",
-             rec->lrh_index, lir->lid_id.lgl_oid,
-             lir->lid_id.lgl_ogen, llh->lgh_id.lgl_oid);
+       logid_to_fid(&lir->lid_id, &fid);
+
+       CWARN("seeing record at index %d - "DFID" in log "DFID"\n",
+             rec->lrh_index, PFID(&fid),
+             PFID(lu_object_fid(&llh->lgh_obj->do_lu)));
 
        cat_counter++;
 
@@ -458,13 +456,17 @@ static int plain_counter;
 static int plain_print_cb(const struct lu_env *env, struct llog_handle *llh,
                          struct llog_rec_hdr *rec, void *data)
 {
+       struct lu_fid fid;
+
        if (!(llh->lgh_hdr->llh_flags & LLOG_F_IS_PLAIN)) {
                CERROR("log is not plain\n");
                RETURN(-EINVAL);
        }
 
-       CDEBUG(D_INFO, "seeing record at index %d in log "LPX64"\n",
-             rec->lrh_index, llh->lgh_id.lgl_oid);
+       logid_to_fid(&llh->lgh_id, &fid);
+
+       CDEBUG(D_INFO, "seeing record at index %d in log "DFID"\n",
+              rec->lrh_index, PFID(&fid));
 
        plain_counter++;
 
@@ -518,15 +520,12 @@ static int llog_test_5(const struct lu_env *env, struct obd_device *obd)
                GOTO(out_put, rc);
        }
 
-       llog_init_handle(env, llh, LLOG_F_IS_CAT, &uuid);
+       rc = llog_init_handle(env, llh, LLOG_F_IS_CAT, &uuid);
        if (rc) {
                CERROR("5a: can't init llog handle: %d\n", rc);
                GOTO(out, rc);
        }
 
-       /* XXX: depends on tests 4 which is not working yet */
-       GOTO(out, rc);
-
        CWARN("5b: print the catalog entries.. we expect 2\n");
        cat_counter = 0;
        rc = llog_process(env, llh, cat_print_cb, "test 5", NULL);
@@ -634,7 +633,7 @@ static int llog_test_6(const struct lu_env *env, struct obd_device *obd,
        rc = obd_connect(NULL, &exp, mgc_obd, &uuid,
                         NULL /* obd_connect_data */, NULL);
        if (rc != -EALREADY) {
-               CERROR("6a: connect on connected MDC (%s) failed to return"
+               CERROR("6a: connect on connected MGC (%s) failed to return"
                       " -EALREADY", mgc_obd->obd_name);
                if (rc == 0)
                        obd_disconnect(exp);
@@ -731,7 +730,7 @@ static int llog_test_7_sub(const struct lu_env *env, struct llog_ctxt *ctxt)
 
        ENTRY;
 
-       rc = llog_open_create(env, ctxt, &llh, NULL, "llt_test7");
+       rc = llog_open_create(env, ctxt, &llh, NULL, NULL);
        if (rc) {
                CERROR("7_sub: create log failed\n");
                RETURN(rc);
@@ -905,7 +904,6 @@ out:
 static int llog_run_tests(const struct lu_env *env, struct obd_device *obd)
 {
        struct llog_handle      *llh = NULL;
-       struct lvfs_run_ctxt     saved;
        struct llog_ctxt        *ctxt;
        int                      rc, err;
        char                     name[10];
@@ -915,7 +913,6 @@ static int llog_run_tests(const struct lu_env *env, struct obd_device *obd)
        LASSERT(ctxt);
 
        sprintf(name, "%x", llog_test_rand);
-       push_ctxt(&saved, &ctxt->loc_exp->exp_obd->obd_lvfs_ctxt, NULL);
 
        rc = llog_test_1(env, obd, name);
        if (rc)
@@ -953,7 +950,6 @@ cleanup:
        if (rc == 0)
                rc = err;
 cleanup_ctxt:
-       pop_ctxt(&saved, &ctxt->loc_exp->exp_obd->obd_lvfs_ctxt, NULL);
        llog_ctxt_put(ctxt);
        return rc;
 }
@@ -970,19 +966,32 @@ static void lprocfs_llog_test_init_vars(struct lprocfs_static_vars *lvars)
 
 static int llog_test_cleanup(struct obd_device *obd)
 {
-       int rc;
+       struct obd_device       *tgt;
+       struct lu_env            env;
+       int                      rc;
+
+       ENTRY;
+
+       rc = lu_env_init(&env, LCT_LOCAL | LCT_MG_THREAD);
+       if (rc)
+               RETURN(rc);
 
-       rc = llog_cleanup(NULL, llog_get_context(obd, LLOG_TEST_ORIG_CTXT));
+       tgt = obd->obd_lvfs_ctxt.dt->dd_lu_dev.ld_obd;
+       rc = llog_cleanup(&env, llog_get_context(tgt, LLOG_TEST_ORIG_CTXT));
        if (rc)
                CERROR("failed to llog_test_llog_finish: %d\n", rc);
-       return rc;
+       lu_env_fini(&env);
+       RETURN(rc);
 }
 
 static int llog_test_setup(struct obd_device *obd, struct lustre_cfg *lcfg)
 {
-        struct obd_device *tgt;
-       struct lu_env env;
-        int rc;
+       struct obd_device       *tgt;
+       struct llog_ctxt        *ctxt;
+       struct dt_object        *o;
+       struct lu_env            env;
+       struct lu_context        test_session;
+       int                      rc;
 
         ENTRY;
 
@@ -1008,19 +1017,43 @@ static int llog_test_setup(struct obd_device *obd, struct lustre_cfg *lcfg)
        if (rc)
                RETURN(rc);
 
+       rc = lu_context_init(&test_session, LCT_SESSION);
+       if (rc)
+               GOTO(cleanup_env, rc);
+       test_session.lc_thread = (struct ptlrpc_thread *)cfs_current();
+       lu_context_enter(&test_session);
+       env.le_ses = &test_session;
+
        CWARN("Setup llog-test device over %s device\n",
              lustre_cfg_string(lcfg, 1));
 
-       rc = llog_setup(&env, obd, &obd->obd_olg, LLOG_TEST_ORIG_CTXT, tgt,
-                       &llog_lvfs_ops);
+       OBD_SET_CTXT_MAGIC(&obd->obd_lvfs_ctxt);
+       obd->obd_lvfs_ctxt.dt = lu2dt_dev(tgt->obd_lu_dev);
+
+       rc = llog_setup(&env, tgt, &tgt->obd_olg, LLOG_TEST_ORIG_CTXT, tgt,
+                       &llog_osd_ops);
        if (rc)
-               GOTO(cleanup_env, rc);
+               GOTO(cleanup_session, rc);
+
+       /* use MGS llog dir for tests */
+       ctxt = llog_get_context(tgt, LLOG_CONFIG_ORIG_CTXT);
+       LASSERT(ctxt);
+       o = ctxt->loc_dir;
+       llog_ctxt_put(ctxt);
+
+       ctxt = llog_get_context(tgt, LLOG_TEST_ORIG_CTXT);
+       LASSERT(ctxt);
+       ctxt->loc_dir = o;
+       llog_ctxt_put(ctxt);
 
        llog_test_rand = cfs_rand();
 
-       rc = llog_run_tests(&env, obd);
+       rc = llog_run_tests(&env, tgt);
        if (rc)
                llog_test_cleanup(obd);
+cleanup_session:
+       lu_context_exit(&test_session);
+       lu_context_fini(&test_session);
 cleanup_env:
        lu_env_fini(&env);
        RETURN(rc);
index 9852dfd..1922804 100644 (file)
@@ -734,12 +734,22 @@ int local_oid_storage_init(const struct lu_env *env, struct dt_device *dev,
                rc = dt_record_write(env, o, &dti->dti_lb, &dti->dti_off, th);
                if (rc)
                        GOTO(out_trans, rc);
-               rc = dt_insert(env, root,
-                              (const struct dt_rec *)lu_object_fid(&o->do_lu),
-                              (const struct dt_key *)dti->dti_buf, th,
-                              BYPASS_CAPA, 1);
-               if (rc)
-                       GOTO(out_trans, rc);
+#if LUSTRE_VERSION_CODE >= OBD_OCD_VERSION(2, 3, 90, 0)
+#error "fix this before release"
+#endif
+               /*
+                * there is one technical debt left in Orion:
+                * proper hanlding of named vs no-name objects.
+                * Llog objects have name always as they are placed in O/d/...
+                */
+               if (fid_seq(lu_object_fid(&o->do_lu)) != FID_SEQ_LLOG) {
+                       rc = dt_insert(env, root,
+                                      (const struct dt_rec *)first_fid,
+                                      (const struct dt_key *)dti->dti_buf,
+                                      th, BYPASS_CAPA, 1);
+                       if (rc)
+                               GOTO(out_trans, rc);
+               }
 out_trans:
                dt_trans_stop(env, dev, th);
        } else {
index b848d9f..3728a35 100644 (file)
@@ -1521,41 +1521,38 @@ out:
         RETURN(rc);
 }
 
-int class_config_parse_llog(struct llog_ctxt *ctxt, char *name,
-                            struct config_llog_instance *cfg)
+int class_config_parse_llog(const struct lu_env *env, struct llog_ctxt *ctxt,
+                           char *name, struct config_llog_instance *cfg)
 {
-        struct llog_process_cat_data cd = {0, 0};
-        struct llog_handle *llh;
-        int rc, rc2;
-        ENTRY;
+       struct llog_process_cat_data     cd = {0, 0};
+       struct llog_handle              *llh;
+       int                              rc;
 
-        CDEBUG(D_INFO, "looking up llog %s\n", name);
-       rc = llog_open(NULL, ctxt, &llh, NULL, name, LLOG_OPEN_EXISTS);
-        if (rc)
-                RETURN(rc);
+       ENTRY;
 
-       rc = llog_init_handle(NULL, llh, LLOG_F_IS_PLAIN, NULL);
-        if (rc)
-                GOTO(parse_out, rc);
+       CDEBUG(D_INFO, "looking up llog %s\n", name);
+       rc = llog_open(env, ctxt, &llh, NULL, name, LLOG_OPEN_EXISTS);
+       if (rc)
+               RETURN(rc);
 
-        /* continue processing from where we last stopped to end-of-log */
-        if (cfg)
-                cd.lpcd_first_idx = cfg->cfg_last_idx;
-        cd.lpcd_last_idx = 0;
+       rc = llog_init_handle(env, llh, LLOG_F_IS_PLAIN, NULL);
+       if (rc)
+               GOTO(parse_out, rc);
 
-       rc = llog_process(NULL, llh, class_config_llog_handler, cfg, &cd);
+       /* continue processing from where we last stopped to end-of-log */
+       if (cfg)
+               cd.lpcd_first_idx = cfg->cfg_last_idx;
+       cd.lpcd_last_idx = 0;
 
-        CDEBUG(D_CONFIG, "Processed log %s gen %d-%d (rc=%d)\n", name,
-               cd.lpcd_first_idx + 1, cd.lpcd_last_idx, rc);
+       rc = llog_process(env, llh, class_config_llog_handler, cfg, &cd);
 
-        if (cfg)
-                cfg->cfg_last_idx = cd.lpcd_last_idx;
+       CDEBUG(D_CONFIG, "Processed log %s gen %d-%d (rc=%d)\n", name,
+              cd.lpcd_first_idx + 1, cd.lpcd_last_idx, rc);
+       if (cfg)
+               cfg->cfg_last_idx = cd.lpcd_last_idx;
 
 parse_out:
-       rc2 = llog_close(NULL, llh);
-        if (rc == 0)
-                rc = rc2;
-
+       llog_close(env, llh);
         RETURN(rc);
 }
 EXPORT_SYMBOL(class_config_parse_llog);
@@ -1636,32 +1633,30 @@ int class_config_dump_handler(const struct lu_env *env,
        RETURN(rc);
 }
 
-int class_config_dump_llog(struct llog_ctxt *ctxt, char *name,
-                           struct config_llog_instance *cfg)
+int class_config_dump_llog(const struct lu_env *env, struct llog_ctxt *ctxt,
+                          char *name, struct config_llog_instance *cfg)
 {
-        struct llog_handle *llh;
-        int rc, rc2;
-        ENTRY;
+       struct llog_handle      *llh;
+       int                      rc;
+
+       ENTRY;
 
-        LCONSOLE_INFO("Dumping config log %s\n", name);
+       LCONSOLE_INFO("Dumping config log %s\n", name);
 
-       rc = llog_open(NULL, ctxt, &llh, NULL, name, LLOG_OPEN_EXISTS);
+       rc = llog_open(env, ctxt, &llh, NULL, name, LLOG_OPEN_EXISTS);
        if (rc)
                RETURN(rc);
 
-       rc = llog_init_handle(NULL, llh, LLOG_F_IS_PLAIN, NULL);
+       rc = llog_init_handle(env, llh, LLOG_F_IS_PLAIN, NULL);
        if (rc)
                GOTO(parse_out, rc);
 
-       rc = llog_process(NULL, llh, class_config_dump_handler, cfg, NULL);
+       rc = llog_process(env, llh, class_config_dump_handler, cfg, NULL);
 parse_out:
-       rc2 = llog_close(NULL, llh);
-        if (rc == 0)
-                rc = rc2;
-
-        LCONSOLE_INFO("End config log %s\n", name);
-        RETURN(rc);
+       llog_close(env, llh);
 
+       LCONSOLE_INFO("End config log %s\n", name);
+       RETURN(rc);
 }
 EXPORT_SYMBOL(class_config_dump_llog);
 
index 9a51c0c..3264023 100644 (file)
@@ -4507,11 +4507,9 @@ static int osd_device_init0(const struct lu_env *env,
        strncpy(o->od_svname, lustre_cfg_string(cfg, 4),
                        sizeof(o->od_svname) - 1);
 
-       if (strstr(o->od_svname, "-OST")) {
-               rc = osd_compat_init(o);
-               if (rc != 0)
-                       GOTO(out_mnt, rc);
-       }
+       rc = osd_compat_init(o);
+       if (rc != 0)
+               GOTO(out_scrub, rc);
 
        rc = lu_site_init(&o->od_site, l);
        if (rc)
@@ -4519,20 +4517,24 @@ static int osd_device_init0(const struct lu_env *env,
 
        rc = lu_site_init_finish(&o->od_site);
        if (rc)
-               GOTO(out_compat, rc);
+               GOTO(out_site, rc);
 
        rc = osd_procfs_init(o, o->od_svname);
        if (rc != 0) {
                CERROR("%s: can't initialize procfs: rc = %d\n",
                       o->od_svname, rc);
-               GOTO(out_compat, rc);
+               GOTO(out_site, rc);
        }
 
        LASSERT(l->ld_site->ls_linkage.next && l->ld_site->ls_linkage.prev);
 
        RETURN(0);
+out_site:
+       lu_site_fini(&o->od_site);
 out_compat:
        osd_compat_fini(o);
+out_scrub:
+       osd_scrub_cleanup(env, o);
 out_mnt:
        osd_oi_fini(info, o);
        osd_shutdown(env, o);