Whamcloud - gitweb
LU-2766 llite: don't ignore layout for group lock request 28/6828/12
authorJinshan Xiong <jinshan.xiong@intel.com>
Wed, 8 Jun 2016 03:59:32 +0000 (20:59 -0700)
committerOleg Drokin <oleg.drokin@intel.com>
Thu, 16 Jun 2016 22:16:47 +0000 (22:16 +0000)
ignore_layout can be set for operations that layout won't be changed,
typically page operations. Ignoring layout change in group lock
request will confuse layout change code at LOV layer and hit
assertion.

Signed-off-by: Henri Doreau <henri.doreau@cea.fr>
Signed-off-by: Jinshan Xiong <jinshan.xiong@intel.com>
Signed-off-by: Bobi Jam <bobijam.xu@intel.com>
Change-Id: I0f628e81d7f61a9b00ab2941ad3bcde4b32ecfe2
Reviewed-on: http://review.whamcloud.com/6828
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: John L. Hammond <john.hammond@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/llite/lcommon_misc.c
lustre/llite/vvp_io.c
lustre/lov/lov_lock.c
lustre/lov/lov_object.c
lustre/osc/osc_cache.c

index 47178ef..27d9610 100644 (file)
@@ -37,6 +37,7 @@
  * future).
  *
  */
  * future).
  *
  */
+#define DEBUG_SUBSYSTEM S_LLITE
 #include <obd_class.h>
 #include <obd_support.h>
 #include <obd.h>
 #include <obd_class.h>
 #include <obd_support.h>
 #include <obd.h>
