staging/lustre/llite: Solve a race to access lli_has_smd in read case
authorJinshan Xiong <jinshan.xiong@intel.com>
Mon, 2 Feb 2015 02:52:13 +0000 (21:52 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 7 Feb 2015 09:32:33 +0000 (17:32 +0800)
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>
Reviewed-on: http://review.whamcloud.com/12139
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-5062
Reviewed-by: Bobi Jam <bobijam@gmail.com>
Signed-off-by: Oleg Drokin <oleg.drokin@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/lustre/lustre/include/lclient.h
drivers/staging/lustre/lustre/lclient/lcommon_cl.c
drivers/staging/lustre/lustre/llite/vvp_io.c
drivers/staging/lustre/lustre/llite/vvp_lock.c

index 316500cdff7525fe342fcdfe3a74dea516f1472b..c5c3a8d9eaa4026675d30abebfdfb15382513060 100644 (file)
@@ -325,6 +325,7 @@ 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 24d26ab35346b8a35a4ba96c7bfdc30045fc2dc0..23095bb75226b1aace10df936ba754e3803e806c 100644 (file)
@@ -586,6 +586,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 65d610abe06e53fc0ec8cb34ccd367b7492b40f4..91bba79678cf7da1f1cd303c114648ea76c8e53d 100644 (file)
@@ -307,18 +307,13 @@ 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));
+       struct cl_io     *io = ios->cis_io;
+       struct cl_io_rw_common *rd = &io->u.ci_rd.rd;
        int result;
 
-       /* 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;
+       result = vvp_io_rw_lock(env, io, CLM_READ, rd->crw_pos,
+                               rd->crw_pos + rd->crw_count - 1);
+
        return result;
 }
 
index 372633e164b9b670df673faaaf57b0912e5c60df..f354e82d4ae7cfa0d5ec54c99be713a9267128fc 100644 (file)
@@ -71,6 +71,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,