- int rc;
- struct ptlrpc_request *request;
- struct mds_rec_setattr *rec;
-
- request = ptlrpc_prep_req(peer, MDS_REINT, 0, NULL, sizeof(*rec), NULL);
- if (!request) {
- CERROR("mdc request: cannot pack\n");
- return -ENOMEM;
- }
-
- rec = mds_req_tgt(request->rq_req.mds);
- mds_setattr_pack(rec, inode, iattr);
- request->rq_req.mds->opcode = HTON__u32(REINT_SETATTR);
- request->rq_replen =
- sizeof(struct ptlrep_hdr) + sizeof(struct mds_rep);
-
- rc = mdc_reint(peer, request);
- if (rc)
- return rc;
-
- if (rep) {
- *rep = request->rq_rep.mds;
- }
- if (hdr) {
- *hdr = request->rq_rephdr;
- }
-
- return 0;
+ struct ptlrpc_request *req;
+ struct mds_rec_setattr *rec;
+ struct mdc_rpc_lock *rpc_lock;
+ struct obd_device *obd = exp->exp_obd;
+ int rc, bufcount = 2, size[4] = {0, sizeof(*rec), ealen, ea2len};
+ ENTRY;
+
+ LASSERT(iattr != NULL);
+
+ size[0] = mdc_get_secdesc_size();
+ if (ealen > 0) {
+ bufcount++;
+ if (ea2len > 0)
+ bufcount++;
+ }
+
+ req = ptlrpc_prep_req(class_exp2cliimp(exp), LUSTRE_MDS_VERSION,
+ MDS_REINT, bufcount, size, NULL);
+ if (req == NULL)
+ RETURN(-ENOMEM);
+
+ mdc_pack_secdesc(req, size[0]);
+
+ if (iattr->ia_valid & ATTR_FROM_OPEN) {
+ req->rq_request_portal = MDS_SETATTR_PORTAL; //XXX FIXME bug 249
+ rpc_lock = obd->u.cli.cl_setattr_lock;
+ } else {
+ rpc_lock = obd->u.cli.cl_rpc_lock;
+ }
+
+ if (iattr->ia_valid & (ATTR_MTIME | ATTR_CTIME))
+ CDEBUG(D_INODE, "setting mtime %lu, ctime %lu\n",
+ LTIME_S(iattr->ia_mtime), LTIME_S(iattr->ia_ctime));
+ mdc_setattr_pack(req->rq_reqmsg, 1, data, iattr, ea, ealen,
+ ea2, ea2len);
+
+ size[0] = sizeof(struct mds_body);
+ req->rq_replen = lustre_msg_size(1, size);
+
+ rc = mdc_reint(req, rpc_lock, LUSTRE_IMP_FULL);
+ *request = req;
+ if (rc == -ERESTARTSYS)
+ rc = 0;
+
+ RETURN(rc);