----- Original Message -----
> This is a revised version of the patches required to properly fix the
> fallocate quota issue described in bz1174295
> 
> patch1: This patch supplies gfs2_quota_check() with the number of blocks
>       the caller intends to allocate in the current operation, resulting
>       in a more accurate quota check.
> 
> patch2: gfs2_quota_check() and gfs2_inplace_reserve() return the number
>       of blocks available subject to quota limits and rgrp size
>       respectively. The difference from previous versions of this patch
>       is that we return the available blocks even on success.
> 
> patch3: The fallocate() function uses the features of patch2 to determine
>       how many total blocks are available for allocation and uses them
>       right away, instead of guessing inefficiently.
> 
> The behavior of quota enforcement is altered by this patchset.
> i.   Quotas are exceeded (a warning message is also issued to syslog) before
>      the actual usage blocks exceed the imposed limit. In fact, the actual
>      usage can never exceed the limit. Whenever it is determined that the
>      completion of an operation will cause a quota to exceed its limit, such
>      an operation is aborted with -EDQUOT and a 'quota exceeded' message is
>      dispatched.
> ii.  The gfs2_write_calc_reserv()/calc_max_reserv() functions are used to
>      map between available blocks and the data bytes that can be written
>      using them. Typically, for large files, some blocks are used up for
>      metadata and only the remaining blocks can be used for data. Example:
>      To write only a handful of bytes that would easily fit in one block, we
>      might have to allocate an extra bunch of intermediate metadata blocks.
>      If we had only 1 block left in our allotted quota, this operation would
>      likely fail.
> 
> The functions mentioned in ii. are not very efficient. They always compute
> the worst case number of extra blocks required and it is often the case that
> not all those extra blocks are used. We need to find a better algorithm to
> get a tighter estimate on the blocks needed for a given number of bytes.
> 
> I've run some basic tests and things seem to be holding up. The failing case
> in bz1174295 is fixed using this patchset. I'll do test build and pass it on
> to Nate to test with.
> 
> Abhi Das (3):
>   gfs2: perform quota checks against allocation parameters
>   gfs2: allow quota_check and inplace_reserve to return available blocks
>   gfs2: allow fallocate to max out quotas/fs efficiently
> 
>  fs/gfs2/aops.c   |  6 ++---
>  fs/gfs2/bmap.c   |  2 +-
>  fs/gfs2/file.c   | 75
>  ++++++++++++++++++++++++++++++++++++++------------------
>  fs/gfs2/incore.h |  3 ++-
>  fs/gfs2/inode.c  | 18 ++++++++------
>  fs/gfs2/quota.c  | 40 ++++++++++++++++++++++--------
>  fs/gfs2/quota.h  |  8 +++---
>  fs/gfs2/rgrp.c   | 12 +++++++--
>  fs/gfs2/rgrp.h   |  6 +++--
>  fs/gfs2/xattr.c  |  2 +-
>  10 files changed, 117 insertions(+), 55 deletions(-)
> 
> --
> 1.8.1.4

Looks good to me.
ACK to the series.

Regards,

Bob Peterson
Red Hat File Systems

Reply via email to