X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flclient%2Fglimpse.c;h=94b2696783189037c2713126184567aaec6782d5;hb=26345bee6b04d9e82019a42dfd4f0d4c96f97b2e;hp=7098037fbcd43922225323971b84f0208be962b4;hpb=65701b4a30efdb695776bcf690a2b3cabc928da1;p=fs%2Flustre-release.git diff --git a/lustre/lclient/glimpse.c b/lustre/lclient/glimpse.c index 7098037..94b2696 100644 --- a/lustre/lclient/glimpse.c +++ b/lustre/lclient/glimpse.c @@ -1,6 +1,4 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * +/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -29,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/ @@ -117,7 +115,7 @@ int cl_glimpse_lock(const struct lu_env *env, struct cl_io *io, result = 0; if (!(lli->lli_flags & LLIF_MDS_SIZE_LOCK)) { CDEBUG(D_DLMTRACE, "Glimpsing inode "DFID"\n", PFID(fid)); - if (lli->lli_smd) { + if (lli->lli_has_smd) { /* NOTE: this looks like DLM lock request, but it may * not be one. Due to CEF_ASYNC flag (translated * to LDLM_FL_HAS_INTENT by osc), this is @@ -159,7 +157,7 @@ int cl_glimpse_lock(const struct lu_env *env, struct cl_io *io, LASSERT(agl == 0); result = cl_wait(env, lock); if (result == 0) { - cl_merge_lvb(inode); + cl_merge_lvb(env, inode); if (cl_isize_read(inode) > 0 && inode->i_blocks == 0) { /* @@ -175,6 +173,7 @@ int cl_glimpse_lock(const struct lu_env *env, struct cl_io *io, cl_lock_release(env, lock, "glimpse", cfs_current()); } else { CDEBUG(D_DLMTRACE, "No objects for inode\n"); + cl_merge_lvb(env, inode); } } @@ -226,6 +225,8 @@ int cl_glimpse_size0(struct inode *inode, int agl) result = cl_io_get(inode, &env, &io, &refcheck); if (result > 0) { + again: + io->ci_verify_layout = 1; result = cl_io_init(env, io, CIT_MISC, io->ci_obj); if (result > 0) /* @@ -236,10 +237,14 @@ 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); - cl_env_put(env, &refcheck); - } - RETURN(result); + if (unlikely(io->ci_need_restart)) + goto again; + cl_env_put(env, &refcheck); + } + RETURN(result); } int cl_local_size(struct inode *inode) @@ -255,7 +260,7 @@ int cl_local_size(struct inode *inode) ENTRY; - if (!cl_i2info(inode)->lli_smd) + if (!cl_i2info(inode)->lli_has_smd) RETURN(0); result = cl_io_get(inode, &env, &io, &refcheck); @@ -274,7 +279,7 @@ int cl_local_size(struct inode *inode) descr->cld_obj = clob; lock = cl_lock_peek(env, io, descr, "localsize", cfs_current()); if (lock != NULL) { - cl_merge_lvb(inode); + cl_merge_lvb(env, inode); cl_unuse(env, lock); cl_lock_release(env, lock, "localsize", cfs_current()); result = 0;