Whamcloud - gitweb
b=23848 mdc_clear_open_replay_data() ASSERTION(mod != LP_POISON && mod != NULL)
authorVitaly Fertman <vitaly.fertman@oracle.com>
Fri, 10 Dec 2010 13:01:42 +0000 (16:01 +0300)
committerVitaly Fertman <vitaly.fertman@oracle.com>
Fri, 10 Dec 2010 23:52:55 +0000 (02:52 +0300)
it is possible to have no md_open_data on close for some recovery cases.
also avoid ELC for recovery tests which rely on lost blocking AST rpc.

lustre/mdc/mdc_reint.c
lustre/mdc/mdc_request.c

index f615b34..89cd5be 100644 (file)
@@ -132,7 +132,8 @@ int mdc_setattr(struct obd_export *exp, struct md_op_data *op_data,
         if (op_data->op_attr.ia_valid & (ATTR_MODE|ATTR_UID|ATTR_GID))
                 bits |= MDS_INODELOCK_LOOKUP;
         if ((op_data->op_flags & MF_MDC_CANCEL_FID1) &&
         if (op_data->op_attr.ia_valid & (ATTR_MODE|ATTR_UID|ATTR_GID))
                 bits |= MDS_INODELOCK_LOOKUP;
         if ((op_data->op_flags & MF_MDC_CANCEL_FID1) &&
-            (fid_is_sane(&op_data->op_fid1)))
+            (fid_is_sane(&op_data->op_fid1)) &&
+            !OBD_FAIL_CHECK(OBD_FAIL_LDLM_BL_CALLBACK))
                 count = mdc_resource_get_unused(exp, &op_data->op_fid1,
                                                 &cancels, LCK_EX, bits);
         req = ptlrpc_request_alloc(class_exp2cliimp(exp),
                 count = mdc_resource_get_unused(exp, &op_data->op_fid1,
                                                 &cancels, LCK_EX, bits);
         req = ptlrpc_request_alloc(class_exp2cliimp(exp),
@@ -319,12 +320,14 @@ int mdc_unlink(struct obd_export *exp, struct md_op_data *op_data,
         LASSERT(req == NULL);
 
         if ((op_data->op_flags & MF_MDC_CANCEL_FID1) &&
         LASSERT(req == NULL);
 
         if ((op_data->op_flags & MF_MDC_CANCEL_FID1) &&
-            (fid_is_sane(&op_data->op_fid1)))
+            (fid_is_sane(&op_data->op_fid1)) &&
+            !OBD_FAIL_CHECK(OBD_FAIL_LDLM_BL_CALLBACK))
                 count = mdc_resource_get_unused(exp, &op_data->op_fid1,
                                                 &cancels, LCK_EX,
                                                 MDS_INODELOCK_UPDATE);
         if ((op_data->op_flags & MF_MDC_CANCEL_FID3) &&
                 count = mdc_resource_get_unused(exp, &op_data->op_fid1,
                                                 &cancels, LCK_EX,
                                                 MDS_INODELOCK_UPDATE);
         if ((op_data->op_flags & MF_MDC_CANCEL_FID3) &&
-            (fid_is_sane(&op_data->op_fid3)))
+            (fid_is_sane(&op_data->op_fid3)) &&
+            !OBD_FAIL_CHECK(OBD_FAIL_LDLM_BL_CALLBACK))
                 count += mdc_resource_get_unused(exp, &op_data->op_fid3,
                                                  &cancels, LCK_EX,
                                                  MDS_INODELOCK_FULL);
                 count += mdc_resource_get_unused(exp, &op_data->op_fid3,
                                                  &cancels, LCK_EX,
                                                  MDS_INODELOCK_FULL);
index dff860b..92c453c 100644 (file)
@@ -767,7 +767,14 @@ int mdc_clear_open_replay_data(struct obd_export *exp,
         struct md_open_data *mod = och->och_mod;
         ENTRY;
 
         struct md_open_data *mod = och->och_mod;
         ENTRY;
 
-        LASSERT(mod != LP_POISON && mod != NULL);
+        /**
+         * It is possible to not have \var mod in a case of eviction between
+         * lookup and ll_file_open().
+         **/
+        if (mod == NULL)
+                RETURN(0);
+
+        LASSERT(mod != LP_POISON);
 
         mod->mod_och = NULL;
         och->och_mod = NULL;
 
         mod->mod_och = NULL;
         och->och_mod = NULL;