In lmv_locate_mds() and lmv_iocontrol() check the result of
lmv_find_target() using IS_ERR() before dereferencing it. In
lmv_get_target() return ERR_PTR(-ENODEV) rather than NULL when the
indicated MDS cannot be found among the members of lmv->tgts. In
__lmv_fid_alloc() check the result of lmv_get_target() using IS_ERR().
Signed-off-by: John L. Hammond <john.hammond@intel.com>
Change-Id: I8cfce869e4be329fd432a7b6a88f48fbc81d69dd
Reviewed-on: http://review.whamcloud.com/6116
Tested-by: Hudson
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: wangdi <di.wang@intel.com>
if (lmv->tgts[i]->ltd_idx == mds)
return lmv->tgts[i];
}
if (lmv->tgts[i]->ltd_idx == mds)
return lmv->tgts[i];
}
+
+ return ERR_PTR(-ENODEV);
}
static inline struct lmv_tgt_desc *
}
static inline struct lmv_tgt_desc *
struct lmv_tgt_desc *tgt1, *tgt2;
tgt1 = lmv_find_target(lmv, &op_data->op_fid1);
struct lmv_tgt_desc *tgt1, *tgt2;
tgt1 = lmv_find_target(lmv, &op_data->op_fid1);
+ if (IS_ERR(tgt1))
+ RETURN(PTR_ERR(tgt1));
+
tgt2 = lmv_find_target(lmv, &op_data->op_fid2);
tgt2 = lmv_find_target(lmv, &op_data->op_fid2);
+ if (IS_ERR(tgt2))
+ RETURN(PTR_ERR(tgt2));
+
if ((tgt1->ltd_exp == NULL) || (tgt2->ltd_exp == NULL))
RETURN(-EINVAL);
if ((tgt1->ltd_exp == NULL) || (tgt2->ltd_exp == NULL))
RETURN(-EINVAL);
}
int __lmv_fid_alloc(struct lmv_obd *lmv, struct lu_fid *fid,
}
int __lmv_fid_alloc(struct lmv_obd *lmv, struct lu_fid *fid,
- struct lmv_tgt_desc *tgt;
- int rc;
- ENTRY;
+ struct lmv_tgt_desc *tgt;
+ int rc;
+ ENTRY;
- tgt = lmv_get_target(lmv, mds);
+ tgt = lmv_get_target(lmv, mds);
+ if (IS_ERR(tgt))
+ RETURN(PTR_ERR(tgt));
- /*
- * New seq alloc and FLD setup should be atomic. Otherwise we may find
- * on server that seq in new allocated fid is not yet known.
- */
+ /*
+ * New seq alloc and FLD setup should be atomic. Otherwise we may find
+ * on server that seq in new allocated fid is not yet known.
+ */
mutex_lock(&tgt->ltd_fid_mutex);
mutex_lock(&tgt->ltd_fid_mutex);
- if (tgt == NULL || tgt->ltd_active == 0 || tgt->ltd_exp == NULL)
+ if (tgt->ltd_active == 0 || tgt->ltd_exp == NULL)
GOTO(out, rc = -ENODEV);
/*
GOTO(out, rc = -ENODEV);
/*
struct lmv_tgt_desc *tgt;
tgt = lmv_find_target(lmv, fid);
struct lmv_tgt_desc *tgt;
tgt = lmv_find_target(lmv, fid);
+ if (IS_ERR(tgt))
+ return tgt;
+
op_data->op_mds = tgt->ltd_idx;
return tgt;
op_data->op_mds = tgt->ltd_idx;
return tgt;