X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flclient%2Fglimpse.c;h=3bf726173b98f54910aaa66c1f3d581700f53414;hb=593b6ab6d21976d37004621b86f37715df697e9e;hp=58aad5eb361aa297d8e3c641896d926c90a35c60;hpb=ecaba99677b28536f9c376b2b835b554a7792668;p=fs%2Flustre-release.git diff --git a/lustre/lclient/glimpse.c b/lustre/lclient/glimpse.c index 58aad5e..3bf7261 100644 --- a/lustre/lclient/glimpse.c +++ b/lustre/lclient/glimpse.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) 2011, 2012, Whamcloud, Inc. + * Copyright (c) 2011, 2013, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -94,8 +94,8 @@ blkcnt_t dirty_cnt(struct inode *inode) cnt += radix_tree_gang_lookup_tag(&inode->i_mapping->page_tree, results, 0, 1, PAGECACHE_TAG_DIRTY); - if (cnt == 0 && cfs_atomic_read(&vob->cob_mmap_cnt) > 0) - cnt = 1; + if (cnt == 0 && atomic_read(&vob->cob_mmap_cnt) > 0) + cnt = 1; #endif return (cnt > 0) ? 1 : 0; @@ -136,48 +136,48 @@ int cl_glimpse_lock(const struct lu_env *env, struct cl_io *io, if (agl) descr->cld_enq_flags |= CEF_AGL; cio->cui_glimpse = 1; - /* - * CEF_ASYNC is used because glimpse sub-locks cannot - * deadlock (because they never conflict with other - * locks) and, hence, can be enqueued out-of-order. - * - * CEF_MUST protects glimpse lock from conversion into - * a lockless mode. - */ - lock = cl_lock_request(env, io, descr, "glimpse", - cfs_current()); - cio->cui_glimpse = 0; + /* + * CEF_ASYNC is used because glimpse sub-locks cannot + * deadlock (because they never conflict with other + * locks) and, hence, can be enqueued out-of-order. + * + * CEF_MUST protects glimpse lock from conversion into + * a lockless mode. + */ + lock = cl_lock_request(env, io, descr, "glimpse", + current); + cio->cui_glimpse = 0; - if (lock == NULL) - RETURN(0); + if (lock == NULL) + RETURN(0); - if (IS_ERR(lock)) - RETURN(PTR_ERR(lock)); + if (IS_ERR(lock)) + RETURN(PTR_ERR(lock)); - LASSERT(agl == 0); - result = cl_wait(env, lock); - if (result == 0) { - cl_merge_lvb(inode); - if (cl_isize_read(inode) > 0 && - inode->i_blocks == 0) { - /* - * LU-417: Add dirty pages block count - * lest i_blocks reports 0, some "cp" or - * "tar" may think it's a completely - * sparse file and skip it. - */ - inode->i_blocks = dirty_cnt(inode); - } - cl_unuse(env, lock); - } - cl_lock_release(env, lock, "glimpse", cfs_current()); - } else { - CDEBUG(D_DLMTRACE, "No objects for inode\n"); - cl_merge_lvb(inode); - } - } + LASSERT(agl == 0); + result = cl_wait(env, lock); + if (result == 0) { + cl_merge_lvb(env, inode); + if (cl_isize_read(inode) > 0 && + inode->i_blocks == 0) { + /* + * LU-417: Add dirty pages block count + * lest i_blocks reports 0, some "cp" or + * "tar" may think it's a completely + * sparse file and skip it. + */ + inode->i_blocks = dirty_cnt(inode); + } + cl_unuse(env, lock); + } + cl_lock_release(env, lock, "glimpse", current); + } else { + CDEBUG(D_DLMTRACE, "No objects for inode\n"); + cl_merge_lvb(env, inode); + } + } - RETURN(result); + RETURN(result); } static int cl_io_get(struct inode *inode, struct lu_env **envout, @@ -237,6 +237,8 @@ int cl_glimpse_size0(struct inode *inode, int agl) else if (result == 0) result = cl_glimpse_lock(env, io, inode, io->ci_obj, agl); + + OBD_FAIL_TIMEOUT(OBD_FAIL_GLIMPSE_DELAY, 2); cl_io_fini(env, io); if (unlikely(io->ci_need_restart)) goto again; @@ -269,23 +271,23 @@ int cl_local_size(struct inode *inode) result = cl_io_init(env, io, CIT_MISC, clob); if (result > 0) result = io->ci_result; - else if (result == 0) { - cti = ccc_env_info(env); - descr = &cti->cti_descr; + else if (result == 0) { + cti = ccc_env_info(env); + descr = &cti->cti_descr; - *descr = whole_file; - descr->cld_obj = clob; - lock = cl_lock_peek(env, io, descr, "localsize", cfs_current()); - if (lock != NULL) { - cl_merge_lvb(inode); - cl_unuse(env, lock); - cl_lock_release(env, lock, "localsize", cfs_current()); - result = 0; - } else - result = -ENODATA; - } - cl_io_fini(env, io); - cl_env_put(env, &refcheck); - RETURN(result); + *descr = whole_file; + descr->cld_obj = clob; + lock = cl_lock_peek(env, io, descr, "localsize", current); + if (lock != NULL) { + cl_merge_lvb(env, inode); + cl_unuse(env, lock); + cl_lock_release(env, lock, "localsize", current); + result = 0; + } else + result = -ENODATA; + } + cl_io_fini(env, io); + cl_env_put(env, &refcheck); + RETURN(result); }