All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Sandeen <sandeen@sandeen.net>
To: Eric Sandeen <sandeen@redhat.com>, linux-xfs <linux-xfs@vger.kernel.org>
Subject: [PATCH 5/5 V3] xfs_io: add label command
Date: Thu, 17 May 2018 10:22:09 -0500	[thread overview]
Message-ID: <9cee370a-41e2-6dae-4ae1-97fbd7393d38@sandeen.net> (raw)
In-Reply-To: <0f9a7c17-233c-042a-5449-acd7e0a27316@sandeen.net>

This adds an online get/set/clear label command to xfs_io.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---

V2: Set exitcode rather than error return on ioctl failure
     fix ioctl definitions o_O

V3: add option parsing to handle -s (set) and -c (clear)

diff --git a/io/Makefile b/io/Makefile
index 88e47517..b40156da 100644
--- a/io/Makefile
+++ b/io/Makefile
@@ -10,9 +10,9 @@ LSRCFILES = xfs_bmap.sh xfs_freeze.sh xfs_mkfile.sh
  HFILES = init.h io.h
  CFILES = init.c \
  	attr.c bmap.c cowextsize.c encrypt.c file.c freeze.c fsync.c \
-	getrusage.c imap.c link.c mmap.c open.c parent.c pread.c prealloc.c \
-	pwrite.c reflink.c scrub.c seek.c shutdown.c stat.c swapext.c sync.c \
-	truncate.c utimes.c
+	getrusage.c imap.c label.c link.c mmap.c open.c parent.c pread.c \
+	prealloc.c pwrite.c reflink.c scrub.c seek.c shutdown.c stat.c \
+	swapext.c sync.c truncate.c utimes.c
  
  LLDLIBS = $(LIBXCMD) $(LIBHANDLE) $(LIBFROG) $(LIBPTHREAD)
  LTDEPENDENCIES = $(LIBXCMD) $(LIBHANDLE) $(LIBFROG)
diff --git a/io/init.c b/io/init.c
index 0336c962..612962e8 100644
--- a/io/init.c
+++ b/io/init.c
@@ -72,6 +72,7 @@ init_commands(void)
  	help_init();
  	imap_init();
  	inject_init();
+	label_init();
  	log_writes_init();
  	madvise_init();
  	mincore_init();
diff --git a/io/io.h b/io/io.h
index a2676361..7f8197ca 100644
--- a/io/io.h
+++ b/io/io.h
@@ -109,6 +109,7 @@ extern void		getrusage_init(void);
  extern void		help_init(void);
  extern void		imap_init(void);
  extern void		inject_init(void);
+extern void		label_init(void);
  extern void		mmap_init(void);
  extern void		open_init(void);
  extern void		parent_init(void);
