From aa210c4df0fa1eef84eeb300bb5db0ac228916df Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Tue, 25 Feb 2014 11:52:18 -0800 Subject: [PATCH] xfs_io: add support for flink Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- io/Makefile | 4 +-- io/init.c | 1 + io/io.h | 1 + io/link.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++ man/man8/xfs_io.8 | 3 ++ 5 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 io/link.c diff --git a/io/Makefile b/io/Makefile index eaeb5b2e1..c16af87c7 100644 --- a/io/Makefile +++ b/io/Makefile @@ -9,8 +9,8 @@ LTCOMMAND = xfs_io LSRCFILES = xfs_bmap.sh xfs_freeze.sh xfs_mkfile.sh 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 seek.c shutdown.c \ + attr.c bmap.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 seek.c shutdown.c \ truncate.c LLDLIBS = $(LIBXCMD) $(LIBHANDLE) diff --git a/io/init.c b/io/init.c index 1e2690eb9..bfc35bf97 100644 --- a/io/init.c +++ b/io/init.c @@ -58,6 +58,7 @@ init_commands(void) bmap_init(); fadvise_init(); file_init(); + flink_init(); freeze_init(); fsync_init(); getrusage_init(); diff --git a/io/io.h b/io/io.h index 0d2d76820..1b3bca1e7 100644 --- a/io/io.h +++ b/io/io.h @@ -93,6 +93,7 @@ extern void dump_buffer(off64_t, ssize_t); extern void attr_init(void); extern void bmap_init(void); extern void file_init(void); +extern void flink_init(void); extern void freeze_init(void); extern void fsync_init(void); extern void getrusage_init(void); diff --git a/io/link.c b/io/link.c new file mode 100644 index 000000000..9c2d1f8c6 --- /dev/null +++ b/io/link.c @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2014 Christoph Hellwig. + * 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 +#include +#include +#include "init.h" +#include "io.h" + +#ifndef AT_EMPTY_PATH +#define AT_EMPTY_PATH 0x1000 +#endif + +static cmdinfo_t flink_cmd; + +static void +flink_help(void) +{ + printf(_( +"\n" +"link the open file descriptor to the supplied filename\n" +"\n" +"\n")); +} + +static int +flink_f( + int argc, + char **argv) +{ + if (argc != 2) + return command_usage(&flink_cmd); + + if (linkat(file->fd, "", AT_FDCWD, argv[1], AT_EMPTY_PATH) < 0) { + perror("flink"); + return 0; + } + return 0; +} + +void +flink_init(void) +{ + flink_cmd.name = "flink"; + flink_cmd.cfunc = flink_f; + flink_cmd.argmin = 1; + flink_cmd.argmax = 1; + flink_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK; + flink_cmd.args = _("filename"); + flink_cmd.oneline = + _("link the open file descriptor to the supplied filename"); + flink_cmd.help = flink_help; + + add_command(&flink_cmd); +} diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 index 0dec0b7b5..e1a3e1a41 100644 --- a/man/man8/xfs_io.8 +++ b/man/man8/xfs_io.8 @@ -643,6 +643,9 @@ Only available in expert mode and requires privileges. Undo the effects of a filesystem freeze operation. Only available in expert mode and requires privileges. .TP +.BI "flink " path +Link the currently open file descriptor into the filesystem namespace. +.TP .BI "inject [ " tag " ]" Inject errors into a filesystem to observe filesystem behavior at specific points under adverse conditions. Without the -- 2.47.2