int sli_rmi_setmds(const char *name) { struct slashrpc_cservice *csvc; struct sl_resource *res; // struct sl_resm *old; lnet_nid_t nid; /* XXX kill any old MDS and purge any bmap updates being held */ // slconnthr_unwatch(rmi_resm->resm_csvc); // old = rmi_resm; // sl_csvc_disable(old->resm_csvc); nid = libcfs_str2nid(name); if (nid == LNET_NID_ANY) { res = libsl_str2res(name); if (res == NULL) return (SLERR_RES_UNKNOWN); rmi_resm = psc_dynarray_getpos(&res->res_members, 0); } else rmi_resm = libsl_nid2resm(nid); if (sli_rmi_getcsvc(&csvc)) psclog_errorx("error connecting to MDS"); else { slconnthr_watch(sliconnthr, csvc, CSVCF_PING, NULL, NULL); sl_csvc_decref(csvc); } return (0); }
int msl_fcmh_fetch_inode(struct fidc_membh *f) { struct slrpc_cservice *csvc = NULL; struct pscrpc_request *rq = NULL; struct srm_get_inode_req *mq; struct srm_get_inode_rep *mp; struct fcmh_cli_info *fci; int rc; fci = fcmh_2_fci(f); rc = slc_rmc_getcsvc(fci->fci_resm, &csvc); if (rc) goto out; rc = SL_RSX_NEWREQ(csvc, SRMT_GET_INODE, rq, mq, mp); if (rc) goto out; mq->fg = f->fcmh_fg; rc = SL_RSX_WAITREP(csvc, rq, mp); if (rc == 0) rc = mp->rc; if (rc) goto out; FCMH_LOCK(f); msl_fcmh_stash_inode(f, &mp->ino); FCMH_ULOCK(f); out: if (rq) pscrpc_req_finished(rq); if (csvc) sl_csvc_decref(csvc); return (rc); }
/* * Forward a name space operation to a remote MDS first before * replicating the operation locally by our callers. */ int slm_rmm_forward_namespace(int op, struct sl_fidgen *fg, struct sl_fidgen *nfg, char *name, char *newname, uint32_t mode, const struct slash_creds *crp, struct srt_stat *sstb, int32_t to_set) { struct slashrpc_cservice *csvc = NULL; struct pscrpc_request *rq = NULL; struct sl_resm *resm = NULL; struct srm_forward_req *mq; struct srm_forward_rep *mp; struct sl_resource *res; struct sl_site *site; int rc, len, i, vfsid; sl_siteid_t siteid; if (op != SLM_FORWARD_MKDIR && op != SLM_FORWARD_RMDIR && op != SLM_FORWARD_CREATE && op != SLM_FORWARD_UNLINK && op != SLM_FORWARD_RENAME && op != SLM_FORWARD_SETATTR && op != SLM_FORWARD_SYMLINK) return (-PFLERR_NOSYS); rc = slfid_to_vfsid(fg->fg_fid, &vfsid); if (rc) return (rc); siteid = FID_GET_SITEID(fg->fg_fid); site = libsl_siteid2site(siteid); if (site == NULL) return (-EBADF); SITE_FOREACH_RES(site, res, i) { if (res->res_type != SLREST_MDS) continue; resm = psc_dynarray_getpos(&res->res_members, 0); break; } csvc = slm_getmcsvc_wait(resm); if (csvc == NULL) { psclog_info("unable to connect to site %d", siteid); return (-EIO); } rc = SL_RSX_NEWREQ(csvc, SRMT_NAMESPACE_FORWARD, rq, mq, mp); if (rc) goto out; mq->op = op; mq->fg = *fg; if (op == SLM_FORWARD_SETATTR) { mq->to_set = to_set; mq->req.sstb = *sstb; } else strlcpy(mq->req.name, name, sizeof(mq->req.name)); if (op == SLM_FORWARD_RENAME || op == SLM_FORWARD_SYMLINK) { if (op == SLM_FORWARD_RENAME) mq->nfg = *nfg; len = strlen(name) + 1; strlcpy(mq->req.name + len, newname, sizeof(mq->req.name) - len); } if (op == SLM_FORWARD_MKDIR || op == SLM_FORWARD_CREATE || op == SLM_FORWARD_SYMLINK) { mq->mode = mode; mq->creds.scr_uid = crp->scr_uid; mq->creds.scr_gid = crp->scr_gid; } rc = SL_RSX_WAITREP(csvc, rq, mp); if (!rc) rc = mp->rc; if (!rc && sstb) *sstb = mp->attr; out: if (rq) pscrpc_req_finished(rq); if (csvc) sl_csvc_decref(csvc); return (rc); }
int sli_rmi_issue_repl_schedwk(struct sli_repl_workrq *w) { struct slashrpc_cservice *csvc = NULL; struct pscrpc_request *rq = NULL; int rc; if (w->srw_op == SLI_REPLWKOP_REPL) { w->srw_pp->rc = w->srw_status; if (psc_atomic32_inc_getnew(&w->srw_bchrp->ndone) < w->srw_bchrp->total) return (0); } rc = sli_rmi_getcsvc(&csvc); if (rc) goto out; if (w->srw_op == SLI_REPLWKOP_PTRUNC) { struct srm_bmap_ptrunc_req *mq; struct srm_bmap_ptrunc_rep *mp; rc = SL_RSX_NEWREQ(csvc, SRMT_BMAP_PTRUNC, rq, mq, mp); if (rc) goto out; mq->bmapno = w->srw_bmapno; mq->bgen = w->srw_bgen; mq->rc = w->srw_status; mq->fg = w->srw_fg; rc = SL_RSX_WAITREP(csvc, rq, mp); if (rc == 0) rc = mp->rc; } else { struct srm_batch_req *mq; struct srm_batch_rep *mp; struct iovec iov; rc = SL_RSX_NEWREQ(csvc, SRMT_BATCH_RP, rq, mq, mp); if (rc) goto out; mq->opc = SRMT_REPL_SCHEDWK; mq->len = w->srw_bchrp->total * sizeof(*w->srw_pp); mq->bid = w->srw_bchrp->id; iov.iov_base = w->srw_bchrp->buf; iov.iov_len = mq->len; rc = slrpc_bulkclient(rq, BULK_GET_SOURCE, SRMI_BULK_PORTAL, &iov, 1); if (rc == 0) rc = SL_RSX_WAITREP(csvc, rq, mp); if (rc == 0) rc = mp->rc; } if (w->srw_status) psclog_errorx("sent error rc=%d", w->srw_status); out: if (rq) pscrpc_req_finished(rq); if (csvc) sl_csvc_decref(csvc); return (rc); }