X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lustre%2Fosc%2Fosc_cache.c;h=b462fcc3280b93eafcdb55d332977f337cecb876;hb=ea766bd959cc2347b223d597b3f8a31e010bed72;hp=8ec5be43165c5b711b73a214ac6b25da09f0af5f;hpb=840fcdf52dda62772075dd2dbddb752bf81cf3c4;p=fs%2Flustre-release.git diff --git a/lustre/osc/osc_cache.c b/lustre/osc/osc_cache.c index 8ec5be4..b462fcc 100644 --- a/lustre/osc/osc_cache.c +++ b/lustre/osc/osc_cache.c @@ -27,7 +27,7 @@ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2012, Intel Corporation. + * Copyright (c) 2012, 2013, Intel Corporation. * */ /* @@ -99,22 +99,23 @@ static inline char list_empty_marker(cfs_list_t *list) #define EXTSTR "[%lu -> %lu/%lu]" #define EXTPARA(ext) (ext)->oe_start, (ext)->oe_end, (ext)->oe_max_end +static const char *oes_strings[] = { + "inv", "active", "cache", "locking", "lockdone", "rpc", "trunc", NULL }; #define OSC_EXTENT_DUMP(lvl, extent, fmt, ...) do { \ struct osc_extent *__ext = (extent); \ - const char *__str[] = OES_STRINGS; \ char __buf[16]; \ \ CDEBUG(lvl, \ "extent %p@{" EXTSTR ", " \ "[%d|%d|%c|%s|%s|%p], [%d|%d|%c|%c|%p|%u|%p]} " fmt, \ - /* ----- extent part 0 ----- */ \ + /* ----- extent part 0 ----- */ \ __ext, EXTPARA(__ext), \ /* ----- part 1 ----- */ \ cfs_atomic_read(&__ext->oe_refc), \ cfs_atomic_read(&__ext->oe_users), \ list_empty_marker(&__ext->oe_link), \ - __str[__ext->oe_state], ext_flags(__ext, __buf), \ + oes_strings[__ext->oe_state], ext_flags(__ext, __buf), \ __ext->oe_obj, \ /* ----- part 2 ----- */ \ __ext->oe_grants, __ext->oe_nr_pages, \ @@ -128,10 +129,10 @@ static inline char list_empty_marker(cfs_list_t *list) #undef EASSERTF #define EASSERTF(expr, ext, fmt, args...) do { \ if (!(expr)) { \ - OSC_EXTENT_DUMP(D_ERROR, (ext), fmt, ##args); \ - osc_extent_tree_dump(D_ERROR, (ext)->oe_obj); \ + OSC_EXTENT_DUMP(D_ERROR, (ext), fmt, ##args); \ + osc_extent_tree_dump(D_ERROR, (ext)->oe_obj); \ LASSERT(expr); \ - } \ + } \ } while (0) #undef EASSERT @@ -2124,27 +2125,24 @@ static void osc_check_rpcs(const struct lu_env *env, struct client_obd *cli, static int osc_io_unplug0(const struct lu_env *env, struct client_obd *cli, struct osc_object *osc, pdl_policy_t pol, int async) { - int has_rpcs = 1; int rc = 0; - client_obd_list_lock(&cli->cl_loi_list_lock); - if (osc != NULL) - has_rpcs = __osc_list_maint(cli, osc); - if (has_rpcs) { - if (!async) { - /* disable osc_lru_shrink() temporarily to avoid - * potential stack overrun problem. LU-2859 */ - cfs_atomic_inc(&cli->cl_lru_shrinkers); - osc_check_rpcs(env, cli, pol); - cfs_atomic_dec(&cli->cl_lru_shrinkers); - } else { - CDEBUG(D_CACHE, "Queue writeback work for client %p.\n", - cli); - LASSERT(cli->cl_writeback_work != NULL); - rc = ptlrpcd_queue_work(cli->cl_writeback_work); - } + if (osc != NULL && osc_list_maint(cli, osc) == 0) + return 0; + + if (!async) { + /* disable osc_lru_shrink() temporarily to avoid + * potential stack overrun problem. LU-2859 */ + cfs_atomic_inc(&cli->cl_lru_shrinkers); + client_obd_list_lock(&cli->cl_loi_list_lock); + osc_check_rpcs(env, cli, pol); + client_obd_list_unlock(&cli->cl_loi_list_lock); + cfs_atomic_dec(&cli->cl_lru_shrinkers); + } else { + CDEBUG(D_CACHE, "Queue writeback work for client %p.\n", cli); + LASSERT(cli->cl_writeback_work != NULL); + rc = ptlrpcd_queue_work(cli->cl_writeback_work); } - client_obd_list_unlock(&cli->cl_loi_list_lock); return rc; } @@ -2700,7 +2698,7 @@ again: * should take care of it. */ rc = osc_extent_wait(env, waiting, OES_INV); if (rc < 0) - OSC_EXTENT_DUMP(D_CACHE, ext, "wait error: %d.\n", rc); + OSC_EXTENT_DUMP(D_CACHE, waiting, "error: %d.\n", rc); osc_extent_put(env, waiting); waiting = NULL;