staging/lustre/osc: osc_extent_truncate()) ASSERTION( !ext->oe_urgent ) failed
The bug was caused by race between truncate & fsync. osc_extent_wait() doesn't takes into account oe_trunc_pending during setting oe_urgent. The race arises after osc_object_unlock(). osc_extent_wait() should ignore extents with oe_trunc_pending while waiting for OES_INV. osc_cache_truncate_end() will set oe_urgent and call osc_io_unplug_async() Signed-off-by: Andriy Skulysh <Andriy_Skulysh@xyratex.com> Reviewed-on: http://review.whamcloud.com/10204 Xyratex-bug-id: LELUS-239 Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-4852 Reviewed-by: Jinshan Xiong <jinshan.xiong@intel.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
88fa62b24d
commit
ce248d5978
@ -871,7 +871,8 @@ static int osc_extent_wait(const struct lu_env *env, struct osc_extent *ext,
|
||||
LASSERT(sanity_check_nolock(ext) == 0);
|
||||
/* `Kick' this extent only if the caller is waiting for it to be
|
||||
* written out. */
|
||||
if (state == OES_INV && !ext->oe_urgent && !ext->oe_hp) {
|
||||
if (state == OES_INV && !ext->oe_urgent && !ext->oe_hp &&
|
||||
!ext->oe_trunc_pending) {
|
||||
if (ext->oe_state == OES_ACTIVE) {
|
||||
ext->oe_urgent = 1;
|
||||
} else if (ext->oe_state == OES_CACHE) {
|
||||
@ -922,8 +923,8 @@ static int osc_extent_truncate(struct osc_extent *ext, pgoff_t trunc_index,
|
||||
int rc = 0;
|
||||
|
||||
LASSERT(sanity_check(ext) == 0);
|
||||
LASSERT(ext->oe_state == OES_TRUNC);
|
||||
LASSERT(!ext->oe_urgent);
|
||||
EASSERT(ext->oe_state == OES_TRUNC, ext);
|
||||
EASSERT(!ext->oe_urgent, ext);
|
||||
|
||||
/* Request new lu_env.
|
||||
* We can't use that env from osc_cache_truncate_start() because
|
||||
|
Loading…
x
Reference in New Issue
Block a user