Whamcloud - gitweb
LU-5062 llite: Solve a race to access lli_has_smd in read case 39/12139/3
authorJinshan Xiong <jinshan.xiong@intel.com>
Tue, 30 Sep 2014 18:44:54 +0000 (11:44 -0700)
committerOleg Drokin <oleg.drokin@intel.com>
Mon, 1 Dec 2014 04:19:29 +0000 (04:19 +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.

Patch on master: http://review.whamcloud.com/10760

Test-Parameters: alwaysuploadlogs testlist=metadata-updates

Signed-off-by: Jinshan Xiong <jinshan.xiong@intel.com>
Change-Id: I70cb1888b42e0e9928f8346359e2b1f554fe4e8f
Reviewed-on: http://review.whamcloud.com/12139
Tested-by: Jenkins
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 dd782ee..b33316b 100644 (file)
@@ -331,6 +331,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 af0bfab..f60639b 100644 (file)
@@ -605,6 +605,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 eb67f65..e10eeb8 100644 (file)
@@ -314,20 +314,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 51096da..b8aa0ba 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,