From patchwork Sat Jan 21 08:08:30 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dave Chinner X-Patchwork-Id: 9530047 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 119C76046A for ; Sat, 21 Jan 2017 08:08:38 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 003112842E for ; Sat, 21 Jan 2017 08:08:38 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E92DF28620; Sat, 21 Jan 2017 08:08:37 +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=unavailable 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 811D328527 for ; Sat, 21 Jan 2017 08:08:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751262AbdAUIIg (ORCPT ); Sat, 21 Jan 2017 03:08:36 -0500 Received: from aserp1040.oracle.com ([141.146.126.69]:20449 "EHLO aserp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751169AbdAUIIf (ORCPT ); Sat, 21 Jan 2017 03:08:35 -0500 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id v0L88WlD017057 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sat, 21 Jan 2017 08:08:33 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id v0L88Wr6027072 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sat, 21 Jan 2017 08:08:32 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by userv0121.oracle.com (8.14.4/8.13.8) with ESMTP id v0L88VxP026688; Sat, 21 Jan 2017 08:08:32 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Sat, 21 Jan 2017 00:08:31 -0800 Subject: [PATCH 04/17] spaceman: add new speculative prealloc control From: Dave Chinner To: sandeen@redhat.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org Date: Sat, 21 Jan 2017 00:08:30 -0800 Message-ID: <148498611049.16675.18221879786245783993.stgit@birch.djwong.org> In-Reply-To: <148498608472.16675.14848042961636871812.stgit@birch.djwong.org> References: <148498608472.16675.14848042961636871812.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Source-IP: aserv0022.oracle.com [141.146.126.234] Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Add an control interface for purging speculative preallocation via the new ioctls. Signed-off-by: Dave Chinner --- spaceman/Makefile | 2 - spaceman/init.c | 1 spaceman/prealloc.c | 135 +++++++++++++++++++++++++++++++++++++++++++++++++++ spaceman/space.h | 1 4 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 spaceman/prealloc.c -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" 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 9fb9142..b1f1136 100644 --- a/spaceman/Makefile +++ b/spaceman/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/include/builddefs LTCOMMAND = xfs_spaceman HFILES = init.h space.h CFILES = init.c \ - file.c trim.c + file.c prealloc.c trim.c LLDLIBS = $(LIBXCMD) LTDEPENDENCIES = $(LIBXCMD) diff --git a/spaceman/init.c b/spaceman/init.c index 8eb4cc7..87ef27c 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..645b772 --- /dev/null +++ b/spaceman/prealloc.c @@ -0,0 +1,135 @@ +/* + * 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" + +#ifndef XFS_IOC_FREE_EOFBLOCKS +#define XFS_IOC_FREE_EOFBLOCKS _IOR ('X', 58, struct xfs_eofblocks) + +#define XFS_EOFBLOCKS_VERSION 1 +struct xfs_fs_eofblocks { + __u32 eof_version; + __u32 eof_flags; + uid_t eof_uid; + gid_t eof_gid; + prid_t eof_prid; + __u32 pad32; + __u64 eof_min_file_size; + __u64 pad64[12]; +}; + +/* eof_flags values */ +#define XFS_EOF_FLAGS_SYNC (1 << 0) /* sync/wait mode scan */ +#define XFS_EOF_FLAGS_UID (1 << 1) /* filter by uid */ +#define XFS_EOF_FLAGS_GID (1 << 2) /* filter by gid */ +#define XFS_EOF_FLAGS_PRID (1 << 3) /* filter by project id */ +#define XFS_EOF_FLAGS_MINFILESIZE (1 << 4) /* filter by min file size */ + +#endif + +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 (xfsctl(file->name, 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 -- synchronous flush - wait for flush 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]\n"; + prealloc_cmd.flags = CMD_FLAG_ONESHOT; + prealloc_cmd.oneline = _("Control specualtive 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);