public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
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),

      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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox