X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lustre%2Fosc%2Fosc_quota.c;h=a0aaae784515a0567dbb5fe36563667dfaa97074;hb=af49e96b95909f470757890f34da760b8af3c9a8;hp=d8179537b2bcd5855525a07537c129455d9e6197;hpb=a00a07567d4909251e58900a9e5ea27157960fd4;p=fs%2Flustre-release.git diff --git a/lustre/osc/osc_quota.c b/lustre/osc/osc_quota.c index d817953..a0aaae7 100644 --- a/lustre/osc/osc_quota.c +++ b/lustre/osc/osc_quota.c @@ -23,12 +23,14 @@ /* * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. * - * Copyright (c) 2012, 2015, Intel Corporation. + * Copyright (c) 2012, 2017, Intel Corporation. * * Code originally extracted from quota directory */ #include +#include + #include "osc_internal.h" static inline struct osc_quota_info *osc_oqi_alloc(u32 id) @@ -73,6 +75,8 @@ static inline u32 md_quota_flag(int qtype) return OBD_MD_FLUSRQUOTA; case GRPQUOTA: return OBD_MD_FLGRPQUOTA; + case PRJQUOTA: + return OBD_MD_FLPRJQUOTA; default: return 0; } @@ -85,12 +89,14 @@ static inline u32 fl_quota_flag(int qtype) return OBD_FL_NO_USRQUOTA; case GRPQUOTA: return OBD_FL_NO_GRPQUOTA; + case PRJQUOTA: + return OBD_FL_NO_PRJQUOTA; default: return 0; } } -int osc_quota_setdq(struct client_obd *cli, const unsigned int qid[], +int osc_quota_setdq(struct client_obd *cli, __u64 xid, const unsigned int qid[], u64 valid, u32 flags) { int type; @@ -98,9 +104,20 @@ int osc_quota_setdq(struct client_obd *cli, const unsigned int qid[], ENTRY; - if ((valid & (OBD_MD_FLUSRQUOTA | OBD_MD_FLGRPQUOTA)) == 0) + if ((valid & (OBD_MD_FLALLQUOTA)) == 0) RETURN(0); + mutex_lock(&cli->cl_quota_mutex); + /* 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, rc); + + if (cli->cl_quota_last_xid < xid) + cli->cl_quota_last_xid = xid; + for (type = 0; type < LL_MAXQUOTAS; type++) { struct osc_quota_info *oqi; @@ -147,6 +164,8 @@ int osc_quota_setdq(struct client_obd *cli, const unsigned int qid[], } } +out_unlock: + mutex_unlock(&cli->cl_quota_mutex); RETURN(rc); } @@ -226,6 +245,8 @@ int osc_quota_setup(struct obd_device *obd) int i, type; ENTRY; + mutex_init(&cli->cl_quota_mutex); + for (type = 0; type < LL_MAXQUOTAS; type++) { cli->cl_quota_hash[type] = cfs_hash_create("QUOTA_HASH", HASH_QUOTA_CUR_BITS,