Commit 4c309612 authored by Jinshan Xiong's avatar Jinshan Xiong Committed by Greg Kroah-Hartman

staging/lustre/llite: Solve a race to access lli_has_smd in read case

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: default avatarJinshan Xiong <jinshan.xiong@intel.com>
Reviewed-on: http://review.whamcloud.com/12139
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-5062Reviewed-by: default avatarBobi Jam <bobijam@gmail.com>
Signed-off-by: default avatarOleg Drokin <oleg.drokin@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent d27f9b07
...@@ -325,6 +325,7 @@ void ccc_lock_fini(const struct lu_env *env, struct cl_lock_slice *slice); ...@@ -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, int ccc_lock_enqueue(const struct lu_env *env,
const struct cl_lock_slice *slice, const struct cl_lock_slice *slice,
struct cl_io *io, __u32 enqflags); 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_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_wait(const struct lu_env *env, const struct cl_lock_slice *slice);
int ccc_lock_fits_into(const struct lu_env *env, int ccc_lock_fits_into(const struct lu_env *env,
......
...@@ -586,6 +586,12 @@ int ccc_lock_enqueue(const struct lu_env *env, ...@@ -586,6 +586,12 @@ int ccc_lock_enqueue(const struct lu_env *env,
return 0; 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) 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)); CLOBINVRNT(env, slice->cls_obj, ccc_object_invariant(slice->cls_obj));
......
...@@ -307,18 +307,13 @@ static int vvp_io_rw_lock(const struct lu_env *env, struct cl_io *io, ...@@ -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, static int vvp_io_read_lock(const struct lu_env *env,
const struct cl_io_slice *ios) const struct cl_io_slice *ios)
{ {
struct cl_io *io = ios->cis_io; struct cl_io *io = ios->cis_io;
struct ll_inode_info *lli = ll_i2info(ccc_object_inode(io->ci_obj)); struct cl_io_rw_common *rd = &io->u.ci_rd.rd;
int result; int result;
/* XXX: Layer violation, we shouldn't see lsm at llite level. */ result = vvp_io_rw_lock(env, io, CLM_READ, rd->crw_pos,
if (lli->lli_has_smd) /* lsm-less file doesn't need to lock */ rd->crw_pos + rd->crw_count - 1);
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; return result;
} }
......
...@@ -71,6 +71,7 @@ static const struct cl_lock_operations vvp_lock_ops = { ...@@ -71,6 +71,7 @@ static const struct cl_lock_operations vvp_lock_ops = {
.clo_fini = ccc_lock_fini, .clo_fini = ccc_lock_fini,
.clo_enqueue = ccc_lock_enqueue, .clo_enqueue = ccc_lock_enqueue,
.clo_wait = ccc_lock_wait, .clo_wait = ccc_lock_wait,
.clo_use = ccc_lock_use,
.clo_unuse = ccc_lock_unuse, .clo_unuse = ccc_lock_unuse,
.clo_fits_into = ccc_lock_fits_into, .clo_fits_into = ccc_lock_fits_into,
.clo_state = ccc_lock_state, .clo_state = ccc_lock_state,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment