- struct ptlrpc_request *req = mdt_info_req(info);
- char *client = libcfs_nid2str(req->rq_peer.nid);
- struct mdt_export_data *med = mdt_req2med(req);
- struct obd_device *obd = req->rq_export->exp_obd;
- struct obd_connect_data *data, *reply;
- int rc = 0, remote;
- ENTRY;
-
- data = req_capsule_client_get(info->mti_pill, &RMF_CONNECT_DATA);
- reply = req_capsule_server_get(info->mti_pill, &RMF_CONNECT_DATA);
- if (data == NULL || reply == NULL)
- RETURN(-EFAULT);
-
- if (!req->rq_auth_gss || req->rq_auth_usr_mdt) {
- med->med_rmtclient = 0;
- reply->ocd_connect_flags &= ~OBD_CONNECT_RMT_CLIENT;
- RETURN(0);
- }
-
- remote = data->ocd_connect_flags & OBD_CONNECT_RMT_CLIENT;
-
- if (remote) {
- med->med_rmtclient = 1;
- if (!req->rq_auth_remote)
- CWARN("client (local realm) %s -> target %s asked "
- "to be remote!\n", client, obd->obd_name);
- } else if (req->rq_auth_remote) {
- med->med_rmtclient = 1;
- CWARN("client (remote realm) %s -> target %s forced "
- "to be remote!\n", client, obd->obd_name);
- }
-
- if (med->med_rmtclient) {
- down(&med->med_idmap_sem);
- if (!med->med_idmap)
- med->med_idmap = lustre_idmap_init();
- up(&med->med_idmap_sem);
-
- if (IS_ERR(med->med_idmap)) {
- long err = PTR_ERR(med->med_idmap);
-
- med->med_idmap = NULL;
- CERROR("client %s -> target %s "
- "failed to init idmap [%ld]!\n",
- client, obd->obd_name, err);
- RETURN(err);
- } else if (!med->med_idmap) {
- CERROR("client %s -> target %s "
- "failed to init(2) idmap!\n",
- client, obd->obd_name);
- RETURN(-ENOMEM);
- }
-
- reply->ocd_connect_flags &= ~OBD_CONNECT_LCL_CLIENT;
- CDEBUG(D_SEC, "client %s -> target %s is remote.\n",
- client, obd->obd_name);
-
- /* NB, MDS_CONNECT establish root idmap too! */
- rc = mdt_handle_idmap(info);
- } else {
- if (req->rq_auth_uid == INVALID_UID) {
- CERROR("client %s -> target %s: user is not "
- "authenticated!\n", client, obd->obd_name);
- RETURN(-EACCES);
- }
- reply->ocd_connect_flags &= ~OBD_CONNECT_RMT_CLIENT;
- }
-
- RETURN(rc);
+ struct ptlrpc_request *req = tgt_ses_req(tsi);
+ struct mdt_export_data *med = mdt_req2med(req);
+ struct obd_export *exp = req->rq_export;
+ char *client = libcfs_nid2str(req->rq_peer.nid);
+ int rc = 0;
+ ENTRY;
+
+ if (exp_connect_rmtclient(exp)) {
+ mutex_lock(&med->med_idmap_mutex);
+ if (!med->med_idmap)
+ med->med_idmap = lustre_idmap_init();
+ mutex_unlock(&med->med_idmap_mutex);
+
+ if (IS_ERR(med->med_idmap)) {
+ long err = PTR_ERR(med->med_idmap);
+
+ med->med_idmap = NULL;
+ CERROR("%s: client %s -> target %s "
+ "failed to init idmap [%ld]!\n",
+ tgt_name(tsi->tsi_tgt), client,
+ tgt_name(tsi->tsi_tgt), err);
+ RETURN(err);
+ } else if (!med->med_idmap) {
+ CERROR("%s: client %s -> target %s "
+ "failed to init(2) idmap!\n",
+ tgt_name(tsi->tsi_tgt), client,
+ tgt_name(tsi->tsi_tgt));
+ RETURN(-ENOMEM);
+ }
+
+ CDEBUG(D_SEC, "%s: client %s -> target %s is remote.\n",
+ tgt_name(tsi->tsi_tgt), client,
+ tgt_name(tsi->tsi_tgt));
+ /* NB, MDS_CONNECT establish root idmap too! */
+ rc = mdt_handle_idmap(tsi);
+ }
+ RETURN(rc);