Whamcloud - gitweb
LU-5062 llite: Solve a race to access lli_has_smd in read case 60/10760/3
authorJinshan Xiong <jinshan.xiong@intel.com>
Thu, 19 Jun 2014 23:21:09 +0000 (16:21 -0700)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 24 Jun 2014 16:39:41 +0000 (16:39 +0000)
In vvp_io_read_lock(), it used to decide if to add read lock by
checking lli_has_smd. Accessing lli_has_smd is racy when an empty
file is turned into raid0, therefore, it may result in read requests
are issued without corresponding lock.

Signed-off-by: Jinshan Xiong <jinshan.xiong@intel.com>
Change-Id: I70cb1888b42e0e9928f8346359e2b1f554fe4e8f
Reviewed-on: http://review.whamcloud.com/10760
Tested-by: Jenkins
Reviewed-by: Patrick Farrell <paf@cray.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Bobi Jam <bobijam@gmail.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/include/lclient.h
lustre/lclient/lcommon_cl.c
lustre/llite/vvp_io.c
lustre/llite/vvp_lock.c

index 62a79d7..dd784f3 100644 (file)
@@ -350,6 +350,7 @@ void ccc_lock_delete(const struct lu_env *env,
 void ccc_lock_fini(const struct lu_env *env,struct cl_lock_slice *slice);
 int ccc_lock_enqueue(const struct lu_env *env,const struct cl_lock_slice *slice,
                      struct cl_io *io, __u32 enqflags);
+int ccc_lock_use(const struct lu_env *env,const struct cl_lock_slice *slice);
 int ccc_lock_unuse(const struct lu_env *env,const struct cl_lock_slice *slice);
 int ccc_lock_wait(const struct lu_env *env,const struct cl_lock_slice *slice);
 int ccc_lock_fits_into(const struct lu_env *env,
index 0b9e773..afda860 100644 (file)
@@ -572,6 +572,12 @@ int ccc_lock_enqueue(const struct lu_env *env,
         return 0;
 }
 
+int ccc_lock_use(const struct lu_env *env, const struct cl_lock_slice *slice)
+{
+       CLOBINVRNT(env, slice->cls_obj, ccc_object_invariant(slice->cls_obj));
+       return 0;
+}
+
 int ccc_lock_unuse(const struct lu_env *env, const struct cl_lock_slice *slice)
 {
         CLOBINVRNT(env, slice->cls_obj, ccc_object_invariant(slice->cls_obj));
index 8186e41..798329e 100644 (file)
@@ -335,20 +335,14 @@ static int vvp_io_rw_lock(const struct lu_env *env, struct cl_io *io,
 static int vvp_io_read_lock(const struct lu_env *env,
                             const struct cl_io_slice *ios)
 {
-        struct cl_io         *io  = ios->cis_io;
-        struct ll_inode_info *lli = ll_i2info(ccc_object_inode(io->ci_obj));
-        int result;
+       struct cl_io            *io = ios->cis_io;
+       struct cl_io_rw_common  *rd = &io->u.ci_rd.rd;
+       int result;
 
-        ENTRY;
-        /* XXX: Layer violation, we shouldn't see lsm at llite level. */
-       if (lli->lli_has_smd) /* lsm-less file doesn't need to lock */
-                result = vvp_io_rw_lock(env, io, CLM_READ,
-                                        io->u.ci_rd.rd.crw_pos,
-                                        io->u.ci_rd.rd.crw_pos +
-                                        io->u.ci_rd.rd.crw_count - 1);
-        else
-                result = 0;
-        RETURN(result);
+       ENTRY;
+       result = vvp_io_rw_lock(env, io, CLM_READ, rd->crw_pos,
+                               rd->crw_pos + rd->crw_count - 1);
+       RETURN(result);
 }
 
 static int vvp_io_fault_lock(const struct lu_env *env,
index 54d99f0..94f85d4 100644 (file)
@@ -75,6 +75,7 @@ static const struct cl_lock_operations vvp_lock_ops = {
         .clo_fini      = ccc_lock_fini,
         .clo_enqueue   = ccc_lock_enqueue,
         .clo_wait      = ccc_lock_wait,
+       .clo_use       = ccc_lock_use,
         .clo_unuse     = ccc_lock_unuse,
         .clo_fits_into = ccc_lock_fits_into,
         .clo_state     = ccc_lock_state,