All of lore.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 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.