In order to more accurately reflect size/used/avail information for quota-df, slightly adjust related counting logic. Signed-off-by: Chengguang Xu <cgxu519@xxxxxxx> --- Hello folks, Recently I’m testing project quota for our container users and found sometimes the result of df command could not exactly represent block/inode usage amount. So I checked the logic in function xfs_qm_statvfs() and I think it might be better if slightly adjusting the counting logic. What do you think? Terms: # Size(F) - The size field in df result of filesystem # Size(Q) - The size field of in df result of pquota-dir # Used(F) - The used field in df result of filesystem # Used(Q) - The used field in df result of pquota-dir # Avail(F) - The avail field in df result of filesystem # Avail(Q) - The avail field in df result of pquota-dir # Used(A) - Actual used Problems that I found. 1) Avail(Q) can be higher than Avail(F) 2) Used(A) can be higher than Used(Q) fs/xfs/xfs_qm_bhv.c | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_qm_bhv.c b/fs/xfs/xfs_qm_bhv.c index 2be6d27..cb2e6c9 100644 --- a/fs/xfs/xfs_qm_bhv.c +++ b/fs/xfs/xfs_qm_bhv.c @@ -38,21 +38,41 @@ limit = dqp->q_core.d_blk_softlimit ? be64_to_cpu(dqp->q_core.d_blk_softlimit) : be64_to_cpu(dqp->q_core.d_blk_hardlimit); - if (limit && statp->f_blocks > limit) { - statp->f_blocks = limit; - statp->f_bfree = statp->f_bavail = - (statp->f_blocks > dqp->q_res_bcount) ? - (statp->f_blocks - dqp->q_res_bcount) : 0; + + if (limit) { + if (limit > dqp->q_res_bcount + statp->f_bavail) + statp->f_blocks = dqp->q_res_bcount + statp->f_bavail; + else + statp->f_blocks = limit; + } else { + statp->f_blocks = dqp->q_res_bcount + statp->f_bavail; + } + + if (dqp->q_res_bcount >= statp->f_blocks) { + statp->f_blocks = dqp->q_res_bcount; + statp->f_bfree = statp->f_bavail = 0; + } else { + statp->f_bfree = statp->f_bavail = statp->f_blocks - dqp->q_res_bcount; } limit = dqp->q_core.d_ino_softlimit ? be64_to_cpu(dqp->q_core.d_ino_softlimit) : be64_to_cpu(dqp->q_core.d_ino_hardlimit); - if (limit && statp->f_files > limit) { - statp->f_files = limit; - statp->f_ffree = - (statp->f_files > dqp->q_res_icount) ? - (statp->f_ffree - dqp->q_res_icount) : 0; + + if (limit) { + if (limit > dqp->q_res_icount + statp->f_ffree) + statp->f_files = dqp->q_res_icount + statp->f_ffree; + else + statp->f_files = limit; + } else { + statp->f_files = dqp->q_res_icount + statp->f_ffree; + } + + if (dqp->q_res_icount >= statp->f_files) { + statp->f_files = dqp->q_res_icount; + statp->f_ffree = 0; + } else { + statp->f_ffree = statp->f_files - dqp->q_res_icount; } } -- 1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html