+void mds_update_capa_stat(struct obd_device *obd, int stat)
+{
+ struct mds_obd *mds = &obd->u.mds;
+
+ spin_lock(&mds_capa_lock);
+ mds->mds_capa_stat = stat;
+ spin_unlock(&mds_capa_lock);
+}
+
+void mds_update_capa_timeout(struct obd_device *obd, unsigned long timeout)
+{
+ struct mds_obd *mds = &obd->u.mds;
+
+ spin_lock(&mds_capa_lock);
+ mds->mds_capa_timeout = timeout;
+ /* XXX: update all capabilities in cache if their expiry too long */
+ spin_unlock(&mds_capa_lock);
+}
+
+int mds_update_capa_key_timeout(struct obd_device *obd, unsigned long timeout)
+{
+ struct mds_obd *mds = &obd->u.mds;
+ struct timeval tv;
+ int rc;
+ ENTRY;
+
+ do_gettimeofday(&tv);
+
+ spin_lock(&mds_capa_lock);
+ mds->mds_capa_key_timeout = timeout;
+ if (CUR_CAPA_KEY_EXPIRY(mds) < tv.tv_sec + timeout) {
+ spin_unlock(&mds_capa_lock);
+ RETURN(0);
+ }
+ spin_unlock(&mds_capa_lock);
+
+ rc = mds_update_capa_key(obd, &CUR_MDS_CAPA_KEY(mds), 1);
+
+ RETURN(rc);
+}
+
+static void mds_capa_reverse_map(struct mds_export_data *med,
+ struct lustre_capa *capa)
+{
+ uid_t uid;
+
+ if (!med->med_remote) {
+ /* when not remote uid, ruid == uid */
+ capa->lc_ruid = capa->lc_uid;
+ return;
+ }
+
+ ENTRY;
+ uid = mds_idmap_lookup_uid(med->med_idmap, 1, capa->lc_uid);
+ if (uid == MDS_IDMAP_NOTFOUND)
+ uid = med->med_nllu;
+ capa->lc_ruid = uid;
+ capa->lc_flags |= CAPA_FL_REMUID;
+ EXIT;
+}
+
+
+int mds_pack_capa(struct obd_device *obd, struct mds_export_data *med,
+ struct mds_body *req_body, struct lustre_capa *req_capa,
+ struct ptlrpc_request *req, int *offset, struct mds_body *body)