]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_io: add label command
authorEric Sandeen <sandeen@redhat.com>
Thu, 24 May 2018 19:48:33 +0000 (14:48 -0500)
committerEric Sandeen <sandeen@redhat.com>
Thu, 24 May 2018 19:48:33 +0000 (14:48 -0500)
This adds an online get/set/clear label command to xfs_io.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
io/Makefile
io/init.c
io/io.h
io/label.c [new file with mode: 0644]
man/man8/xfs_io.8

index 88e47517657f40e42df000c78d290c1a29994e34..b40156daa8864ffcc045626004391683e458fba6 100644 (file)
@@ -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)
index 0336c9623beb205927c06f8ff3b7aac8afe15d0f..612962e8b59744c31188b5a5694d6bf9f42d1581 100644 (file)
--- 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 a26763610877117922681001a69c79dfcc1c1381..7f8197caef04eedf49c5398e8d2c17386707c9f8 100644 (file)
--- 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 (file)
index 0000000..0d16354
--- /dev/null
@@ -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);
+}
index c3ab532da03f7d3cb90d3db058fe1977b0d01c32..82ea8c1a2b3fae2f4daf9ee6e8896bb3fe185309 100644 (file)
@@ -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),