}
lmv_set_timeouts(obd);
-
class_export_put(exp);
return 0;
if (!lmv->connected)
class_export_put(exp);
rc = class_disconnect(exp, 0);
+ if (lmv->refcount == 0)
+ lmv->connected = 0;
RETURN(rc);
}
for (i = 0; i < lmv->desc.ld_tgt_count; i++) {
int err;
- err = obd_iocontrol(cmd, lmv->tgts[i].ltd_exp,
- len, karg, uarg);
+ if (lmv->tgts[i].ltd_exp == NULL) {
+ CWARN("%s: NULL export for %d\n", obddev->obd_name, i);
+ continue;
+ }
+
+ err = obd_iocontrol(cmd, lmv->tgts[i].ltd_exp, len, karg, uarg);
if (err) {
if (lmv->tgts[i].active) {
CERROR("error: iocontrol MDC %s on MDT"
RETURN(rc);
for (i = 0; i < lmv->desc.ld_tgt_count; i++) {
+ if (lmv->tgts[i].ltd_exp == NULL) {
+ CWARN("%s: NULL export for %d\n", obd->obd_name, i);
+ continue;
+ }
+
rc = obd_statfs(lmv->tgts[i].ltd_exp->exp_obd, &temp, max_age);
if (rc) {
CERROR("can't stat MDS #%d (%s)\n", i,
for (i = 0; i < obj->objcount; i++) {
+ if (lmv->tgts[i].ltd_exp == NULL) {
+ CWARN("%s: NULL export for %d\n",
+ obd->obd_name, i);
+ continue;
+ }
+
/* skip master obj. */
if (fid_equal(&obj->fid, &obj->objs[i].fid))
continue;
obj = lmv_grab_obj(obd, pfid);
if (obj) {
/* directory is splitted. look for right mds for this name. */
- mds = raw_name2idx(obj->objcount, name, len);
+ mds = raw_name2idx(obj->hashtype, obj->objcount, name, len);
+ mds = obj->objs[mds].fid.mds;
lmv_put_obj(obj);
}
rc = md_change_cbdata(lmv->tgts[mds].ltd_exp, cfid, it, data);
struct lmv_obd *lmv = &obd->u.lmv;
struct mds_body *body;
struct lmv_obj *obj;
- int rc, mds;
+ int rc, mds, loop = 0;
ENTRY;
rc = lmv_check_connect(obd);
if (!lmv->desc.ld_active_tgt_count)
RETURN(-EIO);
repeat:
+ LASSERT(++loop <= 2);
obj = lmv_grab_obj(obd, &op_data->fid1);
if (obj) {
- mds = raw_name2idx(obj->objcount, op_data->name,
+ mds = raw_name2idx(obj->hashtype, obj->objcount, op_data->name,
op_data->namelen);
op_data->fid1 = obj->objs[mds].fid;
lmv_put_obj(obj);
LASSERT(mea != NULL);
for (i = 0; i < mea->mea_count; i++) {
- if (lmv->tgts[i].ltd_exp == NULL)
- continue;
-
memset(&data2, 0, sizeof(data2));
data2.fid1 = mea->mea_fids[i];
mds = data2.fid1.mds;
+ if (lmv->tgts[mds].ltd_exp == NULL)
+ continue;
+
rc = md_enqueue(lmv->tgts[mds].ltd_exp, locktype, it, lockmode,
&data2, lockh + i, lmm, lmmsize, cb_completion,
cb_blocking, cb_data);
if (obj) {
/* directory is splitted. look for right mds for this
* name */
- mds = raw_name2idx(obj->objcount, (char *)data->name,
- data->namelen);
+ mds = raw_name2idx(obj->hashtype, obj->objcount,
+ (char *)data->name, data->namelen);
data->fid1 = obj->objs[mds].fid;
lmv_put_obj(obj);
}
struct obd_device *obd = exp->exp_obd;
struct lmv_obd *lmv = &obd->u.lmv;
struct ll_fid rfid = *fid;
- int rc, mds = fid->mds;
+ int rc, mds = fid->mds, loop = 0;
struct mds_body *body;
struct lmv_obj *obj;
ENTRY;
if (rc)
RETURN(rc);
repeat:
+ LASSERT(++loop <= 2);
obj = lmv_grab_obj(obd, fid);
if (obj) {
/* directory is splitted. look for right mds for this name */
- mds = raw_name2idx(obj->objcount, filename, namelen - 1);
+ mds = raw_name2idx(obj->hashtype, obj->objcount, filename, namelen - 1);
rfid = obj->objs[mds].fid;
lmv_put_obj(obj);
}
(unsigned long)rfid.mds, (unsigned long)rfid.id,
(unsigned long)rfid.generation);
- rc = md_getattr_name(lmv->tgts[mds].ltd_exp, &rfid, filename,
+ rc = md_getattr_name(lmv->tgts[rfid.mds].ltd_exp, &rfid, filename,
namelen, valid, ea_size, request);
if (rc == 0) {
/* this could be cross-node reference. in this case all we have
/* usual link request */
obj = lmv_grab_obj(obd, &data->fid1);
if (obj) {
- rc = raw_name2idx(obj->objcount, data->name,
+ rc = raw_name2idx(obj->hashtype, obj->objcount, data->name,
data->namelen);
data->fid1 = obj->objs[rc].fid;
lmv_put_obj(obj);
if (obj) {
/* directory is already splitted, so we have to forward request
* to the right MDS */
- mds = raw_name2idx(obj->objcount, (char *)old, oldlen);
+ mds = raw_name2idx(obj->hashtype, obj->objcount, (char *)old, oldlen);
data->fid1 = obj->objs[mds].fid;
CDEBUG(D_OTHER, "forward to MDS #%u (%lu/%lu/%lu)\n", mds,
(unsigned long)obj->objs[mds].fid.mds,
if (obj) {
/* directory is already splitted, so we have to forward request
* to the right MDS */
- mds = raw_name2idx(obj->objcount, (char *)new, newlen);
+ mds = raw_name2idx(obj->hashtype, obj->objcount, (char *)new, newlen);
data->fid2 = obj->objs[mds].fid;
CDEBUG(D_OTHER, "forward to MDS #%u (%lu/%lu/%lu)\n", mds,
(unsigned long)obj->objs[mds].fid.mds,
{
struct obd_device *obd = exp->exp_obd;
struct lmv_obd *lmv = &obd->u.lmv;
- int rc = 0, i = data->fid1.mds;
struct ptlrpc_request *req;
struct mds_body *body;
struct lmv_obj *obj;
+ int rc = 0, i;
ENTRY;
rc = lmv_check_connect(obd);
for (i = 0; i < obj->objcount; i++) {
data->fid1 = obj->objs[i].fid;
- rc = md_setattr(lmv->tgts[i].ltd_exp, data, iattr,
- ea, ealen, ea2, ea2len, &req);
+ rc = md_setattr(lmv->tgts[data->fid1.mds].ltd_exp, data,
+ iattr, ea, ealen, ea2, ea2len, &req);
if (fid_equal(&obj->fid, &obj->objs[i].fid)) {
/* this is master object and this request should
}
lmv_put_obj(obj);
} else {
- LASSERT(i < lmv->desc.ld_tgt_count);
- rc = md_setattr(lmv->tgts[i].ltd_exp, data, iattr, ea,
- ealen, ea2, ea2len, request);
+ LASSERT(data->fid1.mds < lmv->desc.ld_tgt_count);
+ rc = md_setattr(lmv->tgts[data->fid1.mds].ltd_exp, data,
+ iattr, ea, ealen, ea2, ea2len, request);
if (rc == 0) {
body = lustre_msg_buf((*request)->rq_repmsg, 0,
sizeof(*body));
LASSERT(body != NULL);
- LASSERT(body->mds == i);
+ LASSERT(body->mds == data->fid1.mds);
}
}
RETURN(rc);
if (rc)
RETURN(rc);
- rc = md_sync(lmv->tgts[0].ltd_exp, fid, request);
+ rc = md_sync(lmv->tgts[fid->mds].ltd_exp, fid, request);
RETURN(rc);
}
LASSERT(mea != NULL);
for (i = 0; i < mea->mea_count; i++) {
- if (lmv->tgts[i].ltd_exp == NULL)
- continue;
-
memset(&data2, 0, sizeof(data2));
data2.fid1 = mea->mea_fids[i];
data2.create_mode = MDS_MODE_DONT_LOCK | S_IFDIR;
mds = data2.fid1.mds;
+
+ if (lmv->tgts[mds].ltd_exp == NULL)
+ continue;
+
rc = md_unlink(lmv->tgts[mds].ltd_exp, &data2, req);
CDEBUG(D_OTHER, "unlink slave %lu/%lu/%lu -> %d\n",
(unsigned long) mea->mea_fids[i].mds,
obj = lmv_grab_obj(obd, &data->fid1);
if (obj) {
- i = raw_name2idx(obj->objcount, data->name,
+ i = raw_name2idx(obj->hashtype, obj->objcount, data->name,
data->namelen);
data->fid1 = obj->objs[i].fid;
lmv_put_obj(obj);
rc = lmv_check_connect(obd);
if (rc)
RETURN(ERR_PTR(rc));
+#warning "we need well-desgined readdir() implementation to remove this mess"
obd = lmv->tgts[0].ltd_exp->exp_obd;
EXIT;
return obd;
RETURN(0);
for (i = 0; i < lmv->desc.ld_tgt_count; i++) {
+ if (lmv->tgts[i].ltd_exp == NULL) {
+ CWARN("%s: NULL export for %d\n", obd->obd_name, i);
+ continue;
+ }
+
rc = obd_init_ea_size(lmv->tgts[i].ltd_exp, easize, cookiesize);
if (rc) {
CERROR("obd_init_ea_size() failed on MDT target %d, "
{
struct obd_device *obd = exp->exp_obd;
struct lmv_obd *lmv = &obd->u.lmv;
- struct mea *mea;
int i, c, rc = 0;
+ struct mea *mea;
struct ll_fid mfid;
+ int lcount;
ENTRY;
rc = lmv_check_connect(obd);
mea = (struct mea *)*ea;
if (!mea->mea_count || mea->mea_count > lmv->desc.ld_tgt_count)
mea->mea_count = lmv->desc.ld_tgt_count;
+ mea->mea_magic = MEA_MAGIC_ALL_CHARS;
mea->mea_master = -1;
-
- for (i = 0, c = 0; c < mea->mea_count &&
- i < lmv->desc.ld_tgt_count; i++) {
+ lcount = lmv->desc.ld_tgt_count;
+ for (i = 0, c = 0; c < mea->mea_count && i < lcount; i++) {
struct lov_stripe_md obj_md;
struct lov_stripe_md *obj_mdp = &obj_md;
c++;
CDEBUG(D_OTHER, "dirobj at mds %d: "LPU64"/%u\n",
i, oa->o_id, oa->o_generation);
- CDEBUG(D_ERROR, "dirobj at mds %d: "LPU64"/%u\n",
- i, oa->o_id, oa->o_generation);
}
LASSERT(c == mea->mea_count);
CDEBUG(D_OTHER, "%d dirobjects created\n", (int) mea->mea_count);