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

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-5062


Reviewed-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
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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,
+6 −0
Original line number Diff line number Diff line
@@ -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));
+5 −10
Original line number Diff line number Diff line
@@ -308,17 +308,12 @@ 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_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;
}

+1 −0
Original line number Diff line number Diff line
@@ -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,