diff --git a/io/label.c b/io/label.c
new file mode 100644
index 00000000..0d163548
--- /dev/null
+++ b/io/label.c
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2018 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 <sys/ioctl.h>
+#include <sys/mount.h>
+#include "platform_defs.h"
+#include "libxfs.h"
+#include "path.h"
+#include "command.h"
+#include "init.h"
+#include "io.h"
+
+#ifndef FS_IOC_GETFSLABEL
+/* Max chars for the interface; fs limits may differ */
+#define FSLABEL_MAX 256
+#define FS_IOC_GETFSLABEL		_IOR(0x94, 49, char[FSLABEL_MAX])
+#define FS_IOC_SETFSLABEL		_IOW(0x94, 50, char[FSLABEL_MAX])
+#endif
+
+static cmdinfo_t label_cmd;
+
+static void
+label_help(void)
+{
+	printf(_(
+"\n"
+" Manipulate or query the filesystem label while mounted.\n"
+"\n"
+" With no arguments, displays the current filesystem label.\n"
+" -s newlabel -- set the filesystem label to newlabel\n"
+" -c          -- clear the filesystem label (sets to NULL string)\n"
+"\n"));
+}
+
+static int
+label_f(
+	int		argc,
+	char		**argv)
+{
+	int		c;
+	int		error;
+	char		label[FSLABEL_MAX];
+
+	if (argc == 1) {
+		memset(label, 0, sizeof(label));
+		error = ioctl(file->fd, FS_IOC_GETFSLABEL, &label);
+		goto out;
+	}
+
+	while ((c = getopt(argc, argv, "cs:")) != EOF) {
+		switch (c) {
+		case 'c':
+			label[0] = '\0';
+			break;
+		case 's':
+			strncpy(label, optarg, sizeof(label));
+			break;
+		default:
+			return command_usage(&label_cmd);
+		}
+	}
+
+	/* Check for trailing arguments */
+	if (argc != optind)
+		return command_usage(&label_cmd);
+
+	error = ioctl(file->fd, FS_IOC_SETFSLABEL, label);
+out:
+	if (error) {
+		perror("label");
+		exitcode = 1;
+	} else {
+		printf("label = \"%s\"\n", label);
+	}
+
+	return 0;
+}
+
+void
+label_init(void)
+{
+	label_cmd.name = "label";
+	label_cmd.cfunc = label_f;
+	label_cmd.argmin = 0;
+	label_cmd.argmax = 3;
+	label_cmd.args = _("[-s label|-c]");
+	label_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK;
+	label_cmd.oneline =
+		_("query, set, or clear the filesystem label while mounted");
+	label_cmd.help = label_help;
+
+	add_command(&label_cmd);
+}
diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8
index c3ab532d..82ea8c1a 100644
--- a/man/man8/xfs_io.8
+++ b/man/man8/xfs_io.8
@@ -1175,6 +1175,19 @@ This is intended to be equivalent to the shell command:
  See the
  .B log_writes
  command.
+.TP
+.BI "label" " " "[ -c | -s " label " ] "
+On filesystems that support online label manipulation, get, set, or clear the
+filesystem label.  With no options, print the current filesystem label.  The
+.B \-c
+option clears the filesystem label by setting it to the null string.  The
+.BI "\-s " label
+option sets the filesystem label to
+.IR label .
+If the label is longer than the filesystem will accept,
+.B xfs_io
+will print an error message.  XFS filesystem labels can be at most 12
+characters long.
  .SH SEE ALSO
  .BR mkfs.xfs (8),
  .BR xfsctl (3),


  parent reply	other threads:[~2018-05-17 15:22 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-05-14 17:30 [PATCH V2 0/5] xfs: online label Eric Sandeen
2018-05-14 17:35 ` [PATCH V2 1/5] fs: copy BTRFS_IOC_[SG]ET_FSLABEL to vfs Eric Sandeen
2018-05-14 17:37   ` Darrick J. Wong
2018-05-14 17:36 ` [PATCH 2/4] xfs: New function for secondary superblock updates Eric Sandeen
2018-05-15 20:17   ` Darrick J. Wong
2018-05-14 17:39 ` [PATCH 3/5 V2] xfs: implement online get/set fs label Eric Sandeen
2018-05-15  1:07   ` Darrick J. Wong
2018-05-16  1:04     ` Darrick J. Wong
2018-05-14 17:42 ` [PATCH 4/5] btrfs: use common label ioctl definitions Eric Sandeen
2018-05-14 21:41   ` Darrick J. Wong
2018-05-14 17:43 ` [PATCH 5/5] xfs_io: add label command Eric Sandeen
2018-05-15  4:32   ` Dave Chinner
2018-05-15 15:06     ` Eric Sandeen
2018-05-16  0:57       ` Dave Chinner
2018-05-15 15:32   ` [PATCH 5/5 V2] " Eric Sandeen
2018-05-15 20:12     ` Darrick J. Wong
2018-05-17 15:22     ` Eric Sandeen [this message]
2018-05-17 21:56       ` [PATCH 5/5 V3] " Dave Chinner

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=9cee370a-41e2-6dae-4ae1-97fbd7393d38@sandeen.net \
    --to=sandeen@sandeen.net \
    --cc=linux-xfs@vger.kernel.org \
    --cc=sandeen@redhat.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.