From 3762e55302ac6df9818b791f065acb8e716af6f9 Mon Sep 17 00:00:00 2001 From: Jinshan Xiong Date: Thu, 16 Aug 2012 10:10:54 -0700 Subject: [PATCH 1/1] LU-1755 osc: solve a race between fsync and truncate If an OSC extent is being truncated when fsync is called, it will have oe_fsync_wait set but no oe_urgent or oe_hp set. This causes problem because when the extent changes OES_CACHE later, it won't be written out immediately because urgent bit is not set. This problem can be fixed by checking oe_fsync_wait bit and set urgent bit correspondingly when changing osc extent's state from OES_TRUNC to OES_CACHE at the end of truncate. Signed-off-by: Jinshan Xiong Change-Id: I755baac066375a92730b14de1c470c66baad5320 Reviewed-on: http://review.whamcloud.com/3699 Tested-by: Hudson Tested-by: Maloo Reviewed-by: Niu Yawei Reviewed-by: Johann Lombardi --- lustre/osc/osc_cache.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lustre/osc/osc_cache.c b/lustre/osc/osc_cache.c index b67911b..23dc755 100644 --- a/lustre/osc/osc_cache.c +++ b/lustre/osc/osc_cache.c @@ -2678,6 +2678,10 @@ void osc_cache_truncate_end(const struct lu_env *env, struct osc_io *oio, OSC_EXTENT_DUMP(D_CACHE, ext, "trunc -> cache.\n"); osc_object_lock(obj); osc_extent_state_set(ext, OES_CACHE); + if (ext->oe_fsync_wait && !ext->oe_urgent) { + ext->oe_urgent = 1; + cfs_list_move_tail(&ext->oe_link, &obj->oo_urgent_exts); + } osc_update_pending(obj, OBD_BRW_WRITE, ext->oe_nr_pages); osc_object_unlock(obj); osc_extent_put(env, ext); @@ -2808,6 +2812,11 @@ int osc_cache_writeback_range(const struct lu_env *env, struct osc_object *obj, * grants. We do this for the correctness of fsync. */ LASSERT(hp == 0 && discard == 0); ext->oe_urgent = 1; + break; + case OES_TRUNC: + /* this extent is being truncated, can't do anything + * for it now. it will be set to urgent after truncate + * is finished in osc_cache_truncate_end(). */ default: break; } -- 1.8.3.1