#define MGS_NIDTBL_VERSION_INIT 2
static int nidtbl_read_version(const struct lu_env *env,
- struct mgs_device *mgs, struct mgs_nidtbl *tbl)
+ struct mgs_device *mgs, struct mgs_nidtbl *tbl,
+ u64 *version)
{
struct dt_object *fsdb;
struct lu_fid fid;
LASSERT(mgs->mgs_nidtbl_dir);
rc = dt_lookup_dir(env, mgs->mgs_nidtbl_dir, tbl->mn_fsdb->fsdb_name,
&fid);
- if (rc == -ENOENT)
- RETURN(MGS_NIDTBL_VERSION_INIT);
- else if (rc < 0)
+ if (rc == -ENOENT) {
+ *version = MGS_NIDTBL_VERSION_INIT;
+ RETURN(0);
+ } else if (rc < 0) {
RETURN(rc);
+ }
fsdb = dt_locate_at(env, mgs->mgs_bottom, &fid,
&mgs->mgs_dt_dev.dd_lu_dev);
RETURN(PTR_ERR(fsdb));
rc = dt_read(env, fsdb, &buf, &off);
- if (rc == buf.lb_len)
- rc = le64_to_cpu(tmpver);
- else if (rc == 0)
- rc = MGS_NIDTBL_VERSION_INIT;
- else
+ if (rc == buf.lb_len) {
+ *version = le64_to_cpu(tmpver);
+ rc = 0;
+ } else if (rc == 0) {
+ *version = MGS_NIDTBL_VERSION_INIT;
+ } else {
CERROR("%s: read version file %s error %d\n",
mgs->mgs_obd->obd_name, tbl->mn_fsdb->fsdb_name, rc);
+ }
lu_object_put(env, &fsdb->do_lu);
RETURN(rc);
}
static int mgs_nidtbl_init_fs(const struct lu_env *env, struct fs_db *fsdb)
{
struct mgs_nidtbl *tbl = &fsdb->fsdb_nidtbl;
+ int rc;
CFS_INIT_LIST_HEAD(&tbl->mn_targets);
cfs_mutex_init(&tbl->mn_lock);
tbl->mn_nr_targets = 0;
tbl->mn_fsdb = fsdb;
cfs_mutex_lock(&tbl->mn_lock);
- tbl->mn_version = nidtbl_read_version(env, fsdb->fsdb_mgs, tbl);
+ rc = nidtbl_read_version(env, fsdb->fsdb_mgs, tbl, &tbl->mn_version);
cfs_mutex_unlock(&tbl->mn_lock);
- CDEBUG(D_MGS, "IR: current version is %llu\n", tbl->mn_version);
+ if (rc < 0)
+ CERROR("%s: IR: failed to read current version, rc = %d\n",
+ fsdb->fsdb_mgs->mgs_obd->obd_name, rc);
+ else
+ CDEBUG(D_MGS, "IR: current version is %llu\n",
+ tbl->mn_version);
- return 0;
+ return rc;
}
/* --------- Imperative Recovery relies on nidtbl stuff ------- */
CFS_INIT_LIST_HEAD(&fsdb->fsdb_clients);
/* start notify thread */
- fsdb->fsdb_obd = mgs->mgs_obd;
fsdb->fsdb_mgs = mgs;
cfs_atomic_set(&fsdb->fsdb_notify_phase, 0);
cfs_waitq_init(&fsdb->fsdb_notify_waitq);
ptlrpc_free_bulk(desc);
out:
- if (pages) {
- for (i = 0; i < nrpages; i++) {
- if (pages[i] == NULL)
- break;
- cfs_free_page(pages[i]);
- }
- OBD_FREE(pages, sizeof(*pages) * nrpages);
- }
- return rc;
+ for (i = 0; i < nrpages; i++) {
+ if (pages[i] == NULL)
+ break;
+ cfs_free_page(pages[i]);
+ }
+ OBD_FREE(pages, sizeof(*pages) * nrpages);
+ return rc;
}
static int lprocfs_ir_set_state(struct fs_db *fsdb, const char *buf)