[Cluster-devel] [GFS2 PATCH 1/4] gfs2: check quota for blocks we're about to allocate

Abhijith Das adas at redhat.com
Thu Feb 12 18:23:59 UTC 2015



----- Original Message -----
> From: "Andrew Price" <anprice at redhat.com>
> To: "Abhi Das" <adas at redhat.com>, cluster-devel at redhat.com
> Sent: Thursday, February 12, 2015 12:12:50 PM
> Subject: Re: [Cluster-devel] [GFS2 PATCH 1/4] gfs2: check quota for blocks we're about to allocate
> 
> Hi Abhi,
> 
> On 12/02/15 16:54, Abhi Das wrote:
> > This patch allows gfs2_quota_check() to take an extra argument
> > called 'exp_change'. Prior to any allocation, gfs2_quota_check()
> > or gfs2_quota_lock_check() is called with exp_change containing
> > the number of blocks we expect to allocate in this operation.
> > gfs2_quota_check() will add this number to the current usage and
> > check the sum against the quota warns and limits and fail the
> > operation if necessary.
> >
> <snip>
> > -int gfs2_quota_check(struct gfs2_inode *ip, kuid_t uid, kgid_t gid)
> > +int gfs2_quota_check(struct gfs2_inode *ip, kuid_t uid, kgid_t gid, s64
> > exp_change)
> >   {
> >   	struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
> >   	struct gfs2_quota_data *qd;
> > @@ -1116,7 +1116,7 @@ int gfs2_quota_check(struct gfs2_inode *ip, kuid_t
> > uid, kgid_t gid)
> >
> >   		value = (s64)be64_to_cpu(qd->qd_qb.qb_value);
> >   		spin_lock(&qd_lock);
> > -		value += qd->qd_change;
> > +		value += qd->qd_change + exp_change;
> 
> So I guess I don't understand why we need both qd_change and exp_change
> now. What sets qd_change, and why can't it be accurate (i.e. equal to
> exp_change) when we need it to be?
> 
> Andy
> 

qd_change gets set when gfs2_quota_change() is called... after the current operation has
completed to account for the block allocs/deallocs that have been done during that operation.
Once gfs2_quota_change() is called, that quota change is basically set in stone and do_qc()
goes ahead and syncs it to the local quota_change file and eventually it'll get synced to
the global quota file.

So, when quota_check() is called, the qd_change value (if not synced yet) will contain the
usage as of the previous operation. Does that make sense?

Cheers!
--Abhi




More information about the Cluster-devel mailing list