#define OBD_FAIL_OST_STATFS_DELAY 0x242
#define OBD_FAIL_OST_INTEGRITY_FAULT 0x243
#define OBD_FAIL_OST_INTEGRITY_CMP 0x244
+#define OBD_FAIL_OST_DISCONNECT_DELAY 0x245
#define OBD_FAIL_LDLM 0x300
#define OBD_FAIL_LDLM_NAMESPACE_NEW 0x301
}
EXPORT_SYMBOL(ptlrpc_disconnect_import);
+static void ptlrpc_reset_reqs_generation(struct obd_import *imp)
+{
+ struct ptlrpc_request *old, *tmp;
+
+ /* tag all resendable requests generated before disconnection
+ * notice this code is part of disconnect-at-idle path only */
+ list_for_each_entry_safe(old, tmp, &imp->imp_delayed_list,
+ rq_list) {
+ spin_lock(&old->rq_lock);
+ if (old->rq_import_generation == imp->imp_generation - 1 &&
+ !old->rq_no_resend)
+ old->rq_import_generation = imp->imp_generation;
+ spin_unlock(&old->rq_lock);
+ }
+}
+
static int ptlrpc_disconnect_idle_interpret(const struct lu_env *env,
struct ptlrpc_request *req,
void *args, int rc)
struct obd_import *imp = req->rq_import;
int connect = 0;
- DEBUG_REQ(D_HA, req, "inflight=%d, refcount=%d: rc = %d\n",
+ DEBUG_REQ(D_HA, req, "inflight=%d, refcount=%d: rc = %d ",
atomic_read(&imp->imp_inflight),
atomic_read(&imp->imp_refcount), rc);
imp->imp_generation++;
imp->imp_initiated_at = imp->imp_generation;
IMPORT_SET_STATE_NOLOCK(imp, LUSTRE_IMP_NEW);
+ ptlrpc_reset_reqs_generation(imp);
connect = 1;
}
}
}
run_test 811 "orphan name stub can be cleaned up in startup"
+test_812() {
+ [ $OST1_VERSION -lt $(version_code 2.12.51) ] &&
+ skip "OST < 2.12.51 doesn't support this fail_loc"
+
+ $LFS setstripe -c 1 -i 0 $DIR/$tfile
+ # ensure ost1 is connected
+ stat $DIR/$tfile >/dev/null || error "can't stat"
+ wait_osc_import_state client ost1 FULL
+ # no locks, no reqs to let the connection idle
+ cancel_lru_locks osc
+
+ # delay OST_DISCONNECT on OST1 to put OSC into intermediate state
+#define OBD_FAIL_OST_DISCONNECT_DELAY 0x245
+ do_facet ost1 "$LCTL set_param fail_loc=0x245 fail_val=8"
+ wait_osc_import_state client ost1 CONNECTING
+ do_facet ost1 "$LCTL set_param fail_loc=0 fail_val=0"
+
+ stat $DIR/$tfile >/dev/null || error "can't stat file"
+}
+run_test 812 "do not drop reqs generated when imp is going to idle (LU-11951)"
+
#
# tests that do cleanup/setup should be run at the end
#