Le Thu, 12 Dec 2024 12:25:47 -0800 "Darrick J. Wong" <djwong@xxxxxxxxxx> écrivait: > Does this recreate the symptoms? > <snip> > # df /mnt /mnt/dir > Filesystem Size Used Avail Use% Mounted on > /dev/sda 20G 420M 20G 3% /mnt > /dev/sda 2.0G 0 2.0G 0% /mnt > # fallocate -l 19g /mnt/a > # df /mnt /mnt/dir > Filesystem Size Used Avail Use% Mounted on > /dev/sda 20G 20G 345M 99% /mnt > /dev/sda 2.0G 0 2.0G 0% /mnt > > Clearly, df should be reporting 345M available for both cases, since > we haven't actually used any of project 55's blocks. > > # xfs_io -f -c 'pwrite -S 0x59 0 1m' -c fsync -c 'stat -vvvv' > /mnt/dir/fork wrote 1048576/1048576 bytes at offset 0 > 1 MiB, 256 ops; 0.0008 sec (1.121 GiB/sec and 293915.0402 ops/sec) > fd.path = "/mnt/dir/fork" > fd.flags = non-sync,non-direct,read-write > stat.ino = 134 > stat.type = regular file > stat.size = 1048576 > stat.blocks = 2048 > stat.atime = Thu Dec 12 12:11:06 2024 > stat.mtime = Thu Dec 12 12:11:06 2024 > stat.ctime = Thu Dec 12 12:11:06 2024 > fsxattr.xflags = 0x0 [] > fsxattr.projid = 55 > fsxattr.extsize = 0 > fsxattr.cowextsize = 0 > fsxattr.nextents = 1 > fsxattr.naextents = 0 > dioattr.mem = 0x200 > dioattr.miniosz = 512 > dioattr.maxiosz = 2147483136 > # df /mnt /mnt/dir > Filesystem Size Used Avail Use% Mounted on > /dev/sda 20G 20G 344M 99% /mnt > /dev/sda 2.0G 1.0M 2.0G 1% /mnt > > I think this behavior comes from xfs_fill_statvfs_from_dquot, which > does this: > > limit = blkres->softlimit ? > blkres->softlimit : > blkres->hardlimit; > if (limit && statp->f_blocks > limit) { > statp->f_blocks = limit; > statp->f_bfree = statp->f_bavail = > (statp->f_blocks > blkres->reserved) ? > (statp->f_blocks - blkres->reserved) : 0; > } > > I think the f_bfree/f_bavail assignment is wrong because it doesn't > handle the case where f_bfree was less than (limit - reserved). > > if (limit) { > uint64_t remaining = 0; > > if (statp->f_blocks > limit) > statp->f_blocks = limit; > if (limit > blkres->reserved) > remaining = limit - blkres->reserved; > statp->f_bfree = min(statp->f_bfree, remaining); > statp->f_bavail = min(statp->f_bavail, remaining); > } > > This fixes the df output a bit: > # df /mnt /mnt/dir > Filesystem Size Used Avail Use% Mounted on > /dev/sda 20G 20G 344M 99% /mnt > /dev/sda 2.0G 1.7G 344M 84% /mnt > > Though the "used" column is nonsense now. But I guess that's why > statfs only defines total blocks and free/available blocks. Yep, that looks exactly like the problem we've met. Does the fact that not all folders have project quota change something in that case ? -- ------------------------------------------------------------------------ Emmanuel Florac | Direction technique ------------------------------------------------------------------------ https://intellique.com +33 6 16 30 15 95 ------------------------------------------------------------------------
Attachment:
pgp3XfH6pkiM5.pgp
Description: Signature digitale OpenPGP