From patchwork Mon Mar 28 22:24:59 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrey Albershteyn X-Patchwork-Id: 12794292 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 75678C433EF for ; Mon, 28 Mar 2022 22:27:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229753AbiC1W2m (ORCPT ); Mon, 28 Mar 2022 18:28:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57300 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229592AbiC1W2l (ORCPT ); Mon, 28 Mar 2022 18:28:41 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 25E12985BC for ; Mon, 28 Mar 2022 15:27:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1648506419; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=aAP/mR9+1e0i9VIqKYhIwqKJcO8z1uA1zHUKn7fioR8=; b=a0jr5i/kwi/veUmNYYEsNpE6coa8SQcEjjiOChmDQxaUBAXlKK4tElqMjxABwuCTqGkD8N +iJCzJnDOAvlPbwGC4b1FGE399GdV091YqyAeWPVBupLipIrlPU2x7EauD8sUOB2IQkZmK WLE5hztde8AKG70iCdqf9DE+HzK7AEc= Received: from mail-ed1-f71.google.com (mail-ed1-f71.google.com [209.85.208.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-278-WKxFsyMlMu-syZc9w8Z6_g-1; Mon, 28 Mar 2022 18:26:58 -0400 X-MC-Unique: WKxFsyMlMu-syZc9w8Z6_g-1 Received: by mail-ed1-f71.google.com with SMTP id i4-20020aa7c9c4000000b00419c542270dso4034496edt.8 for ; Mon, 28 Mar 2022 15:26:57 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=aAP/mR9+1e0i9VIqKYhIwqKJcO8z1uA1zHUKn7fioR8=; b=mvJ2hSEL5dIQ3HQs9jipverT0C+JT2ThQhx5vrUMOVB2gm5tjTwIOA3El7QJYXTI5F Z3jbTsCW463pqKoX/3LcCB3gBBR0kmp1RdH7x/i8znT6XVISUlew866rmYs2XqCWJUor jLgSvToz96QYFeBiE7Mur7anskKYy7TXQiJybZBSaihtAjieY/YdD7YOR0tgA4P2+fJ/ btbzyLZQ4PILzZ1ORpn6wiAdHxbCo8mkHKACgq+M5ATVw++zleQpLgsVQYMplJ50MUO3 sTN0XwuY0496uKJgktGMkw0uFJmUE9zExvQd1HsKpirargu9xKft9u92iljFuhyonrIa tuuw== X-Gm-Message-State: AOAM533S/N2iIe1Sp3naqOFmyOEedv0C6pRECiRREH1qXN66FORdPdqh fquNPL++VuOnk22y9wzcwVBrL8QUqJ5sK6We6mywH0OlscNYdg9ZZcrbsH+5ro/WhZUPHkNT++B D9SSeLGsdStgAC5ZXpGmbsiUQAsQ40rnEktUOC9+S5qD8zDqHq1UULLdwkPnvu/GRyV7HTxE= X-Received: by 2002:a05:6402:2711:b0:419:5a50:75ef with SMTP id y17-20020a056402271100b004195a5075efmr140684edd.280.1648506416332; Mon, 28 Mar 2022 15:26:56 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxmEX6xCqijTgGkXEOSRZom3LOZIjk8/1eX7JP85cBIadPWB3GR3+v296I6r1pP6bOxF1zgAQ== X-Received: by 2002:a05:6402:2711:b0:419:5a50:75ef with SMTP id y17-20020a056402271100b004195a5075efmr140668edd.280.1648506416156; Mon, 28 Mar 2022 15:26:56 -0700 (PDT) Received: from aalbersh.remote.csb ([109.183.6.197]) by smtp.gmail.com with ESMTPSA id t19-20020a056402525300b0041952a1a764sm7722360edd.33.2022.03.28.15.26.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Mar 2022 15:26:55 -0700 (PDT) From: Andrey Albershteyn To: linux-xfs@vger.kernel.org Cc: Andrey Albershteyn Subject: [PATCH 1/5] xfs_quota: separate quota info acquisition into get_quota() Date: Tue, 29 Mar 2022 00:24:59 +0200 Message-Id: <20220328222503.146496-2-aalbersh@redhat.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20220328222503.146496-1-aalbersh@redhat.com> References: <20220328222503.146496-1-aalbersh@redhat.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Both report_mount() and dump_file() have identical code to get quota information. This could be used for further separation of the functions. Signed-off-by: Andrey Albershteyn Reviewed-by: Christoph Hellwig --- quota/report.c | 49 +++++++++++++++++++++++-------------------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/quota/report.c b/quota/report.c index 2eb5b5a9..97a89a92 100644 --- a/quota/report.c +++ b/quota/report.c @@ -59,16 +59,15 @@ report_help(void) "\n")); } -static int -dump_file( - FILE *fp, +static int +get_quota( + fs_disk_quota_t *d, uint id, uint *oid, uint type, char *dev, int flags) { - fs_disk_quota_t d; int cmd; if (flags & GETNEXTQUOTA_FLAG) @@ -77,7 +76,7 @@ dump_file( cmd = XFS_GETQUOTA; /* Fall back silently if XFS_GETNEXTQUOTA fails, warn on XFS_GETQUOTA */ - if (xfsquotactl(cmd, dev, type, id, (void *)&d) < 0) { + if (xfsquotactl(cmd, dev, type, id, (void *)d) < 0) { if (errno != ENOENT && errno != ENOSYS && errno != ESRCH && cmd == XFS_GETQUOTA) perror("XFS_GETQUOTA"); @@ -85,12 +84,29 @@ dump_file( } if (oid) { - *oid = d.d_id; + *oid = d->d_id; /* Did kernelspace wrap? */ if (*oid < id) return 0; } + return 1; +} + +static int +dump_file( + FILE *fp, + uint id, + uint *oid, + uint type, + char *dev, + int flags) +{ + fs_disk_quota_t d; + + if (!get_quota(&d, id, oid, type, dev, flags)) + return 0; + if (!d.d_blk_softlimit && !d.d_blk_hardlimit && !d.d_ino_softlimit && !d.d_ino_hardlimit && !d.d_rtb_softlimit && !d.d_rtb_hardlimit) @@ -329,31 +345,12 @@ report_mount( { fs_disk_quota_t d; time64_t timer; - char *dev = mount->fs_name; char c[8], h[8], s[8]; uint qflags; int count; - int cmd; - if (flags & GETNEXTQUOTA_FLAG) - cmd = XFS_GETNEXTQUOTA; - else - cmd = XFS_GETQUOTA; - - /* Fall back silently if XFS_GETNEXTQUOTA fails, warn on XFS_GETQUOTA*/ - if (xfsquotactl(cmd, dev, type, id, (void *)&d) < 0) { - if (errno != ENOENT && errno != ENOSYS && errno != ESRCH && - cmd == XFS_GETQUOTA) - perror("XFS_GETQUOTA"); + if (!get_quota(&d, id, oid, type, mount->fs_name, flags)) return 0; - } - - if (oid) { - *oid = d.d_id; - /* Did kernelspace wrap? */ - if (* oid < id) - return 0; - } if (flags & TERSE_FLAG) { count = 0; From patchwork Mon Mar 28 22:25:00 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrey Albershteyn X-Patchwork-Id: 12794295 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3018FC433F5 for ; Mon, 28 Mar 2022 22:27:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229772AbiC1W2u (ORCPT ); Mon, 28 Mar 2022 18:28:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57592 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229934AbiC1W2s (ORCPT ); Mon, 28 Mar 2022 18:28:48 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 60E18171EDD for ; Mon, 28 Mar 2022 15:27:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1648506423; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+EKfEVzXllFlN1G2PH4iLz38gpFp6iSOljzKO+cJiKc=; b=TJJJ2uUfT3DSU/wu9mD8lLoj0p62imxCwaIoF4Eu7kb5V3rclRpEB8Ezjt04I9z82AdqAN gZ5cfcno+++S0wrkHUwmqtReCX1JswHE+Q1Cu2NT8MZ4QXINqUMPmZHBnyO5N5XAzprrhu ZM8mrapHmxs5ae/svBtsDfsZZKr/kn4= Received: from mail-ed1-f70.google.com (mail-ed1-f70.google.com [209.85.208.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-587-YfLwJ2zXPcW_XbLLGfDMUA-1; Mon, 28 Mar 2022 18:26:59 -0400 X-MC-Unique: YfLwJ2zXPcW_XbLLGfDMUA-1 Received: by mail-ed1-f70.google.com with SMTP id o20-20020aa7dd54000000b00413bc19ad08so9776261edw.7 for ; Mon, 28 Mar 2022 15:26:59 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=+EKfEVzXllFlN1G2PH4iLz38gpFp6iSOljzKO+cJiKc=; b=stvhb04Ka0neB6RpjvqK77AjAmM1AyqrUfgiMqbXT+THT24a2sHN3RX/T1keWDTfzu BGAzBaV9tsxGtRFP5RJT6jntt6otZD/Pyd68MWK7I1sCJSafp7D7lMiYoENhWm1Jpujj 0n0TAElbpbiLYghB7vKXE40xokte3PBOooTOYux+hrts4U0NMAp7YGwKBK2ISPDFlvOK nhxh1R554vFhiNfXtHSGuOa6tzutkHRz/Z0CZIxchT8wAQuFFqFm4O/MMuRLWOSEO3IE bn4bv9iWUBbjEBj1PMESkTmcAxpemv2QsKJHsxYLpz8G/sSg3pSo38ez1pcLARfTIs1q x8oQ== X-Gm-Message-State: AOAM5329PXltx/UiQzx14klw4Y7L2cZjOow1zSQkjj4GlSbLA2f210Ae efGgyPRimwmeD6YJntJ2jGzQ6pH37+84AeApWTBgYB7Bqt+6AqUBW0XRVSAkHM5lN8535grn5rt OnHS9SrPJROiXNGslp2lVDxi/JYG6ELSgs6TSD58sUVgLym8xQWtx8poidByTJHXzyrPaABs= X-Received: by 2002:a05:6402:4414:b0:419:28bc:55dc with SMTP id y20-20020a056402441400b0041928bc55dcmr160951eda.130.1648506417630; Mon, 28 Mar 2022 15:26:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwff5pDNvXXLuwuSAtcdbzw5GuntRlLwWHtLVuy8oLWZy+eB0w2aPzL93tbMxaL1IKlVZXyng== X-Received: by 2002:a05:6402:4414:b0:419:28bc:55dc with SMTP id y20-20020a056402441400b0041928bc55dcmr160929eda.130.1648506417357; Mon, 28 Mar 2022 15:26:57 -0700 (PDT) Received: from aalbersh.remote.csb ([109.183.6.197]) by smtp.gmail.com with ESMTPSA id t19-20020a056402525300b0041952a1a764sm7722360edd.33.2022.03.28.15.26.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Mar 2022 15:26:56 -0700 (PDT) From: Andrey Albershteyn To: linux-xfs@vger.kernel.org Cc: Andrey Albershteyn Subject: [PATCH 2/5] xfs_quota: create fs_disk_quota_t on upper level Date: Tue, 29 Mar 2022 00:25:00 +0200 Message-Id: <20220328222503.146496-3-aalbersh@redhat.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20220328222503.146496-1-aalbersh@redhat.com> References: <20220328222503.146496-1-aalbersh@redhat.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org For further splitting of get_quota() and dump_file()/report_mount(). Signed-off-by: Andrey Albershteyn --- quota/report.c | 165 +++++++++++++++++++++++++------------------------ 1 file changed, 84 insertions(+), 81 deletions(-) diff --git a/quota/report.c b/quota/report.c index 97a89a92..0462ce97 100644 --- a/quota/report.c +++ b/quota/report.c @@ -96,39 +96,38 @@ get_quota( static int dump_file( FILE *fp, + fs_disk_quota_t *d, uint id, uint *oid, uint type, char *dev, int flags) { - fs_disk_quota_t d; - - if (!get_quota(&d, id, oid, type, dev, flags)) + if (!get_quota(d, id, oid, type, dev, flags)) return 0; - if (!d.d_blk_softlimit && !d.d_blk_hardlimit && - !d.d_ino_softlimit && !d.d_ino_hardlimit && - !d.d_rtb_softlimit && !d.d_rtb_hardlimit) + if (!d->d_blk_softlimit && !d->d_blk_hardlimit && + !d->d_ino_softlimit && !d->d_ino_hardlimit && + !d->d_rtb_softlimit && !d->d_rtb_hardlimit) return 1; fprintf(fp, "fs = %s\n", dev); /* this branch is for backward compatibility reasons */ - if (d.d_rtb_softlimit || d.d_rtb_hardlimit) + if (d->d_rtb_softlimit || d->d_rtb_hardlimit) fprintf(fp, "%-10d %7llu %7llu %7llu %7llu %7llu %7llu\n", - d.d_id, - (unsigned long long)d.d_blk_softlimit, - (unsigned long long)d.d_blk_hardlimit, - (unsigned long long)d.d_ino_softlimit, - (unsigned long long)d.d_ino_hardlimit, - (unsigned long long)d.d_rtb_softlimit, - (unsigned long long)d.d_rtb_hardlimit); + d->d_id, + (unsigned long long)d->d_blk_softlimit, + (unsigned long long)d->d_blk_hardlimit, + (unsigned long long)d->d_ino_softlimit, + (unsigned long long)d->d_ino_hardlimit, + (unsigned long long)d->d_rtb_softlimit, + (unsigned long long)d->d_rtb_hardlimit); else fprintf(fp, "%-10d %7llu %7llu %7llu %7llu\n", - d.d_id, - (unsigned long long)d.d_blk_softlimit, - (unsigned long long)d.d_blk_hardlimit, - (unsigned long long)d.d_ino_softlimit, - (unsigned long long)d.d_ino_hardlimit); + d->d_id, + (unsigned long long)d->d_blk_softlimit, + (unsigned long long)d->d_blk_hardlimit, + (unsigned long long)d->d_ino_softlimit, + (unsigned long long)d->d_ino_hardlimit); return 1; } @@ -142,6 +141,7 @@ dump_limits_any_type( uint upper) { fs_path_t *mount; + fs_disk_quota_t d; uint id = 0, oid; if ((mount = fs_table_lookup(dir, FS_MOUNT_POINT)) == NULL) { @@ -154,14 +154,14 @@ dump_limits_any_type( /* Range was specified; query everything in it */ if (upper) { for (id = lower; id <= upper; id++) - dump_file(fp, id, NULL, type, mount->fs_name, 0); + dump_file(fp, &d, id, NULL, type, mount->fs_name, 0); return; } /* Use GETNEXTQUOTA if it's available */ - if (dump_file(fp, id, &oid, type, mount->fs_name, GETNEXTQUOTA_FLAG)) { + if (dump_file(fp, &d, id, &oid, type, mount->fs_name, GETNEXTQUOTA_FLAG)) { id = oid + 1; - while (dump_file(fp, id, &oid, type, mount->fs_name, + while (dump_file(fp, &d, id, &oid, type, mount->fs_name, GETNEXTQUOTA_FLAG)) id = oid + 1; return; @@ -173,7 +173,7 @@ dump_limits_any_type( struct group *g; setgrent(); while ((g = getgrent()) != NULL) - dump_file(fp, g->gr_gid, NULL, type, + dump_file(fp, &d, g->gr_gid, NULL, type, mount->fs_name, 0); endgrent(); break; @@ -182,7 +182,7 @@ dump_limits_any_type( struct fs_project *p; setprent(); while ((p = getprent()) != NULL) - dump_file(fp, p->pr_prid, NULL, type, + dump_file(fp, &d, p->pr_prid, NULL, type, mount->fs_name, 0); endprent(); break; @@ -191,7 +191,7 @@ dump_limits_any_type( struct passwd *u; setpwent(); while ((u = getpwent()) != NULL) - dump_file(fp, u->pw_uid, NULL, type, + dump_file(fp, &d, u->pw_uid, NULL, type, mount->fs_name, 0); endpwent(); break; @@ -335,6 +335,7 @@ report_header( static int report_mount( FILE *fp, + fs_disk_quota_t *d, uint32_t id, char *name, uint32_t *oid, @@ -343,22 +344,21 @@ report_mount( fs_path_t *mount, uint flags) { - fs_disk_quota_t d; time64_t timer; char c[8], h[8], s[8]; uint qflags; int count; - if (!get_quota(&d, id, oid, type, mount->fs_name, flags)) + if (!get_quota(d, id, oid, type, mount->fs_name, flags)) return 0; if (flags & TERSE_FLAG) { count = 0; - if ((form & XFS_BLOCK_QUOTA) && d.d_bcount) + if ((form & XFS_BLOCK_QUOTA) && d->d_bcount) count++; - if ((form & XFS_INODE_QUOTA) && d.d_icount) + if ((form & XFS_INODE_QUOTA) && d->d_icount) count++; - if ((form & XFS_RTBLOCK_QUOTA) && d.d_rtbcount) + if ((form & XFS_RTBLOCK_QUOTA) && d->d_rtbcount) count++; if (!count) return 0; @@ -368,19 +368,19 @@ report_mount( report_header(fp, form, type, mount, flags); if (flags & NO_LOOKUP_FLAG) { - fprintf(fp, "#%-10u", d.d_id); + fprintf(fp, "#%-10u", d->d_id); } else { if (name == NULL) { if (type == XFS_USER_QUOTA) { - struct passwd *u = getpwuid(d.d_id); + struct passwd *u = getpwuid(d->d_id); if (u) name = u->pw_name; } else if (type == XFS_GROUP_QUOTA) { - struct group *g = getgrgid(d.d_id); + struct group *g = getgrgid(d->d_id); if (g) name = g->gr_name; } else if (type == XFS_PROJ_QUOTA) { - fs_project_t *p = getprprid(d.d_id); + fs_project_t *p = getprprid(d->d_id); if (p) name = p->pr_name; } @@ -389,73 +389,73 @@ report_mount( if (name != NULL) fprintf(fp, "%-10s", name); else - fprintf(fp, "#%-9u", d.d_id); + fprintf(fp, "#%-9u", d->d_id); } if (form & XFS_BLOCK_QUOTA) { - timer = decode_timer(&d, d.d_btimer, d.d_btimer_hi); + timer = decode_timer(d, d->d_btimer, d->d_btimer_hi); qflags = (flags & HUMAN_FLAG); - if (d.d_blk_hardlimit && d.d_bcount > d.d_blk_hardlimit) + if (d->d_blk_hardlimit && d->d_bcount > d->d_blk_hardlimit) qflags |= LIMIT_FLAG; - if (d.d_blk_softlimit && d.d_bcount > d.d_blk_softlimit) + if (d->d_blk_softlimit && d->d_bcount > d->d_blk_softlimit) qflags |= QUOTA_FLAG; if (flags & HUMAN_FLAG) fprintf(fp, " %6s %6s %6s %02d %8s", - bbs_to_string(d.d_bcount, c, sizeof(c)), - bbs_to_string(d.d_blk_softlimit, s, sizeof(s)), - bbs_to_string(d.d_blk_hardlimit, h, sizeof(h)), - d.d_bwarns, + bbs_to_string(d->d_bcount, c, sizeof(c)), + bbs_to_string(d->d_blk_softlimit, s, sizeof(s)), + bbs_to_string(d->d_blk_hardlimit, h, sizeof(h)), + d->d_bwarns, time_to_string(timer, qflags)); else fprintf(fp, " %10llu %10llu %10llu %02d %9s", - (unsigned long long)d.d_bcount >> 1, - (unsigned long long)d.d_blk_softlimit >> 1, - (unsigned long long)d.d_blk_hardlimit >> 1, - d.d_bwarns, + (unsigned long long)d->d_bcount >> 1, + (unsigned long long)d->d_blk_softlimit >> 1, + (unsigned long long)d->d_blk_hardlimit >> 1, + d->d_bwarns, time_to_string(timer, qflags)); } if (form & XFS_INODE_QUOTA) { - timer = decode_timer(&d, d.d_itimer, d.d_itimer_hi); + timer = decode_timer(d, d->d_itimer, d->d_itimer_hi); qflags = (flags & HUMAN_FLAG); - if (d.d_ino_hardlimit && d.d_icount > d.d_ino_hardlimit) + if (d->d_ino_hardlimit && d->d_icount > d->d_ino_hardlimit) qflags |= LIMIT_FLAG; - if (d.d_ino_softlimit && d.d_icount > d.d_ino_softlimit) + if (d->d_ino_softlimit && d->d_icount > d->d_ino_softlimit) qflags |= QUOTA_FLAG; if (flags & HUMAN_FLAG) fprintf(fp, " %6s %6s %6s %02d %8s", - num_to_string(d.d_icount, c, sizeof(c)), - num_to_string(d.d_ino_softlimit, s, sizeof(s)), - num_to_string(d.d_ino_hardlimit, h, sizeof(h)), - d.d_iwarns, + num_to_string(d->d_icount, c, sizeof(c)), + num_to_string(d->d_ino_softlimit, s, sizeof(s)), + num_to_string(d->d_ino_hardlimit, h, sizeof(h)), + d->d_iwarns, time_to_string(timer, qflags)); else fprintf(fp, " %10llu %10llu %10llu %02d %9s", - (unsigned long long)d.d_icount, - (unsigned long long)d.d_ino_softlimit, - (unsigned long long)d.d_ino_hardlimit, - d.d_iwarns, + (unsigned long long)d->d_icount, + (unsigned long long)d->d_ino_softlimit, + (unsigned long long)d->d_ino_hardlimit, + d->d_iwarns, time_to_string(timer, qflags)); } if (form & XFS_RTBLOCK_QUOTA) { - timer = decode_timer(&d, d.d_rtbtimer, d.d_rtbtimer_hi); + timer = decode_timer(d, d->d_rtbtimer, d->d_rtbtimer_hi); qflags = (flags & HUMAN_FLAG); - if (d.d_rtb_hardlimit && d.d_rtbcount > d.d_rtb_hardlimit) + if (d->d_rtb_hardlimit && d->d_rtbcount > d->d_rtb_hardlimit) qflags |= LIMIT_FLAG; - if (d.d_rtb_softlimit && d.d_rtbcount > d.d_rtb_softlimit) + if (d->d_rtb_softlimit && d->d_rtbcount > d->d_rtb_softlimit) qflags |= QUOTA_FLAG; if (flags & HUMAN_FLAG) fprintf(fp, " %6s %6s %6s %02d %8s", - bbs_to_string(d.d_rtbcount, c, sizeof(c)), - bbs_to_string(d.d_rtb_softlimit, s, sizeof(s)), - bbs_to_string(d.d_rtb_hardlimit, h, sizeof(h)), - d.d_rtbwarns, + bbs_to_string(d->d_rtbcount, c, sizeof(c)), + bbs_to_string(d->d_rtb_softlimit, s, sizeof(s)), + bbs_to_string(d->d_rtb_hardlimit, h, sizeof(h)), + d->d_rtbwarns, time_to_string(timer, qflags)); else fprintf(fp, " %10llu %10llu %10llu %02d %9s", - (unsigned long long)d.d_rtbcount >> 1, - (unsigned long long)d.d_rtb_softlimit >> 1, - (unsigned long long)d.d_rtb_hardlimit >> 1, - d.d_rtbwarns, + (unsigned long long)d->d_rtbcount >> 1, + (unsigned long long)d->d_rtb_softlimit >> 1, + (unsigned long long)d->d_rtb_hardlimit >> 1, + d->d_rtbwarns, time_to_string(timer, qflags)); } fputc('\n', fp); @@ -472,28 +472,29 @@ report_user_mount( uint flags) { struct passwd *u; + fs_disk_quota_t d; uint id = 0, oid; if (upper) { /* identifier range specified */ for (id = lower; id <= upper; id++) { - if (report_mount(fp, id, NULL, NULL, + if (report_mount(fp, &d, id, NULL, NULL, form, XFS_USER_QUOTA, mount, flags)) flags |= NO_HEADER_FLAG; } - } else if (report_mount(fp, id, NULL, &oid, form, + } else if (report_mount(fp, &d, id, NULL, &oid, form, XFS_USER_QUOTA, mount, flags|GETNEXTQUOTA_FLAG)) { id = oid + 1; flags |= GETNEXTQUOTA_FLAG; flags |= NO_HEADER_FLAG; - while (report_mount(fp, id, NULL, &oid, form, XFS_USER_QUOTA, + while (report_mount(fp, &d, id, NULL, &oid, form, XFS_USER_QUOTA, mount, flags)) { id = oid + 1; } } else { setpwent(); while ((u = getpwent()) != NULL) { - if (report_mount(fp, u->pw_uid, u->pw_name, NULL, + if (report_mount(fp, &d, u->pw_uid, u->pw_name, NULL, form, XFS_USER_QUOTA, mount, flags)) flags |= NO_HEADER_FLAG; } @@ -514,28 +515,29 @@ report_group_mount( uint flags) { struct group *g; + fs_disk_quota_t d; uint id = 0, oid; if (upper) { /* identifier range specified */ for (id = lower; id <= upper; id++) { - if (report_mount(fp, id, NULL, NULL, + if (report_mount(fp, &d, id, NULL, NULL, form, XFS_GROUP_QUOTA, mount, flags)) flags |= NO_HEADER_FLAG; } - } else if (report_mount(fp, id, NULL, &oid, form, + } else if (report_mount(fp, &d, id, NULL, &oid, form, XFS_GROUP_QUOTA, mount, flags|GETNEXTQUOTA_FLAG)) { id = oid + 1; flags |= GETNEXTQUOTA_FLAG; flags |= NO_HEADER_FLAG; - while (report_mount(fp, id, NULL, &oid, form, XFS_GROUP_QUOTA, + while (report_mount(fp, &d, id, NULL, &oid, form, XFS_GROUP_QUOTA, mount, flags)) { id = oid + 1; } } else { setgrent(); while ((g = getgrent()) != NULL) { - if (report_mount(fp, g->gr_gid, g->gr_name, NULL, + if (report_mount(fp, &d, g->gr_gid, g->gr_name, NULL, form, XFS_GROUP_QUOTA, mount, flags)) flags |= NO_HEADER_FLAG; } @@ -555,21 +557,22 @@ report_project_mount( uint flags) { fs_project_t *p; + fs_disk_quota_t d; uint id = 0, oid; if (upper) { /* identifier range specified */ for (id = lower; id <= upper; id++) { - if (report_mount(fp, id, NULL, NULL, + if (report_mount(fp, &d, id, NULL, NULL, form, XFS_PROJ_QUOTA, mount, flags)) flags |= NO_HEADER_FLAG; } - } else if (report_mount(fp, id, NULL, &oid, form, + } else if (report_mount(fp, &d, id, NULL, &oid, form, XFS_PROJ_QUOTA, mount, flags|GETNEXTQUOTA_FLAG)) { id = oid + 1; flags |= GETNEXTQUOTA_FLAG; flags |= NO_HEADER_FLAG; - while (report_mount(fp, id, NULL, &oid, form, XFS_PROJ_QUOTA, + while (report_mount(fp, &d, id, NULL, &oid, form, XFS_PROJ_QUOTA, mount, flags)) { id = oid + 1; } @@ -579,14 +582,14 @@ report_project_mount( * Print default project quota, even if projid 0 * isn't defined */ - if (report_mount(fp, 0, NULL, NULL, + if (report_mount(fp, &d, 0, NULL, NULL, form, XFS_PROJ_QUOTA, mount, flags)) flags |= NO_HEADER_FLAG; } setprent(); while ((p = getprent()) != NULL) { - if (report_mount(fp, p->pr_prid, p->pr_name, NULL, + if (report_mount(fp, &d, p->pr_prid, p->pr_name, NULL, form, XFS_PROJ_QUOTA, mount, flags)) flags |= NO_HEADER_FLAG; } From patchwork Mon Mar 28 22:25:01 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrey Albershteyn X-Patchwork-Id: 12794293 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id F3845C433FE for ; Mon, 28 Mar 2022 22:27:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229938AbiC1W2s (ORCPT ); Mon, 28 Mar 2022 18:28:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57540 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229884AbiC1W2r (ORCPT ); Mon, 28 Mar 2022 18:28:47 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id B911317179C for ; Mon, 28 Mar 2022 15:27:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1648506422; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=tAPum9oxybC3m47gadHNTQn3SDhHD9LpfsI3k5MtpPo=; b=B7EvXzO6R6OVCo1XoVpvCCGIgzc05gmmG+8KM+PYhvYRxj7LtBwycSf3cmmOag3ogte3mj LFGkZvJ3LMOJa3nC08WG20HF+3n3koSgekM8+65HFW8YhL3UNp3qHFF02yA8X58LQ8xCVG vmFGqLG5fiGBtujlKJWh7JASguQJdyY= Received: from mail-ed1-f71.google.com (mail-ed1-f71.google.com [209.85.208.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-580--g1SEXviOmugkzom0IjqLg-1; Mon, 28 Mar 2022 18:27:01 -0400 X-MC-Unique: -g1SEXviOmugkzom0IjqLg-1 Received: by mail-ed1-f71.google.com with SMTP id c22-20020a50f616000000b004196649d144so9765514edn.10 for ; Mon, 28 Mar 2022 15:27:01 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=tAPum9oxybC3m47gadHNTQn3SDhHD9LpfsI3k5MtpPo=; b=3sjGvm7m3qz9Vy/X4qca+fYPGlx9A1V8vLRStoxVCXie0od3F5XfAqVY8hEhThZDd1 xdJkWRZl9Xe2gUjrCHB6BMVudMya8O0CXwNqLaJwQh3qCKjmRZmR241Q60a+8+9yULBV CwpV2z405I/VUBeV3bbpc5u5hKYlC0ZMhHWnLaej5Ol/8/eRCbsdihsFeSNXNuaS1vg6 79XT4tQLRW4joYhJZYf9/zlUxy+lMH0m/qObGR/Nf4+4zSvNQUaAEHqvtqSWjIQh6Ar6 UickIigQi6g39LMFLx6QSbfWJHfAeI8rEzkbGZou5M5c8Uflw9H0bGX5uOvyJobkNmqL qMkg== X-Gm-Message-State: AOAM533kkkmHTHYxisc3wYvgiuYC8XIMykX0BMQ3zpXYTC9rNnlYnD7N X46o3z7XwxOcwio/zsv1FQKm3MPpcDm16Y5wMDlwQKq+GXpWscwsEOTPWQZoctsferV9c/uuzaq yCJlN0M8lEu5JPS6tCrvaCz12kzZTglubIhPdxapGw3cCO1uGpITb6J9JMadI4mMc+RPYQi4= X-Received: by 2002:a05:6402:1941:b0:413:2b7e:676e with SMTP id f1-20020a056402194100b004132b7e676emr168860edz.114.1648506419076; Mon, 28 Mar 2022 15:26:59 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyEoZcpZCW2lQUfjvWtNyyzSZywjeDDlvujcSH3HVulDTd7cgDnSlQYJhLWvFTqoGKoQjANkg== X-Received: by 2002:a05:6402:1941:b0:413:2b7e:676e with SMTP id f1-20020a056402194100b004132b7e676emr168838edz.114.1648506418840; Mon, 28 Mar 2022 15:26:58 -0700 (PDT) Received: from aalbersh.remote.csb ([109.183.6.197]) by smtp.gmail.com with ESMTPSA id t19-20020a056402525300b0041952a1a764sm7722360edd.33.2022.03.28.15.26.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Mar 2022 15:26:57 -0700 (PDT) From: Andrey Albershteyn To: linux-xfs@vger.kernel.org Cc: Andrey Albershteyn Subject: [PATCH 3/5] xfs_quota: split get_quota() and report_mount()/dump_file() Date: Tue, 29 Mar 2022 00:25:01 +0200 Message-Id: <20220328222503.146496-4-aalbersh@redhat.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20220328222503.146496-1-aalbersh@redhat.com> References: <20220328222503.146496-1-aalbersh@redhat.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Signed-off-by: Andrey Albershteyn --- quota/report.c | 134 ++++++++++++++++++++++++++++--------------------- 1 file changed, 78 insertions(+), 56 deletions(-) diff --git a/quota/report.c b/quota/report.c index 0462ce97..14b7f458 100644 --- a/quota/report.c +++ b/quota/report.c @@ -97,15 +97,8 @@ static int dump_file( FILE *fp, fs_disk_quota_t *d, - uint id, - uint *oid, - uint type, - char *dev, - int flags) + char *dev) { - if (!get_quota(d, id, oid, type, dev, flags)) - return 0; - if (!d->d_blk_softlimit && !d->d_blk_hardlimit && !d->d_ino_softlimit && !d->d_ino_hardlimit && !d->d_rtb_softlimit && !d->d_rtb_hardlimit) @@ -153,46 +146,54 @@ dump_limits_any_type( /* Range was specified; query everything in it */ if (upper) { - for (id = lower; id <= upper; id++) - dump_file(fp, &d, id, NULL, type, mount->fs_name, 0); + for (id = lower; id <= upper; id++) { + get_quota(&d, id, &oid, type, mount->fs_name, 0); + dump_file(fp, &d, mount->fs_name); + } return; } /* Use GETNEXTQUOTA if it's available */ - if (dump_file(fp, &d, id, &oid, type, mount->fs_name, GETNEXTQUOTA_FLAG)) { + if (get_quota(&d, id, &oid, type, mount->fs_name, GETNEXTQUOTA_FLAG)) { + dump_file(fp, &d, mount->fs_name); id = oid + 1; - while (dump_file(fp, &d, id, &oid, type, mount->fs_name, - GETNEXTQUOTA_FLAG)) + while (get_quota(&d, id, &oid, type, mount->fs_name, + GETNEXTQUOTA_FLAG)) { + dump_file(fp, &d, mount->fs_name); id = oid + 1; + } return; - } + } /* Otherwise fall back to iterating over each uid/gid/prjid */ switch (type) { case XFS_GROUP_QUOTA: { struct group *g; setgrent(); - while ((g = getgrent()) != NULL) - dump_file(fp, &d, g->gr_gid, NULL, type, - mount->fs_name, 0); + while ((g = getgrent()) != NULL) { + get_quota(&d, g->gr_gid, NULL, type, mount->fs_name, 0); + dump_file(fp, &d, mount->fs_name); + } endgrent(); break; } case XFS_PROJ_QUOTA: { struct fs_project *p; setprent(); - while ((p = getprent()) != NULL) - dump_file(fp, &d, p->pr_prid, NULL, type, - mount->fs_name, 0); + while ((p = getprent()) != NULL) { + get_quota(&d, p->pr_prid, NULL, type, mount->fs_name, 0); + dump_file(fp, &d, mount->fs_name); + } endprent(); break; } case XFS_USER_QUOTA: { struct passwd *u; setpwent(); - while ((u = getpwent()) != NULL) - dump_file(fp, &d, u->pw_uid, NULL, type, - mount->fs_name, 0); + while ((u = getpwent()) != NULL) { + get_quota(&d, u->pw_uid, NULL, type, mount->fs_name, 0); + dump_file(fp, &d, mount->fs_name); + } endpwent(); break; } @@ -336,9 +337,7 @@ static int report_mount( FILE *fp, fs_disk_quota_t *d, - uint32_t id, char *name, - uint32_t *oid, uint form, uint type, fs_path_t *mount, @@ -349,9 +348,6 @@ report_mount( uint qflags; int count; - if (!get_quota(d, id, oid, type, mount->fs_name, flags)) - return 0; - if (flags & TERSE_FLAG) { count = 0; if ((form & XFS_BLOCK_QUOTA) && d->d_bcount) @@ -477,26 +473,35 @@ report_user_mount( if (upper) { /* identifier range specified */ for (id = lower; id <= upper; id++) { - if (report_mount(fp, &d, id, NULL, NULL, - form, XFS_USER_QUOTA, mount, flags)) + if (get_quota(&d, id, NULL, XFS_USER_QUOTA, + mount->fs_name, flags)) { + report_mount(fp, &d, NULL, form, XFS_USER_QUOTA, mount, + flags); flags |= NO_HEADER_FLAG; + } } - } else if (report_mount(fp, &d, id, NULL, &oid, form, - XFS_USER_QUOTA, mount, + } else if (get_quota(&d, id, &oid, XFS_USER_QUOTA, mount->fs_name, flags|GETNEXTQUOTA_FLAG)) { + report_mount(fp, &d, NULL, form, XFS_USER_QUOTA, mount, + flags|GETNEXTQUOTA_FLAG); id = oid + 1; flags |= GETNEXTQUOTA_FLAG; flags |= NO_HEADER_FLAG; - while (report_mount(fp, &d, id, NULL, &oid, form, XFS_USER_QUOTA, - mount, flags)) { + while (get_quota(&d, id, &oid, XFS_USER_QUOTA, mount->fs_name, + flags)) { + report_mount(fp, &d, NULL, form, XFS_USER_QUOTA, + mount, flags); id = oid + 1; } } else { setpwent(); while ((u = getpwent()) != NULL) { - if (report_mount(fp, &d, u->pw_uid, u->pw_name, NULL, - form, XFS_USER_QUOTA, mount, flags)) + if (get_quota(&d, u->pw_uid, NULL, XFS_USER_QUOTA, mount->fs_name, + flags)) { + report_mount(fp, &d, u->pw_name, form, XFS_USER_QUOTA, mount, + flags); flags |= NO_HEADER_FLAG; + } } endpwent(); } @@ -520,26 +525,34 @@ report_group_mount( if (upper) { /* identifier range specified */ for (id = lower; id <= upper; id++) { - if (report_mount(fp, &d, id, NULL, NULL, - form, XFS_GROUP_QUOTA, mount, flags)) + if (get_quota(&d, id, NULL, XFS_GROUP_QUOTA, + mount->fs_name, flags)) { + report_mount(fp, &d, NULL, form, XFS_GROUP_QUOTA, mount, flags); flags |= NO_HEADER_FLAG; + } } - } else if (report_mount(fp, &d, id, NULL, &oid, form, - XFS_GROUP_QUOTA, mount, - flags|GETNEXTQUOTA_FLAG)) { + } else if (get_quota(&d, id, &oid, XFS_GROUP_QUOTA, + mount->fs_name, flags|GETNEXTQUOTA_FLAG)) { + report_mount(fp, &d, NULL, form, XFS_GROUP_QUOTA, mount, + flags|GETNEXTQUOTA_FLAG); id = oid + 1; flags |= GETNEXTQUOTA_FLAG; flags |= NO_HEADER_FLAG; - while (report_mount(fp, &d, id, NULL, &oid, form, XFS_GROUP_QUOTA, - mount, flags)) { + while (get_quota(&d, id, &oid, XFS_GROUP_QUOTA, + mount->fs_name, flags)) { + report_mount(fp, &d, NULL, form, XFS_GROUP_QUOTA, mount, + flags); id = oid + 1; } } else { setgrent(); while ((g = getgrent()) != NULL) { - if (report_mount(fp, &d, g->gr_gid, g->gr_name, NULL, - form, XFS_GROUP_QUOTA, mount, flags)) + if (get_quota(&d, g->gr_gid, NULL, XFS_GROUP_QUOTA, + mount->fs_name, flags)) { + report_mount(fp, &d, g->gr_name, form, + XFS_GROUP_QUOTA, mount, flags); flags |= NO_HEADER_FLAG; + } } } if (flags & NO_HEADER_FLAG) @@ -562,18 +575,22 @@ report_project_mount( if (upper) { /* identifier range specified */ for (id = lower; id <= upper; id++) { - if (report_mount(fp, &d, id, NULL, NULL, - form, XFS_PROJ_QUOTA, mount, flags)) + if (get_quota(&d, id, NULL, XFS_PROJ_QUOTA, + mount->fs_name, flags)) { + report_mount(fp, &d, NULL, form, XFS_PROJ_QUOTA, mount, flags); flags |= NO_HEADER_FLAG; + } } - } else if (report_mount(fp, &d, id, NULL, &oid, form, - XFS_PROJ_QUOTA, mount, - flags|GETNEXTQUOTA_FLAG)) { + } else if (get_quota(&d, id, &oid, XFS_PROJ_QUOTA, + mount->fs_name, flags|GETNEXTQUOTA_FLAG)) { + report_mount(fp, &d, NULL, form, XFS_PROJ_QUOTA, mount, + flags|GETNEXTQUOTA_FLAG); id = oid + 1; flags |= GETNEXTQUOTA_FLAG; flags |= NO_HEADER_FLAG; - while (report_mount(fp, &d, id, NULL, &oid, form, XFS_PROJ_QUOTA, - mount, flags)) { + while (get_quota(&d, id, &oid, XFS_PROJ_QUOTA, + mount->fs_name, flags)) { + report_mount(fp, &d, NULL, form, XFS_PROJ_QUOTA, mount, flags); id = oid + 1; } } else { @@ -582,16 +599,21 @@ report_project_mount( * Print default project quota, even if projid 0 * isn't defined */ - if (report_mount(fp, &d, 0, NULL, NULL, - form, XFS_PROJ_QUOTA, mount, flags)) + if (get_quota(&d, 0, NULL, XFS_PROJ_QUOTA, + mount->fs_name, flags)) { + report_mount(fp, &d, NULL, form, XFS_PROJ_QUOTA, mount, flags); flags |= NO_HEADER_FLAG; + } } setprent(); while ((p = getprent()) != NULL) { - if (report_mount(fp, &d, p->pr_prid, p->pr_name, NULL, - form, XFS_PROJ_QUOTA, mount, flags)) + if (get_quota(&d, p->pr_prid, NULL, XFS_PROJ_QUOTA, + mount->fs_name, flags)) { + report_mount(fp, &d, p->pr_name, form, XFS_PROJ_QUOTA, mount, + flags); flags |= NO_HEADER_FLAG; + } } endprent(); } From patchwork Mon Mar 28 22:25:02 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrey Albershteyn X-Patchwork-Id: 12794294 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8020BC4332F for ; Mon, 28 Mar 2022 22:27:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229812AbiC1W2u (ORCPT ); Mon, 28 Mar 2022 18:28:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57572 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229886AbiC1W2r (ORCPT ); Mon, 28 Mar 2022 18:28:47 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 0668B171EF0 for ; Mon, 28 Mar 2022 15:27:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1648506423; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=yLorVpU4OmrorCzSCw7oTgCr/F/sLwSWRUU9OL3LPR4=; b=a4kOmb4dG6tLftHGf9QeLOfGOKRMu55rGmk07NGGTtt4X/+f3In5+AhWTDZSXZ3onrEVMN 5kZhyBRhIDXyG8soPfcXEC4R/3AVSOdYe27edFkRwZIOw9cGBxfApF5bXY/A40KL8O/BEN lkWV/E8suCVy2OYQf84tJ53JN2FzsDM= Received: from mail-ej1-f69.google.com (mail-ej1-f69.google.com [209.85.218.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-627-ccVNxmZFOluBcNkabAtgUQ-1; Mon, 28 Mar 2022 18:27:02 -0400 X-MC-Unique: ccVNxmZFOluBcNkabAtgUQ-1 Received: by mail-ej1-f69.google.com with SMTP id i14-20020a17090639ce00b006dabe6a112fso7303446eje.13 for ; Mon, 28 Mar 2022 15:27:02 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=yLorVpU4OmrorCzSCw7oTgCr/F/sLwSWRUU9OL3LPR4=; b=zxDdUYLD3tbjMW84ZArjGJ46l9QzhfmRZHbxFYCQ+B304BFV+FyVPU8FaxYd+Mz1ME 3ANR2r5NTQS1MPiu+N/5A8XajjPVirsneIFHLAMMFC0EkH4ZJ5v2boLUQRFQ3Pc/5hX8 44QvGuiww5vYNCrcv9jyaTzI02FKNVC1DIPcC5mK3dN0q97fy+2p42fLXkTLI39e9s84 dnqFwn7KcxACrQe79G5CedQIzDXNH0orTLv5vh4lpD2n3SIT1lGXPqMaOAxsC2HE9vWm bx45UvxcEyXWqCl4lHxh8Y2r+/g49CW1bsZwxL+IvUsMKVyNrZtOL4ATWhs77e7DKqca IsTA== X-Gm-Message-State: AOAM531Z48egr8cQ/j3FkcjtzHkmZDxuYcfRHSP1Xm/bOqW+LeS00h/F 2Sjs+twNlGaLiu+TbE3klxmUMr0O3NVbLPtDzmVor10LTi+mNl5IW9f1K3QTXEWUH/RY9mWjRUF d+W3iYKilp/Mb/to0N+jfuJgIjOa6k1BiZIc53+jtTuJ89/XmJiXBZaMFy1vA9uQ4zzvPQF8= X-Received: by 2002:a05:6402:3495:b0:419:1ff6:95d9 with SMTP id v21-20020a056402349500b004191ff695d9mr91463edc.249.1648506420355; Mon, 28 Mar 2022 15:27:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzLYQI31VpXRJhcebdK5CMDmmPBja5XLRXoXbx6Z5867Jkv3BOAaopR7LJ+hjdB6qmzHN9plA== X-Received: by 2002:a05:6402:3495:b0:419:1ff6:95d9 with SMTP id v21-20020a056402349500b004191ff695d9mr91436edc.249.1648506420050; Mon, 28 Mar 2022 15:27:00 -0700 (PDT) Received: from aalbersh.remote.csb ([109.183.6.197]) by smtp.gmail.com with ESMTPSA id t19-20020a056402525300b0041952a1a764sm7722360edd.33.2022.03.28.15.26.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Mar 2022 15:26:59 -0700 (PDT) From: Andrey Albershteyn To: linux-xfs@vger.kernel.org Cc: Andrey Albershteyn Subject: [PATCH 4/5] xfs_quota: utilize XFS_GETNEXTQUOTA for ranged calls in report/dump Date: Tue, 29 Mar 2022 00:25:02 +0200 Message-Id: <20220328222503.146496-5-aalbersh@redhat.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20220328222503.146496-1-aalbersh@redhat.com> References: <20220328222503.146496-1-aalbersh@redhat.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org The implementation based on XFS_GETQUOTA call for each ID in range, specified with -L/-U, is quite slow for wider ranges. If kernel supports XFS_GETNEXTQUOTA, report_*_mount/dump_any_file will use that to obtain quota list for the mount. XFS_GETNEXTQUOTA returns quota of the requested ID and next ID with non-empty quota. Otherwise, XFS_GETQUOTA will be used for each user/group/project ID known from password/group/project database. Signed-off-by: Andrey Albershteyn Reviewed-by: Christoph Hellwig --- quota/report.c | 113 +++++++++++++++---------------------------------- 1 file changed, 35 insertions(+), 78 deletions(-) diff --git a/quota/report.c b/quota/report.c index 14b7f458..074abbc1 100644 --- a/quota/report.c +++ b/quota/report.c @@ -135,7 +135,7 @@ dump_limits_any_type( { fs_path_t *mount; fs_disk_quota_t d; - uint id = 0, oid; + uint id = lower, oid, flags = 0; if ((mount = fs_table_lookup(dir, FS_MOUNT_POINT)) == NULL) { exitcode = 1; @@ -144,27 +144,17 @@ dump_limits_any_type( return; } - /* Range was specified; query everything in it */ - if (upper) { - for (id = lower; id <= upper; id++) { - get_quota(&d, id, &oid, type, mount->fs_name, 0); - dump_file(fp, &d, mount->fs_name); - } - return; - } - - /* Use GETNEXTQUOTA if it's available */ - if (get_quota(&d, id, &oid, type, mount->fs_name, GETNEXTQUOTA_FLAG)) { + while (get_quota(&d, id, &oid, type, + mount->fs_name, flags|GETNEXTQUOTA_FLAG) && + !(upper && (d.d_id > upper))) { dump_file(fp, &d, mount->fs_name); id = oid + 1; - while (get_quota(&d, id, &oid, type, mount->fs_name, - GETNEXTQUOTA_FLAG)) { - dump_file(fp, &d, mount->fs_name); - id = oid + 1; - } - return; + flags |= GETNEXTQUOTA_FLAG; } + if (flags & GETNEXTQUOTA_FLAG) + return; + /* Otherwise fall back to iterating over each uid/gid/prjid */ switch (type) { case XFS_GROUP_QUOTA: { @@ -469,31 +459,19 @@ report_user_mount( { struct passwd *u; fs_disk_quota_t d; - uint id = 0, oid; + uint id = lower, oid; - if (upper) { /* identifier range specified */ - for (id = lower; id <= upper; id++) { - if (get_quota(&d, id, NULL, XFS_USER_QUOTA, - mount->fs_name, flags)) { - report_mount(fp, &d, NULL, form, XFS_USER_QUOTA, mount, - flags); - flags |= NO_HEADER_FLAG; - } - } - } else if (get_quota(&d, id, &oid, XFS_USER_QUOTA, mount->fs_name, - flags|GETNEXTQUOTA_FLAG)) { - report_mount(fp, &d, NULL, form, XFS_USER_QUOTA, mount, - flags|GETNEXTQUOTA_FLAG); + while (get_quota(&d, id, &oid, XFS_USER_QUOTA, + mount->fs_name, flags|GETNEXTQUOTA_FLAG) && + !(upper && (d.d_id > upper))) { + report_mount(fp, &d, NULL, form, XFS_USER_QUOTA, mount, flags); id = oid + 1; flags |= GETNEXTQUOTA_FLAG; flags |= NO_HEADER_FLAG; - while (get_quota(&d, id, &oid, XFS_USER_QUOTA, mount->fs_name, - flags)) { - report_mount(fp, &d, NULL, form, XFS_USER_QUOTA, - mount, flags); - id = oid + 1; - } - } else { + } + + /* No GETNEXTQUOTA support, iterate over all from password file */ + if (!(flags & GETNEXTQUOTA_FLAG)) { setpwent(); while ((u = getpwent()) != NULL) { if (get_quota(&d, u->pw_uid, NULL, XFS_USER_QUOTA, mount->fs_name, @@ -521,30 +499,19 @@ report_group_mount( { struct group *g; fs_disk_quota_t d; - uint id = 0, oid; + uint id = lower, oid; - if (upper) { /* identifier range specified */ - for (id = lower; id <= upper; id++) { - if (get_quota(&d, id, NULL, XFS_GROUP_QUOTA, - mount->fs_name, flags)) { - report_mount(fp, &d, NULL, form, XFS_GROUP_QUOTA, mount, flags); - flags |= NO_HEADER_FLAG; - } - } - } else if (get_quota(&d, id, &oid, XFS_GROUP_QUOTA, - mount->fs_name, flags|GETNEXTQUOTA_FLAG)) { - report_mount(fp, &d, NULL, form, XFS_GROUP_QUOTA, mount, - flags|GETNEXTQUOTA_FLAG); + while (get_quota(&d, id, &oid, XFS_GROUP_QUOTA, + mount->fs_name, flags|GETNEXTQUOTA_FLAG) && + !(upper && (oid > upper))) { + report_mount(fp, &d, NULL, form, XFS_GROUP_QUOTA, mount, flags); id = oid + 1; flags |= GETNEXTQUOTA_FLAG; flags |= NO_HEADER_FLAG; - while (get_quota(&d, id, &oid, XFS_GROUP_QUOTA, - mount->fs_name, flags)) { - report_mount(fp, &d, NULL, form, XFS_GROUP_QUOTA, mount, - flags); - id = oid + 1; - } - } else { + } + + /* No GETNEXTQUOTA support, iterate over all from password file */ + if (!(flags & GETNEXTQUOTA_FLAG)) { setgrent(); while ((g = getgrent()) != NULL) { if (get_quota(&d, g->gr_gid, NULL, XFS_GROUP_QUOTA, @@ -571,29 +538,19 @@ report_project_mount( { fs_project_t *p; fs_disk_quota_t d; - uint id = 0, oid; + uint id = lower, oid; - if (upper) { /* identifier range specified */ - for (id = lower; id <= upper; id++) { - if (get_quota(&d, id, NULL, XFS_PROJ_QUOTA, - mount->fs_name, flags)) { - report_mount(fp, &d, NULL, form, XFS_PROJ_QUOTA, mount, flags); - flags |= NO_HEADER_FLAG; - } - } - } else if (get_quota(&d, id, &oid, XFS_PROJ_QUOTA, - mount->fs_name, flags|GETNEXTQUOTA_FLAG)) { - report_mount(fp, &d, NULL, form, XFS_PROJ_QUOTA, mount, - flags|GETNEXTQUOTA_FLAG); + while (get_quota(&d, id, &oid, XFS_PROJ_QUOTA, + mount->fs_name, flags|GETNEXTQUOTA_FLAG) && + !(upper && (d.d_id > upper))) { + report_mount(fp, &d, NULL, form, XFS_PROJ_QUOTA, mount, flags); id = oid + 1; flags |= GETNEXTQUOTA_FLAG; flags |= NO_HEADER_FLAG; - while (get_quota(&d, id, &oid, XFS_PROJ_QUOTA, - mount->fs_name, flags)) { - report_mount(fp, &d, NULL, form, XFS_PROJ_QUOTA, mount, flags); - id = oid + 1; - } - } else { + } + + /* No GETNEXTQUOTA support, iterate over all */ + if (!(flags & GETNEXTQUOTA_FLAG)) { if (!getprprid(0)) { /* * Print default project quota, even if projid 0 From patchwork Mon Mar 28 22:25:03 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrey Albershteyn X-Patchwork-Id: 12794296 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 977F5C433FE for ; Mon, 28 Mar 2022 22:27:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229877AbiC1W2v (ORCPT ); Mon, 28 Mar 2022 18:28:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57602 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229928AbiC1W2s (ORCPT ); Mon, 28 Mar 2022 18:28:48 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id D96BC1728A8 for ; Mon, 28 Mar 2022 15:27:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1648506424; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vqP0qoAPAW+XR9MNalFFLNb+d2lbrYOJww0irumLfec=; b=CRtt99VgCJDDxrRxFRnx8gB1srZYSi/0mqxZJ4e1Al3VaCIx8rdv2V+Ko88fzbEHU/5Cdb wDfEQPRuK0l/V7q/XIkb+7ifboMXBA3Fy5CKHJkXT1Xlhb6eyOqmpmiKqhZ/AXtWSTHGJi zlNd3WCAh9PeAgJAyz9wlERinJBXyWY= Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-244-wJwcrZ03MymzShKG5lX6Zw-1; Mon, 28 Mar 2022 18:27:03 -0400 X-MC-Unique: wJwcrZ03MymzShKG5lX6Zw-1 Received: by mail-ed1-f72.google.com with SMTP id l24-20020a056402231800b00410f19a3103so9776149eda.5 for ; Mon, 28 Mar 2022 15:27:02 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=vqP0qoAPAW+XR9MNalFFLNb+d2lbrYOJww0irumLfec=; b=m4qWImjF3TRdg9llCGsABvhORnaZNMZ4w4dWb0YZ3gwuRJay7QCWLVLFnWaBwrbS5b Dm1T3EC/iXDUVBDHW4S93eBZE+lsMJIIYmDOQ5ibJiixqb58BUMH5TNA/UFDBhVobOI3 5OKa8NT9WSByKQ60tiGctkIHrTqq8HOg928DcbvpbPdomEgDsS8T/e4WT9Ny/7ilLlRJ QexmCmdYycK4dCepnfzF78upyC9MR769gYyyB5p22a1au+pGvKZcoP/n06dseel0YhnF 4iXqk+joliXUNtrj4oA5jGN/B2c8a9gfraSFKcfseU+D/7EYVWs+yEDbYpq/6B/yrIiV m76A== X-Gm-Message-State: AOAM533Doz+C6DBoBxWpKLKOT+LxxF8vsdUIXCiNe+EAzsa+cZ/tdhDw uL7mMq9bzE1fVgTUo03mfPIV0nGWo6VJL9wnE5yFe0IjDdnPBaqU4uK4Zp6rI9Ruf3iF1vcqh98 QPD8w43DaVmpmvsVNzL7xPZAFGZTbVCFi16Z1k15gXUX6rAuC+ASxxbEmafGazeu5oU7dWTY= X-Received: by 2002:aa7:d543:0:b0:416:13eb:6fec with SMTP id u3-20020aa7d543000000b0041613eb6fecmr132767edr.348.1648506421403; Mon, 28 Mar 2022 15:27:01 -0700 (PDT) X-Google-Smtp-Source: ABdhPJycltK5WvUm0kQA1iquW0mHC0j8ltqLM9Yf19z+OHpp1RjLFaJBGZ9KpI2gW0SuspHaHItzBA== X-Received: by 2002:aa7:d543:0:b0:416:13eb:6fec with SMTP id u3-20020aa7d543000000b0041613eb6fecmr132749edr.348.1648506421171; Mon, 28 Mar 2022 15:27:01 -0700 (PDT) Received: from aalbersh.remote.csb ([109.183.6.197]) by smtp.gmail.com with ESMTPSA id t19-20020a056402525300b0041952a1a764sm7722360edd.33.2022.03.28.15.27.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Mar 2022 15:27:00 -0700 (PDT) From: Andrey Albershteyn To: linux-xfs@vger.kernel.org Cc: Andrey Albershteyn Subject: [PATCH 5/5] xfs_quota: apply -L/-U range limits in uid/gid/pid loops Date: Tue, 29 Mar 2022 00:25:03 +0200 Message-Id: <20220328222503.146496-6-aalbersh@redhat.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20220328222503.146496-1-aalbersh@redhat.com> References: <20220328222503.146496-1-aalbersh@redhat.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Signed-off-by: Andrey Albershteyn --- quota/report.c | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/quota/report.c b/quota/report.c index 074abbc1..c79e95ab 100644 --- a/quota/report.c +++ b/quota/report.c @@ -161,8 +161,10 @@ dump_limits_any_type( struct group *g; setgrent(); while ((g = getgrent()) != NULL) { - get_quota(&d, g->gr_gid, NULL, type, mount->fs_name, 0); - dump_file(fp, &d, mount->fs_name); + if (get_quota(&d, g->gr_gid, NULL, type, mount->fs_name, 0) && + !(lower && (d.d_id < lower)) && + !(upper && (d.d_id > upper))) + dump_file(fp, &d, mount->fs_name); } endgrent(); break; @@ -171,8 +173,10 @@ dump_limits_any_type( struct fs_project *p; setprent(); while ((p = getprent()) != NULL) { - get_quota(&d, p->pr_prid, NULL, type, mount->fs_name, 0); - dump_file(fp, &d, mount->fs_name); + if (get_quota(&d, p->pr_prid, NULL, type, mount->fs_name, 0) && + !(lower && (d.d_id < lower)) && + !(upper && (d.d_id > upper))) + dump_file(fp, &d, mount->fs_name); } endprent(); break; @@ -181,8 +185,10 @@ dump_limits_any_type( struct passwd *u; setpwent(); while ((u = getpwent()) != NULL) { - get_quota(&d, u->pw_uid, NULL, type, mount->fs_name, 0); - dump_file(fp, &d, mount->fs_name); + if (get_quota(&d, u->pw_uid, NULL, type, mount->fs_name, 0) && + !(lower && (d.d_id < lower)) && + !(upper && (d.d_id > upper))) + dump_file(fp, &d, mount->fs_name); } endpwent(); break; @@ -474,8 +480,10 @@ report_user_mount( if (!(flags & GETNEXTQUOTA_FLAG)) { setpwent(); while ((u = getpwent()) != NULL) { - if (get_quota(&d, u->pw_uid, NULL, XFS_USER_QUOTA, mount->fs_name, - flags)) { + if (get_quota(&d, u->pw_uid, NULL, XFS_USER_QUOTA, + mount->fs_name, flags) && + !(lower && (d.d_id < lower)) && + !(upper && (d.d_id > upper))) { report_mount(fp, &d, u->pw_name, form, XFS_USER_QUOTA, mount, flags); flags |= NO_HEADER_FLAG; @@ -515,7 +523,9 @@ report_group_mount( setgrent(); while ((g = getgrent()) != NULL) { if (get_quota(&d, g->gr_gid, NULL, XFS_GROUP_QUOTA, - mount->fs_name, flags)) { + mount->fs_name, flags) && + !(lower && (d.d_id < lower)) && + !(upper && (d.d_id > upper))) { report_mount(fp, &d, g->gr_name, form, XFS_GROUP_QUOTA, mount, flags); flags |= NO_HEADER_FLAG; @@ -557,7 +567,9 @@ report_project_mount( * isn't defined */ if (get_quota(&d, 0, NULL, XFS_PROJ_QUOTA, - mount->fs_name, flags)) { + mount->fs_name, flags) && + !(lower && (d.d_id < lower)) && + !(upper && (d.d_id > upper))) { report_mount(fp, &d, NULL, form, XFS_PROJ_QUOTA, mount, flags); flags |= NO_HEADER_FLAG; } @@ -566,7 +578,9 @@ report_project_mount( setprent(); while ((p = getprent()) != NULL) { if (get_quota(&d, p->pr_prid, NULL, XFS_PROJ_QUOTA, - mount->fs_name, flags)) { + mount->fs_name, flags) && + !(lower && (d.d_id < lower)) && + !(upper && (d.d_id > upper))) { report_mount(fp, &d, p->pr_name, form, XFS_PROJ_QUOTA, mount, flags); flags |= NO_HEADER_FLAG;