Re: quotactl(2) units of reported sizes on ZFS

From: Norman Gray <gray_at_nxg.name>
Date: Mon, 01 Jul 2024 15:45:50 UTC
Dear list,

This might now be semi-solved?

Looping back to the thread excerpted below, I realise belatedly that statvfs(3) can give some information on this.

statvfs fills in a struct statvfs, which, according to statvfs(3) on FreeBSD, includes members

           f_frsize   The size in bytes of the minimum unit of allocation on
                      this file system.  (This corresponds to the f_bsize
                      member of struct statfs.)

           f_bsize    The preferred length of I/O requests for files on this
                      file system.  (Corresponds to the f_iosize member of
                      struct statfs.)

According to POSIX Issue 7 (2018) [1], these are

    unsigned long f_bsize    File system block size.
    unsigned long f_frsize   Fundamental file system block size.

As usual, POSIX is being a _little_ bit non-committal here!

Member f_frsize is 512 when I call this on FreeBSD (f_bsize is a lot bigger).

Thus, it _appears_ that:

  * neither FreeBSD manpages nor POSIX specify what the block size is for quotactl(2) responses, as far as I can see (because POSIX doesn't talk about quotas), and
  * neither of them explicitly say what units are used for struct dqblk's dqb_curblocks member and the like, and neither of them points towards statvfs,

...but the wording of statvfs(3) in both cases is consistent with f_frsize being those units.

That's not really satisfactory, but it's close enough to Documentation, for me, for the moment.  Onward and upward...

Incidentally, on macOS, sys/quota.h defines the (non-POSIX) struct dqblk, that quotactl fills in, to have no field dqb_curblocks, but instead dqb_curbytes, which seems a lot more sensible.

Best wishes,

Norman


[1] Issue 7 is at <https://pubs.opengroup.org/onlinepubs/9699919799/toc.htm>; Issue 8 doesn't seem to differ in any respects relevant to this question.


On 5 Jun 2024, at 9:48, Norman Gray wrote:

> Dag-Erling, hello.
>
> On 4 Jun 2024, at 23:17, Dag-Erling Smørgrav wrote:
>
>> Norman Gray <gray@nxg.name> writes:
>>> The call quotactl(2) reports quota sizes in units of 'blocks', but how
>>> big is a block?  Traditionally, of course, the answer is 512B, [...]
>>
>> You could simply have stopped there, it's a POSIX requirement.
>
> That's an interesting direction to come from -- thanks!
>
> Can you point to chapter and verse, though?  Looking at [1], and specifically the specification of the contents of sys/stat.h [2], I find:
>
>> The unit for the st_blocks member of the stat structure is not defined within POSIX.1-2017. In some implementations it is 512 bytes. It may differ on a file system basis. There is no correlation between values of the st_blocks and st_blksize, and the f_bsize (from <sys/statvfs.h>) structure members.
>
> That's stat.h, of course, rather than anything to do with quotas specifically.  But POSIX doesn't mention quotas (not surprisingly), so if the quotactl manpage were going to silently adopt a POSIX unit definition, it's stat.h I'd expect it to come from.
>
> Individual utilities -- for example `ulimit` [3] or `df` -- document that one or other argument is in units of 512B 'blocks', but that's a user-interface issue.
>
> Best wishes,
>
> Norman
>
>
>
> [1] The Open Group Base Specifications Issue 7, 2018 edition <https://pubs.opengroup.org/onlinepubs/9699919799/toc.htm>
> [2] https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_stat.h.html
> [3] https://pubs.opengroup.org/onlinepubs/9699919799/utilities/ulimit.html
>
>
>
> -- 
> Norman Gray  :  https://nxg.me.uk
-- 
Norman Gray  :  https://nxg.me.uk