X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fllite%2Fglimpse.c;h=d0bb414818b7a6b2dfc54164cadef5022486a94b;hb=b9c155065d2ca4a6037a0ca4bfc788d6961fdc8e;hp=7c9ec0de7e5b96f3e3e879a5707b9705c5834cf2;hpb=d8638fd870ecbedf4d104e7c3e0bf26124bec326;p=fs%2Flustre-release.git diff --git a/lustre/llite/glimpse.c b/lustre/llite/glimpse.c index 7c9ec0d..d0bb414 100644 --- a/lustre/llite/glimpse.c +++ b/lustre/llite/glimpse.c @@ -23,7 +23,7 @@ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, 2016, Intel Corporation. + * Copyright (c) 2011, 2017, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -50,9 +50,9 @@ #include "vvp_internal.h" static const struct cl_lock_descr whole_file = { - .cld_start = 0, - .cld_end = CL_PAGE_EOF, - .cld_mode = CLM_READ + .cld_start = 0, + .cld_end = CL_PAGE_EOF, + .cld_mode = CLM_READ }; /* @@ -63,18 +63,18 @@ static const struct cl_lock_descr whole_file = { */ blkcnt_t dirty_cnt(struct inode *inode) { - blkcnt_t cnt = 0; + blkcnt_t cnt = 0; struct vvp_object *vob = cl_inode2vvp(inode); - void *results[1]; + void *results[1]; - if (inode->i_mapping != NULL) - cnt += radix_tree_gang_lookup_tag(&inode->i_mapping->page_tree, - results, 0, 1, - PAGECACHE_TAG_DIRTY); + if (inode->i_mapping != NULL) + cnt += radix_tree_gang_lookup_tag(&inode->i_mapping->page_tree, + results, 0, 1, + PAGECACHE_TAG_DIRTY); if (cnt == 0 && atomic_read(&vob->vob_mmap_cnt) > 0) cnt = 1; - return (cnt > 0) ? 1 : 0; + return (cnt > 0) ? 1 : 0; } int cl_glimpse_lock(const struct lu_env *env, struct cl_io *io, @@ -149,65 +149,71 @@ int cl_glimpse_lock(const struct lu_env *env, struct cl_io *io, * \retval negative negative errno on error */ int cl_io_get(struct inode *inode, struct lu_env **envout, - struct cl_io **ioout, __u16 *refcheck) + struct cl_io **ioout, u16 *refcheck) { - struct lu_env *env; - struct cl_io *io; - struct ll_inode_info *lli = ll_i2info(inode); - struct cl_object *clob = lli->lli_clob; + struct lu_env *env; + struct cl_io *io; + struct ll_inode_info *lli = ll_i2info(inode); + struct cl_object *clob = lli->lli_clob; int result; if (S_ISREG(inode->i_mode)) { - env = cl_env_get(refcheck); - if (!IS_ERR(env)) { + env = cl_env_get(refcheck); + if (!IS_ERR(env)) { io = vvp_env_thread_io(env); - io->ci_obj = clob; - *envout = env; - *ioout = io; - result = +1; - } else - result = PTR_ERR(env); - } else - result = 0; - return result; + io->ci_obj = clob; + *envout = env; + *ioout = io; + result = 1; + } else { + result = PTR_ERR(env); + } + } else { + result = 0; + } + return result; } int cl_glimpse_size0(struct inode *inode, int agl) { - /* - * We don't need ast_flags argument to cl_glimpse_size(), because - * osc_lock_enqueue() takes care of the possible deadlock that said - * argument was introduced to avoid. - */ - /* - * XXX but note that ll_file_seek() passes LDLM_FL_BLOCK_NOWAIT to - * cl_glimpse_size(), which doesn't make sense: glimpse locks are not - * blocking anyway. - */ - struct lu_env *env = NULL; - struct cl_io *io = NULL; - __u16 refcheck; - int result; - - ENTRY; + /* + * We don't need ast_flags argument to cl_glimpse_size(), because + * osc_lock_enqueue() takes care of the possible deadlock that said + * argument was introduced to avoid. + */ + /* + * XXX but note that ll_file_seek() passes LDLM_FL_BLOCK_NOWAIT to + * cl_glimpse_size(), which doesn't make sense: glimpse locks are not + * blocking anyway. + */ + struct lu_env *env = NULL; + struct cl_io *io = NULL; + u16 refcheck; + int retried = 0; + int result; + + ENTRY; result = cl_io_get(inode, &env, &io, &refcheck); if (result <= 0) RETURN(result); do { - io->ci_need_restart = 0; - io->ci_verify_layout = 1; + io->ci_ndelay_tried = retried++; + io->ci_ndelay = io->ci_verify_layout = 1; result = cl_io_init(env, io, CIT_GLIMPSE, io->ci_obj); - if (result > 0) - /* - * nothing to do for this io. This currently happens - * when stripe sub-object's are not yet created. - */ - result = io->ci_result; - else if (result == 0) - result = cl_glimpse_lock(env, io, inode, io->ci_obj, + if (result > 0) { + /* + * nothing to do for this io. This currently happens + * when stripe sub-object's are not yet created. + */ + result = io->ci_result; + } else if (result == 0) { + result = cl_glimpse_lock(env, io, inode, io->ci_obj, agl); + if (!agl && result == -EWOULDBLOCK) + io->ci_need_restart = 1; + } OBD_FAIL_TIMEOUT(OBD_FAIL_GLIMPSE_DELAY, 2); cl_io_fini(env, io);