forked from Minki/linux
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: 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>
This commit is contained in:
parent
d27f9b077e
commit
4c309612dd
@ -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,
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user