From patchwork Fri Mar 9 13:15:55 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Chengguang Xu X-Patchwork-Id: 10270567 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 1450960236 for ; Fri, 9 Mar 2018 13:16:14 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 032A129DE7 for ; Fri, 9 Mar 2018 13:16:14 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id EBF7929DE9; Fri, 9 Mar 2018 13:16:13 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6EF7829DE7 for ; Fri, 9 Mar 2018 13:16:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751122AbeCINQM (ORCPT ); Fri, 9 Mar 2018 08:16:12 -0500 Received: from mout.gmx.net ([212.227.15.15]:40063 "EHLO mout.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751086AbeCINQM (ORCPT ); Fri, 9 Mar 2018 08:16:12 -0500 Received: from juanniu018037.ss.mogujie.org ([122.225.81.134]) by mail.gmx.com (mrgmx002 [212.227.17.184]) with ESMTPSA (Nemesis) id 0MGjL7-1eqDHI3q65-00Db9c; Fri, 09 Mar 2018 14:16:06 +0100 From: Chengguang Xu To: linux-xfs@vger.kernel.org Cc: darrick.wong@oracle.com, Chengguang Xu Subject: [RFC][PATCH] xfs: adjust size/used/avail information for quota-df Date: Fri, 9 Mar 2018 21:15:55 +0800 Message-Id: <1520601355-180600-1-git-send-email-cgxu519@gmx.com> X-Mailer: git-send-email 1.8.3.1 MIME-Version: 1.0 X-Provags-ID: V03:K0:ADFtgkKZYL5bWCGn6fJ5Hlua2Q3/FbBaIN9xIdTVNB3JOS61PAF gFAE4n1hZ5TtKtngSXAwrCgD6wDwuMzfr8JrCss4NIOrBxydhLZcwyfNySkLC8LvIJ034qp kWyuKxwQ+e5QJAOZURBohLTT/pvlWyiQb6V7R1jvt4bwiQIRD1cnF/WJ/3jSgVaUcBAlWuU puvI3q6VP9Dmuhly79G5w== X-UI-Out-Filterresults: notjunk:1; V01:K0:kaBY1/nOnKQ=:c1Qzttuw7SjjDuZq9DhzF/ 2L/RGkEq+8ID6I+Bh/xba+w79db5sYQGlYazGhEjMksvaG5K2UmlgubuBQQm1ZN9xM14eUNCR Ni2g5+X4zkrqf2wVb3d7mzVEP/9Loxn4ETAi2zDaVgiA+lf4YKd0qZ9fS2dBsywc0vIsm1Sgk S35KbVWB3vLRwcHuzpNqTEZkKZBZ49rbn8OJMgpqsOsB2S8DEai0NvPXURyrO3W7IYP2zkFx+ oLYvIDn/H1Hxz7EHgEQUNOSzBUQ51myswSGwy3pGOOW49r4IlZFga/PxP/95Hw9vFgpB6d3Kn VyI1kHkQAYgrJvKIh5G8YhPtNbnVd024sPy95JA3Lx/PMeD89xvqzg9Be0lnJM2Yhn2y1AbFa YONk4laQy42+f0z4YXmdeEEdaxgOgpgJNjmpgFIpBZ+CZQKyUvPApuhZoicZXacGX2vk/ViZ2 G64BEWbOm0vmSnZjyofJijOcodQQG4YRxWsz72KPzTixIWva6+dGpGroUqL1eUH7S7yptbgD2 E3xVXnKH6kU2TpONqK5pbVJWiCQyWaV5J7VIFv7vU31kNGI0qr/lPZYvv+tViU71su+0XDF3k crqWQoHygSUPle3LdGPeGh5VWLs0pc0ZOAyapQJgie+aYeL7ud14mTyrd7vVH9ZtCzTcSNfR+ hCo9/GuBeCK9gsx6aCK/SLFsHm/33dS2eqfMCBwVvBzHn+3JXgZp6U3dVGy3pAZrZ+7P/SPvM PBoDHAS5TuZdtIL2BCXkr5z5/KOpJge3j77Ka3rQ1FAMf+KqUtQ2X24S5LERHIzWZL8Gzyerm QEO3moHYNl5qLZUUBn1VFKeFsmTXuhSLEm9Oz1/Cx/gn2tJYaY= Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP In order to more accurately reflect size/used/avail information for quota-df, slightly adjust related counting logic. Signed-off-by: Chengguang Xu --- 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; } }