@@ -119,10 +119,17 @@ int osc_quota_setdq(struct client_obd *cli, u64 xid, const unsigned int qid[],
return 0;
mutex_lock(&cli->cl_quota_mutex);
- if (cli->cl_quota_last_xid > xid)
+ /* still mark the quots is running out for the old request, because it
+ * could be processed after the new request at OST, the side effect is
+ * the following request will be processed synchronously, but it will
+ * not break the quota enforcement.
+ */
+ if (cli->cl_quota_last_xid > xid && !(flags & OBD_FL_NO_QUOTA_ALL))
goto out_unlock;
- cli->cl_quota_last_xid = xid;
+ if (cli->cl_quota_last_xid < xid)
+ cli->cl_quota_last_xid = xid;
+
for (type = 0; type < MAXQUOTAS; type++) {
struct osc_quota_info *oqi;
@@ -998,6 +998,9 @@ enum obdo_flags {
OBD_FL_CKSUM_T10IP4K |
OBD_FL_CKSUM_T10CRC512 |
OBD_FL_CKSUM_T10CRC4K),
+
+ OBD_FL_NO_QUOTA_ALL = OBD_FL_NO_USRQUOTA | OBD_FL_NO_GRPQUOTA |
+ OBD_FL_NO_PRJQUOTA,
};
/*