Whamcloud - gitweb
LU-8147 osd-zfs: fix osd_mount error path 09/20309/3
authorYang Sheng <yang.sheng@intel.com>
Wed, 18 May 2016 15:52:29 +0000 (23:52 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Thu, 2 Jun 2016 04:38:41 +0000 (04:38 +0000)
The osd_oi_fini will grab osl_seq_list_lock for cleanup.
But this lock is not initilized if osd_mount return and
failed before osd_oi_init.

Signed-off-by: Yang Sheng <yang.sheng@intel.com>
Change-Id: I8f76a87e22d131e6ab9034d8ecc42b47e301ff25
Reviewed-on: http://review.whamcloud.com/20309
Tested-by: Jenkins
Reviewed-by: Mike Pershin <mike.pershin@intel.com>
Reviewed-by: John L. Hammond <john.hammond@intel.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/osd-zfs/osd_handler.c
lustre/osd-zfs/osd_oi.c

index ff4bc58..334310d 100644 (file)
@@ -1089,13 +1089,19 @@ static struct lu_device *osd_device_alloc(const struct lu_env *env,
                                          struct lu_device_type *type,
                                          struct lustre_cfg *cfg)
 {
-       struct osd_device *dev;
-       int                rc;
+       struct osd_device       *dev;
+       struct osd_seq_list     *osl;
+       int                     rc;
 
        OBD_ALLOC_PTR(dev);
        if (dev == NULL)
                return ERR_PTR(-ENOMEM);
 
+       osl = &dev->od_seq_list;
+       INIT_LIST_HEAD(&osl->osl_seq_list);
+       rwlock_init(&osl->osl_seq_list_lock);
+       sema_init(&osl->osl_seq_init_sem, 1);
+
        rc = dt_device_init(&dev->od_dt_dev, type);
        if (rc == 0) {
                rc = osd_device_init0(env, dev, cfg);
index 6cb2c80..0802bf4 100644 (file)
@@ -619,15 +619,6 @@ osd_oi_probe(const struct lu_env *env, struct osd_device *o, int *count)
        RETURN(0);
 }
 
-static void osd_ost_seq_init(const struct lu_env *env, struct osd_device *osd)
-{
-       struct osd_seq_list *osl = &osd->od_seq_list;
-
-       INIT_LIST_HEAD(&osl->osl_seq_list);
-       rwlock_init(&osl->osl_seq_list_lock);
-       sema_init(&osl->osl_seq_init_sem, 1);
-}
-
 static void osd_ost_seq_fini(const struct lu_env *env, struct osd_device *osd)
 {
        struct osd_seq_list     *osl = &osd->od_seq_list;
@@ -662,7 +653,6 @@ osd_oi_init_compat(const struct lu_env *env, struct osd_device *o)
 
        o->od_O_id = sdb;
 
-       osd_ost_seq_init(env, o);
        /* Create on-disk indexes to maintain per-UID/GID inode usage.
         * Those new indexes are created in the top-level ZAP outside the
         * namespace in order not to confuse ZPL which might interpret those