* GPL HEADER END
*/
/*
- * Copyright (c) 2016, Intel Corporation.
+ * Copyright (c) 2017, Intel Corporation.
*
* lustre/mgs/mgs_barrier.c
*
#define DEBUG_SUBSYSTEM S_MGS
#define D_MGS D_CONFIG
-#include <uapi/linux/lustre_ioctl.h>
+#include <uapi/linux/lustre/lustre_ioctl.h>
#include <lustre_swab.h>
-#include <lustre/lustre_barrier_user.h>
+#include <uapi/linux/lustre/lustre_barrier_user.h>
#include "mgs_internal.h"
ENTRY;
if (rc) {
- if (rc == -ENODEV)
+ if (rc == -ENODEV) {
/* The lock is useless, cancel it. */
ldlm_lock_cancel(ca->ca_lock);
+ rc = 0;
+ }
GOTO(out, rc);
}
return true;
}
+bool mgs_barrier_expired(struct fs_db *fsdb, time64_t timeout)
+{
+ time64_t expired = fsdb->fsdb_barrier_latest_create_time + timeout;
+
+ return expired > ktime_get_real_seconds();
+}
+
/**
* Create the barrier for the given instance.
*
char *name = mgs_env_info(env)->mgi_fsname;
struct fs_db *fsdb;
int rc = 0;
- int left;
+ time64_t left;
bool phase1 = true;
bool dirty = false;
ENTRY;
rc = -EINPROGRESS;
break;
case BS_FROZEN:
- if (cfs_time_before(cfs_time_current_sec(),
- fsdb->fsdb_barrier_latest_create_time +
- fsdb->fsdb_barrier_timeout)) {
+ if (mgs_barrier_expired(fsdb, fsdb->fsdb_barrier_timeout)) {
rc = -EALREADY;
break;
}
rc = -ENODEV;
} else {
fsdb->fsdb_barrier_latest_create_time =
- cfs_time_current_sec();
+ ktime_get_real_seconds();
fsdb->fsdb_barrier_status = BS_FREEZING_P1;
if (bc->bc_timeout != 0)
fsdb->fsdb_barrier_timeout = bc->bc_timeout;
dirty = true;
left = fsdb->fsdb_barrier_latest_create_time +
- fsdb->fsdb_barrier_timeout - cfs_time_current_sec();
+ fsdb->fsdb_barrier_timeout - ktime_get_real_seconds();
if (left <= 0) {
fsdb->fsdb_barrier_status = BS_EXPIRED;
if (bc->bc_status == BS_FREEZING_P1 ||
bc->bc_status == BS_FREEZING_P2 ||
bc->bc_status == BS_FROZEN) {
- if (cfs_time_before(cfs_time_current_sec(),
- fsdb->fsdb_barrier_latest_create_time +
- fsdb->fsdb_barrier_timeout))
+ if (mgs_barrier_expired(fsdb, fsdb->fsdb_barrier_timeout))
bc->bc_timeout =
fsdb->fsdb_barrier_latest_create_time +
fsdb->fsdb_barrier_timeout -
- cfs_time_current_sec();
+ ktime_get_real_seconds();
else
bc->bc_status = fsdb->fsdb_barrier_status =
BS_EXPIRED;
rc = -EBUSY;
break;
case BS_FROZEN:
- if (cfs_time_before(cfs_time_current_sec(),
- b_fsdb->fsdb_barrier_latest_create_time +
- b_fsdb->fsdb_barrier_timeout)) {
+ if (mgs_barrier_expired(b_fsdb, b_fsdb->fsdb_barrier_timeout)) {
rc = -EBUSY;
break;
}
case BS_THAWED:
case BS_EXPIRED:
case BS_FAILED:
- b_fsdb->fsdb_barrier_latest_create_time =
- cfs_time_current_sec();
+ b_fsdb->fsdb_barrier_latest_create_time = ktime_get_real_seconds();
b_fsdb->fsdb_barrier_status = BS_RESCAN;
memcpy(b_fsdb->fsdb_mdt_index_map, c_fsdb->fsdb_mdt_index_map,
INDEX_MAP_SIZE);
b_fsdb->fsdb_barrier_status = rc;
rc = -EREMOTE;
} else if (rc == -ETIMEDOUT &&
- cfs_time_before(cfs_time_current_sec(),
- b_fsdb->fsdb_barrier_latest_create_time +
- bc->bc_timeout)) {
+ mgs_barrier_expired(b_fsdb, bc->bc_timeout)) {
memset(b_fsdb->fsdb_barrier_map, 0, INDEX_MAP_SIZE);
goto again;
strnlen(bc->bc_name, sizeof(bc->bc_name)) > 8))
RETURN(-EINVAL);
+ /* NOT allow barrier operations during recovery. */
+ if (unlikely(mgs->mgs_obd->obd_recovering))
+ RETURN(-EBUSY);
+
switch (bc->bc_cmd) {
case BC_FREEZE:
rc = mgs_barrier_freeze(env, mgs, bc);