From: Ruben Porras <ruben.porras@linworks.de>
To: xfs@oss.sgi.com
Subject: Re: [PATCH] Implement ioctl to mark AGs as "don't use/use"
Date: Mon, 03 Sep 2007 11:20:39 +0200 [thread overview]
Message-ID: <46DBD1E7.4030701@linworks.de> (raw)
In-Reply-To: <20070629005417.GF31489@sgi.com>
[-- Attachment #1: Type: text/plain, Size: 471 bytes --]
David Chinner wrote:
> OOC, do you have any test code for this? xfs_io would be the tool to
> teach this ioctl to....
>
I've implemented this on xfs_io, and tested, and it works :)
Attached are the modifications needed to the xfsprogs source tree in form of a diff against the CVS tree.
In a short time all the patches that I submitted will be available together under an url, so that they are not scattered across the mailing list.
--
Rubén Porras
LinWorks GmbH
[-- Attachment #2: xfsprogs.diff --]
[-- Type: text/x-patch, Size: 7108 bytes --]
diff -rNu xfs-cmds/xfsprogs/include/xfs_ag.h /home/ldap/campo/xfs-cmds/xfsprogs/include/xfs_ag.h
--- xfs-cmds/xfsprogs/include/xfs_ag.h 2007-05-22 17:59:41.000000000 +0200
+++ /home/ldap/campo/xfs-cmds/xfsprogs/include/xfs_ag.h 2007-08-31 14:08:51.975160695 +0200
@@ -69,6 +69,7 @@
__be32 agf_freeblks; /* total free blocks */
__be32 agf_longest; /* longest free space */
__be32 agf_btreeblks; /* # of blocks held in AGF btrees */
+ __be32 agf_flags; /* persistent AG state flags */
} xfs_agf_t;
#define XFS_AGF_MAGICNUM 0x00000001
@@ -83,7 +84,8 @@
#define XFS_AGF_FREEBLKS 0x00000200
#define XFS_AGF_LONGEST 0x00000400
#define XFS_AGF_BTREEBLKS 0x00000800
-#define XFS_AGF_NUM_BITS 12
+#define XFS_AGF_FLAGS 0x00001000
+#define XFS_AGF_NUM_BITS 13
#define XFS_AGF_ALL_BITS ((1 << XFS_AGF_NUM_BITS) - 1)
/* disk block (xfs_daddr_t) in the AG */
@@ -196,8 +198,17 @@
lock_t pagb_lock; /* lock for pagb_list */
#endif
xfs_perag_busy_t *pagb_list; /* unstable blocks */
+ __u32 pagf_flags; /* persistent AG state flags */
} xfs_perag_t;
+typedef struct xfs_ioc_agflags
+{
+ xfs_agnumber_t ag;
+ __u32 flags;
+} xfs_ioc_agflags_t;
+
+#define XFS_AGF_FLAGS_ALLOC_DENY (1<<0)
+
#define XFS_AG_MAXLEVELS(mp) ((mp)->m_ag_maxlevels)
#define XFS_MIN_FREELIST_RAW(bl,cl,mp) \
(MIN(bl + 1, XFS_AG_MAXLEVELS(mp)) + MIN(cl + 1, XFS_AG_MAXLEVELS(mp)))
diff -rNu xfs-cmds/xfsprogs/include/xfs_fs.h /home/ldap/campo/xfs-cmds/xfsprogs/include/xfs_fs.h
--- xfs-cmds/xfsprogs/include/xfs_fs.h 2007-06-28 18:00:13.000000000 +0200
+++ /home/ldap/campo/xfs-cmds/xfsprogs/include/xfs_fs.h 2007-08-31 15:19:21.107148402 +0200
@@ -499,6 +499,8 @@
#define XFS_IOC_ATTRMULTI_BY_HANDLE _IOW ('X', 123, struct xfs_fsop_attrmulti_handlereq)
#define XFS_IOC_FSGEOMETRY _IOR ('X', 124, struct xfs_fsop_geom)
#define XFS_IOC_GOINGDOWN _IOR ('X', 125, __uint32_t)
+#define XFS_IOC_GET_AGF_FLAGS _IOWR('X', 126, struct xfs_ioc_agflags)
+#define XFS_IOC_SET_AGF_FLAGS _IOW ('X', 127, struct xfs_ioc_agflags)
/* XFS_IOC_GETFSUUID ---------- deprecated 140 */
diff -rNu xfs-cmds/xfsprogs/io/agflags.c /home/ldap/campo/xfs-cmds/xfsprogs/io/agflags.c
--- xfs-cmds/xfsprogs/io/agflags.c 1970-01-01 01:00:00.000000000 +0100
+++ /home/ldap/campo/xfs-cmds/xfsprogs/io/agflags.c 2007-08-31 13:56:48.861921728 +0200
@@ -0,0 +1,126 @@
+ /*
+ * Copyright (c) 2007 Silicon Graphics, 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 <xfs/xfs.h>
+#include <xfs/command.h>
+#include <xfs/input.h>
+#include <xfs/xfs_types.h>
+#include <xfs/xfs_inum.h>
+#include <xfs/xfs_ag.h>
+#include "init.h"
+#include "io.h"
+
+static cmdinfo_t agflags_cmd;
+
+static void
+agflags_help(void)
+{
+ printf(_(
+"\n"
+" get or set the diferent flags of a given AG\n"
+"\n"
+" Example:\n"
+" 'agflags -d 0 -a 10' - unset the flag XFS_AGF_FLAGS_ALLOC_DENY from the AG\n"
+" number 10\n"
+"\n"));
+}
+
+int
+agflags_valid_ag(
+ int ag)
+{
+ xfs_fsop_geom_t fsgeo;
+
+ if (ag < 0)
+ return 0;
+
+ if (xfsctl(file->name, file->fd, XFS_IOC_FSGEOMETRY, &fsgeo) < 0) {
+ fprintf(stderr, _("%s: cannot get geometry of fs: %s\n"),
+ progname, strerror(errno));
+ exitcode = 1;
+ return 0;
+ }
+
+ return (ag <= fsgeo.agcount);
+}
+
+int
+agflags_f(
+ int argc,
+ char **argv)
+{
+ xfs_ioc_agflags_t ioc_flags;
+ unsigned int dflag;
+ int opt;
+ int set = 0;
+
+ while ((opt = getopt(argc, argv, "d:a:")) != -1) {
+ switch (opt) {
+ case 'a': /* AG number. */
+ ioc_flags.ag = atoi(optarg);
+ break;
+ case 'd': /* (Un)set XFS_AGF_FLAGS_ALLOC_DENY */
+ dflag = atoi(optarg);
+ if (dflag != 0 && dflag != 1)
+ return command_usage(&agflags_cmd);
+ set = 1;
+ break;
+ default: /* ? */
+ return command_usage(&agflags_cmd);
+ }
+ }
+
+ if (! agflags_valid_ag(ioc_flags.ag)) {
+ fprintf(stderr, _("%s: AG number %d is not valid\n"),
+ progname, ioc_flags.ag);
+ return 0;
+ }
+
+ if (set)
+ ioc_flags.flags = dflag;
+
+ int ioctl;
+ ioctl = set ? XFS_IOC_SET_AGF_FLAGS : XFS_IOC_GET_AGF_FLAGS;
+
+ if (xfsctl(file->name, file->fd, ioctl, &ioc_flags) < 0) {
+ fprintf(stderr,
+ _("%s: cannot %s flags %d on ag %d at %s: %s\n"),
+ progname, set ? "get" : "set", ioc_flags.flags,
+ ioc_flags.ag, file->name, strerror(errno));
+ exitcode = 1;
+ return 0;
+ }
+
+ return 0;
+}
+
+void
+agflags_init(void)
+{
+ agflags_cmd.name = _("agflags");
+ agflags_cmd.cfunc = agflags_f;
+ agflags_cmd.argmin = 2;
+ agflags_cmd.argmax = 4;
+ agflags_cmd.flags = CMD_NOMAP_OK;
+ agflags_cmd.args = _("[-d 0|1] -a agno");
+ agflags_cmd.oneline = _("Get or set the flags of an AG");
+ agflags_cmd.help = agflags_help;
+
+ if (expert)
+ add_command(&agflags_cmd);
+}
diff -rNu xfs-cmds/xfsprogs/io/init.c /home/ldap/campo/xfs-cmds/xfsprogs/io/init.c
--- xfs-cmds/xfsprogs/io/init.c 2007-07-24 18:07:17.000000000 +0200
+++ /home/ldap/campo/xfs-cmds/xfsprogs/io/init.c 2007-08-31 14:10:19.697443490 +0200
@@ -54,6 +54,7 @@
static void
init_commands(void)
{
+ agflags_init();
attr_init();
bmap_init();
fadvise_init();
diff -rNu xfs-cmds/xfsprogs/io/Makefile /home/ldap/campo/xfs-cmds/xfsprogs/io/Makefile
--- xfs-cmds/xfsprogs/io/Makefile 2006-06-17 08:12:23.000000000 +0200
+++ /home/ldap/campo/xfs-cmds/xfsprogs/io/Makefile 2007-08-13 10:42:08.536364577 +0200
@@ -10,7 +10,8 @@
HFILES = init.h io.h
CFILES = init.c \
attr.c bmap.c file.c freeze.c fsync.c getrusage.c imap.c mmap.c \
- open.c parent.c pread.c prealloc.c pwrite.c shutdown.c truncate.c
+ open.c parent.c pread.c prealloc.c pwrite.c shutdown.c truncate.c \
+ agflags.c
LLDLIBS = $(LIBXCMD) $(LIBHANDLE)
LTDEPENDENCIES = $(LIBXCMD) $(LIBHANDLE)
diff -rNu xfs-cmds/xfsprogs/man/man8/xfs_io.8 /home/ldap/campo/xfs-cmds/xfsprogs/man/man8/xfs_io.8
--- xfs-cmds/xfsprogs/man/man8/xfs_io.8 2007-07-27 17:49:00.000000000 +0200
+++ /home/ldap/campo/xfs-cmds/xfsprogs/man/man8/xfs_io.8 2007-08-31 14:05:51.175595207 +0200
@@ -524,6 +524,15 @@
.IP
.B [NOTE: Not currently operational on Linux.]
.PD
+.TP
+.BR agflags " [ \-d " 0|1 " ] \-a " agno
+This command get or set the different flags of the given AG. In moment the
+only modifiable flag is XFS_AGF_FLAGS_ALLOC_DENY.
+.RS 1.0i
+.PD 0
+.TP 0.4i
+.B \-d
+0 or 1 to (un)set XFS_AGF_FLAGS_ALLOC_DENY.
.SH SEE ALSO
.BR mkfs.xfs (8),
prev parent reply other threads:[~2007-09-03 9:20 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-06-27 10:15 [PATCH] Implement ioctl to mark AGs as "don't use/use" Ruben Porras
2007-06-28 4:50 ` David Chinner
2007-06-28 10:25 ` Ruben Porras
2007-06-29 0:35 ` David Chinner
2007-06-29 0:54 ` David Chinner
2007-09-03 9:20 ` Ruben Porras [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=46DBD1E7.4030701@linworks.de \
--to=ruben.porras@linworks.de \
--cc=xfs@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.