@@ -138,7 +139,6 @@ int cl_get_grouplock(struct cl_object *obj, unsigned long gid, int nonblock,
 
        io = vvp_env_thread_io(env);
         io->ci_obj = obj;
 
        io = vvp_env_thread_io(env);
         io->ci_obj = obj;
-       io->ci_ignore_layout = 1;
 
        rc = cl_io_init(env, io, CIT_MISC, io->ci_obj);
        if (rc != 0) {
 
        rc = cl_io_init(env, io, CIT_MISC, io->ci_obj);
        if (rc != 0) {
index 8a81b83..871d3a7 100644 (file)
@@ -1400,12 +1400,6 @@ int vvp_io_init(const struct lu_env *env, struct cl_object *obj,
                        io->ci_lockreq = CILR_MANDATORY;
        }
 
                        io->ci_lockreq = CILR_MANDATORY;
        }
 
-       /* ignore layout change for generic CIT_MISC but not for glimpse.
-        * io context for glimpse must set ci_verify_layout to true,
-        * see cl_glimpse_size0() for details. */
-       if (io->ci_type == CIT_MISC && !io->ci_verify_layout)
-               io->ci_ignore_layout = 1;
-
        /* Enqueue layout lock and get layout version. We need to do this
         * even for operations requiring to open file, such as read and write,
         * because it might not grant layout lock in IT_OPEN. */
        /* Enqueue layout lock and get layout version. We need to do this
         * even for operations requiring to open file, such as read and write,
         * because it might not grant layout lock in IT_OPEN. */
index abc0216..60af105 100644 (file)
@@ -141,6 +141,11 @@ static struct lov_lock *lov_lock_sub_init(const struct lu_env *env,
 
        ENTRY;
 
 
        ENTRY;
 
+       CDEBUG(D_INODE, "%p: lock/io FID "DFID"/"DFID", lock/io clobj %p/%p\n",
+              loo, PFID(lu_object_fid(lov2lu(loo))),
+              PFID(lu_object_fid(&obj->co_lu)),
+              lov2cl(loo), obj);
+
        file_start = cl_offset(lov2cl(loo), lock->cll_descr.cld_start);
        file_end   = cl_offset(lov2cl(loo), lock->cll_descr.cld_end + 1) - 1;
 
        file_start = cl_offset(lov2cl(loo), lock->cll_descr.cld_start);
        file_end   = cl_offset(lov2cl(loo), lock->cll_descr.cld_end + 1) - 1;
 
index 4971163..8df5f5f 100644 (file)
@@ -654,12 +654,16 @@ static enum lov_layout_type lov_type(struct lov_stripe_md *lsm)
 
 static inline void lov_conf_freeze(struct lov_object *lov)
 {
 
 static inline void lov_conf_freeze(struct lov_object *lov)
 {
+       CDEBUG(D_INODE, "To take share lov(%p) owner %p/%p\n",
+               lov, lov->lo_owner, current);
        if (lov->lo_owner != current)
                down_read(&lov->lo_type_guard);
 }
 
 static inline void lov_conf_thaw(struct lov_object *lov)
 {
        if (lov->lo_owner != current)
                down_read(&lov->lo_type_guard);
 }
 
 static inline void lov_conf_thaw(struct lov_object *lov)
 {
+       CDEBUG(D_INODE, "To release share lov(%p) owner %p/%p\n",
+               lov, lov->lo_owner, current);
        if (lov->lo_owner != current)
                up_read(&lov->lo_type_guard);
 }
        if (lov->lo_owner != current)
                up_read(&lov->lo_type_guard);
 }
@@ -702,10 +706,14 @@ static void lov_conf_lock(struct lov_object *lov)
        down_write(&lov->lo_type_guard);
        LASSERT(lov->lo_owner == NULL);
        lov->lo_owner = current;
        down_write(&lov->lo_type_guard);
        LASSERT(lov->lo_owner == NULL);
        lov->lo_owner = current;
+       CDEBUG(D_INODE, "Took exclusive lov(%p) owner %p\n",
+               lov, lov->lo_owner);
 }
 
 static void lov_conf_unlock(struct lov_object *lov)
 {
 }
 
 static void lov_conf_unlock(struct lov_object *lov)
 {
+       CDEBUG(D_INODE, "To release exclusive lov(%p) owner %p\n",
+               lov, lov->lo_owner);
        lov->lo_owner = NULL;
        up_write(&lov->lo_type_guard);
 }
        lov->lo_owner = NULL;
        up_write(&lov->lo_type_guard);
 }
@@ -734,6 +742,7 @@ static int lov_layout_change(const struct lu_env *unused,
        union lov_layout_state *state = &lov->u;
        const struct lov_layout_operations *old_ops;
        const struct lov_layout_operations *new_ops;
        union lov_layout_state *state = &lov->u;
        const struct lov_layout_operations *old_ops;
        const struct lov_layout_operations *new_ops;
+       struct lov_device *lov_dev = lov_object_dev(lov);
        struct lu_env *env;
        __u16 refcheck;
        int rc;
        struct lu_env *env;
        __u16 refcheck;
        int rc;
@@ -766,14 +775,21 @@ static int lov_layout_change(const struct lu_env *unused,
 
        LASSERT(atomic_read(&lov->lo_active_ios) == 0);
 
 
        LASSERT(atomic_read(&lov->lo_active_ios) == 0);
 
+       CDEBUG(D_INODE, DFID "Apply new layout lov %p, type %d\n",
+              PFID(lu_object_fid(lov2lu(lov))), lov, llt);
+
        lov->lo_type = LLT_EMPTY;
 
        /* page bufsize fixup */
        cl_object_header(&lov->lo_cl)->coh_page_bufsize -=
                lov_page_slice_fixup(lov, NULL);
 
        lov->lo_type = LLT_EMPTY;
 
        /* page bufsize fixup */
        cl_object_header(&lov->lo_cl)->coh_page_bufsize -=
                lov_page_slice_fixup(lov, NULL);
 
-       rc = new_ops->llo_init(env, lov_object_dev(lov), lov, lsm, conf, state);
+       rc = new_ops->llo_init(env, lov_dev, lov, lsm, conf, state);
        if (rc != 0) {
        if (rc != 0) {
+               struct obd_device *obd = lov2obd(lov_dev->ld_lov);
+
+               CERROR("%s: cannot apply new layout on "DFID" : rc = %d\n",
+                      obd->obd_name, PFID(lu_object_fid(lov2lu(lov))), rc);
                new_ops->llo_delete(env, lov, state);
                new_ops->llo_fini(env, lov, state);
                /* this file becomes an EMPTY file. */
                new_ops->llo_delete(env, lov, state);
                new_ops->llo_fini(env, lov, state);
                /* this file becomes an EMPTY file. */
@@ -937,6 +953,11 @@ int lov_io_init(const struct lu_env *env, struct cl_object *obj,
                struct cl_io *io)
 {
        CL_IO_SLICE_CLEAN(lov_env_io(env), lis_cl);
                struct cl_io *io)
 {
        CL_IO_SLICE_CLEAN(lov_env_io(env), lis_cl);
+
+       CDEBUG(D_INODE, DFID "io %p type %d ignore/verify layout %d/%d\n",
+              PFID(lu_object_fid(&obj->co_lu)), io, io->ci_type,
+              io->ci_ignore_layout, io->ci_verify_layout);
+
        return LOV_2DISPATCH_MAYLOCK(cl2lov(obj), llo_io_init,
                                     !io->ci_ignore_layout, env, obj, io);
 }
        return LOV_2DISPATCH_MAYLOCK(cl2lov(obj), llo_io_init,
                                     !io->ci_ignore_layout, env, obj, io);
 }
index 8c03d73..a336e3c 100644 (file)
@@ -987,6 +987,7 @@ static int osc_extent_truncate(struct osc_extent *ext, pgoff_t trunc_index,
        env = cl_env_get(&refcheck);
        io  = &osc_env_info(env)->oti_io;
        io->ci_obj = cl_object_top(osc2cl(obj));
        env = cl_env_get(&refcheck);
        io  = &osc_env_info(env)->oti_io;
        io->ci_obj = cl_object_top(osc2cl(obj));
+       io->ci_ignore_layout = 1;
        rc = cl_io_init(env, io, CIT_MISC, io->ci_obj);
        if (rc < 0)
                GOTO(out, rc);
        rc = cl_io_init(env, io, CIT_MISC, io->ci_obj);
        if (rc < 0)
                GOTO(out, rc);