Whamcloud - gitweb
LU-3789 mgs: Add deprecation warning for "lctl conf_param"
[fs/lustre-release.git] / lustre / lclient / glimpse.c
index c95ccce..94b2696 100644 (file)
@@ -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,8 +27,7 @@
  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011 Whamcloud, Inc.
- *
+ * Copyright (c) 2011, 2013, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -105,7 +102,7 @@ blkcnt_t dirty_cnt(struct inode *inode)
 }
 
 int cl_glimpse_lock(const struct lu_env *env, struct cl_io *io,
-                    struct inode *inode, struct cl_object *clob)
+                    struct inode *inode, struct cl_object *clob, int agl)
 {
         struct cl_lock_descr *descr = &ccc_env_info(env)->cti_descr;
         struct cl_inode_info *lli   = cl_i2info(inode);
@@ -118,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
@@ -136,6 +133,8 @@ int cl_glimpse_lock(const struct lu_env *env, struct cl_io *io,
                         descr->cld_obj   = clob;
                         descr->cld_mode  = CLM_PHANTOM;
                         descr->cld_enq_flags = CEF_ASYNC | CEF_MUST;
+                        if (agl)
+                                descr->cld_enq_flags |= CEF_AGL;
                         cio->cui_glimpse = 1;
                         /*
                          * CEF_ASYNC is used because glimpse sub-locks cannot
@@ -149,12 +148,16 @@ int cl_glimpse_lock(const struct lu_env *env, struct cl_io *io,
                                                cfs_current());
                         cio->cui_glimpse = 0;
 
+                        if (lock == NULL)
+                                RETURN(0);
+
                         if (IS_ERR(lock))
                                 RETURN(PTR_ERR(lock));
 
+                        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) {
                                         /*
@@ -170,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);
                 }
         }
 
@@ -200,7 +204,7 @@ static int cl_io_get(struct inode *inode, struct lu_env **envout,
         return result;
 }
 
-int cl_glimpse_size(struct inode *inode)
+int cl_glimpse_size0(struct inode *inode, int agl)
 {
         /*
          * We don't need ast_flags argument to cl_glimpse_size(), because
@@ -221,6 +225,8 @@ int cl_glimpse_size(struct inode *inode)
 
         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)
                         /*
@@ -229,11 +235,16 @@ int cl_glimpse_size(struct inode *inode)
                          */
                         result = io->ci_result;
                 else if (result == 0)
-                        result = cl_glimpse_lock(env, io, inode, io->ci_obj);
+                        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)
@@ -249,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);
@@ -268,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;