Whamcloud - gitweb
LU-2444 build: fix 'error handling' issues
[fs/lustre-release.git] / lustre / ofd / ofd_io.c
index 1193547..ea54334 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2012, Whamcloud, Inc.
+ * Copyright (c) 2012, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -214,16 +214,32 @@ int ofd_preprw(const struct lu_env* env, int cmd, struct obd_export *exp,
        struct ofd_thread_info  *info;
        int                      rc = 0;
 
-       if (OBD_FAIL_CHECK(OBD_FAIL_OST_ENOENT) &&
-           ofd->ofd_destroys_in_progress == 0) {
-               /* don't fail lookups for orphan recovery, it causes
-                * later LBUGs when objects still exist during precreate */
-               CDEBUG(D_INFO, "*** obd_fail_loc=%x ***\n",OBD_FAIL_OST_ENOENT);
-               RETURN(-ENOENT);
-       }
-
+       rc = lu_env_refill((struct lu_env *)env);
+       LASSERT(rc == 0);
        info = ofd_info_init(env, exp);
 
+       LASSERT(oa != NULL);
+
+       if (OBD_FAIL_CHECK(OBD_FAIL_OST_ENOENT)) {
+               struct ofd_seq          *oseq;
+               oseq = ofd_seq_load(env, ofd, oa->o_seq);
+               if (IS_ERR(oseq)) {
+                       CERROR("%s: Can not find seq for "LPU64":"LPU64
+                              ": rc = %ld\n", ofd_name(ofd), oa->o_seq,
+                              oa->o_id, PTR_ERR(oseq));
+                       RETURN(-EINVAL);
+               }
+
+               if (oseq->os_destroys_in_progress == 0) {
+                       /* don't fail lookups for orphan recovery, it causes
+                        * later LBUGs when objects still exist during
+                        * precreate */
+                       ofd_seq_put(env, oseq);
+                       RETURN(-ENOENT);
+               }
+               ofd_seq_put(env, oseq);
+       }
+
        LASSERT(objcount == 1);
        LASSERT(obj->ioo_bufcnt > 0);
 
@@ -232,7 +248,6 @@ int ofd_preprw(const struct lu_env* env, int cmd, struct obd_export *exp,
                rc = ofd_auth_capa(exp, &info->fti_fid, oa->o_seq,
                                   capa, CAPA_OPC_OSS_WRITE);
                if (rc == 0) {
-                       LASSERT(oa != NULL);
                        la_from_obdo(&info->fti_attr, oa, OBD_MD_FLGETATTR);
                        rc = ofd_preprw_write(env, exp, ofd, &info->fti_fid,
                                              &info->fti_attr, oa, objcount,
@@ -444,7 +459,7 @@ retry:
        }
 
        /* get attr to return */
-       dt_attr_get(env, o, la, ofd_object_capa(env, fo));
+       rc = dt_attr_get(env, o, la, ofd_object_capa(env, fo));
 
 out_stop:
        /* Force commit to make the just-deleted blocks