From patchwork Fri Jun 2 19:51:57 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 9763335 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 7162060360 for ; Fri, 2 Jun 2017 19:52:05 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 63A2F285BD for ; Fri, 2 Jun 2017 19:52:05 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 587D2285C1; Fri, 2 Jun 2017 19:52:05 +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, RCVD_IN_DNSWL_HI, UNPARSEABLE_RELAY 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 DC343285BD for ; Fri, 2 Jun 2017 19:52:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751255AbdFBTwE (ORCPT ); Fri, 2 Jun 2017 15:52:04 -0400 Received: from userp1040.oracle.com ([156.151.31.81]:31308 "EHLO userp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750971AbdFBTwE (ORCPT ); Fri, 2 Jun 2017 15:52:04 -0400 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id v52Jq17B022431 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 2 Jun 2017 19:52:01 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.14.4/8.14.4) with ESMTP id v52Jq0s8005886 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 2 Jun 2017 19:52:01 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id v52JpwkQ018311; Fri, 2 Jun 2017 19:51:59 GMT Received: from localhost (/10.145.179.24) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 02 Jun 2017 12:51:58 -0700 Subject: [PATCH 07/10] xfs_spaceman: add new speculative prealloc control From: "Darrick J. Wong" To: sandeen@redhat.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, Dave Chinner Date: Fri, 02 Jun 2017 12:51:57 -0700 Message-ID: <149643311754.15899.8219480295517493642.stgit@birch.djwong.org> In-Reply-To: <149643307433.15899.922559884171553380.stgit@birch.djwong.org> References: <149643307433.15899.922559884171553380.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Source-IP: userv0022.oracle.com [156.151.31.74] 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 From: Dave Chinner Add an control interface for purging speculative preallocation via the new ioctls. Signed-off-by: Dave Chinner [darrick: change xfsctl to ioctl] Signed-off-by: Darrick J. Wong --- spaceman/Makefile | 2 - spaceman/init.c | 1 spaceman/prealloc.c | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++ spaceman/space.h | 1 4 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 spaceman/prealloc.c -- To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/spaceman/Makefile b/spaceman/Makefile index c63a4fc..6aad746 100644 --- a/spaceman/Makefile +++ b/spaceman/Makefile @@ -7,7 +7,7 @@ include $(TOPDIR)/include/builddefs LTCOMMAND = xfs_spaceman HFILES = init.h space.h -CFILES = init.c file.c trim.c +CFILES = init.c file.c prealloc.c trim.c LLDLIBS = $(LIBXCMD) LTDEPENDENCIES = $(LIBXCMD) diff --git a/spaceman/init.c b/spaceman/init.c index 0958377..93a8a1e 100644 --- a/spaceman/init.c +++ b/spaceman/init.c @@ -39,6 +39,7 @@ init_commands(void) { file_init(); help_init(); + prealloc_init(); quit_init(); trim_init(); } diff --git a/spaceman/prealloc.c b/spaceman/prealloc.c new file mode 100644 index 0000000..71c0d80 --- /dev/null +++ b/spaceman/prealloc.c @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2012 Red Hat, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libxfs.h" +#include "command.h" +#include "input.h" +#include "init.h" +#include "space.h" + +static cmdinfo_t prealloc_cmd; + +/* + * Control preallocation amounts. + */ +static int +prealloc_f( + int argc, + char **argv) +{ + struct xfs_fs_eofblocks eofb = {0}; + int c; + + eofb.eof_version = XFS_EOFBLOCKS_VERSION; + + while ((c = getopt(argc, argv, "g:m:p:su:")) != EOF) { + switch (c) { + case 'g': + eofb.eof_flags |= XFS_EOF_FLAGS_GID; + eofb.eof_gid = atoi(optarg); + break; + case 'u': + eofb.eof_flags |= XFS_EOF_FLAGS_UID; + eofb.eof_uid = atoi(optarg); + break; + case 'p': + eofb.eof_flags |= XFS_EOF_FLAGS_PRID; + eofb.eof_prid = atoi(optarg); + break; + case 's': + eofb.eof_flags |= XFS_EOF_FLAGS_SYNC; + break; + case 'm': + eofb.eof_flags |= XFS_EOF_FLAGS_MINFILESIZE; + eofb.eof_min_file_size = cvtnum(file->geom.blocksize, + file->geom.sectsize, + optarg); + break; + case '?': + default: + return command_usage(&prealloc_cmd); + } + } + if (optind != argc) + return command_usage(&prealloc_cmd); + + if (ioctl(file->fd, XFS_IOC_FREE_EOFBLOCKS, &eofb) < 0) { + fprintf(stderr, _("%s: XFS_IOC_FREE_EOFBLOCKS on %s: %s\n"), + progname, file->name, strerror(errno)); + } + return 0; +} + +static void +prealloc_help(void) +{ + printf(_( +"\n" +"Control speculative preallocation\n" +"\n" +"Options: [-s] [-ugp id] [-m minlen]\n" +"\n" +" -s -- wait for removal to complete\n" +" -u uid -- remove prealloc on files matching user \n" +" -g gid -- remove prealloc on files matching group \n" +" -p prid -- remove prealloc on files matching project \n" +" -m minlen -- only consider files larger than \n" +"\n")); + +} + +void +prealloc_init(void) +{ + prealloc_cmd.name = "prealloc"; + prealloc_cmd.altname = "prealloc"; + prealloc_cmd.cfunc = prealloc_f; + prealloc_cmd.argmin = 1; + prealloc_cmd.argmax = -1; + prealloc_cmd.args = "[-s] [-ugp id] [-m minlen]"; + prealloc_cmd.flags = CMD_FLAG_ONESHOT; + prealloc_cmd.oneline = _("Control speculative preallocation"); + prealloc_cmd.help = prealloc_help; + + add_command(&prealloc_cmd); +} + diff --git a/spaceman/space.h b/spaceman/space.h index 7b4f034..0ae3116 100644 --- a/spaceman/space.h +++ b/spaceman/space.h @@ -33,5 +33,6 @@ extern int addfile(char *, int , xfs_fsop_geom_t *, int); extern void file_init(void); extern void help_init(void); +extern void prealloc_init(void); extern void quit_init(void); extern void trim_init(void);