xfs_io: add support for O_TMPFILE opens
PATCH 1/1 xfs_io: add support for O_TMPFILE opens
Add a new -T argument to the open command that supports using the O_TMPFILE flag.
io/io.h +1 -0
@@ -35,6 +35,7 @@#define IO_TRUNC (1<<6)#define IO_FOREIGN (1<<7)#define IO_NONBLOCK (1<<8) +#define IO_TMPFILE (1<<9)/* * Regular file I/O control
io/open.c +31 -3
@@ -22,6 +22,22 @@#include "init.h" #include "io.h" +#ifndef __O_TMPFILE +#if defined __alpha__ +#define __O_TMPFILE 0100000000 +#elif defined(__hppa__) +#define __O_TMPFILE 040000000 +#elif defined(__sparc__) +#define __O_TMPFILE 0x2000000 +#else +#define __O_TMPFILE 020000000 +#endif +#endif /* __O_TMPFILE */ + +#ifndef O_TMPFILE +#define O_TMPFILE (__O_TMPFILE | O_DIRECTORY) +#endif +static cmdinfo_t open_cmd;static cmdinfo_t stat_cmd;static cmdinfo_t close_cmd;
@@ -143,10 +159,13 @@ openfile( oflags |=O_TRUNC ;if (flags &IO_NONBLOCK ) oflags |=O_NONBLOCK ; +if (flags &IO_TMPFILE ) + oflags |=O_TMPFILE ; fd =open (path, oflags, mode);if (fd <0 ) { -if ((errno ==EISDIR ) && (oflags &O_RDWR )) { +if (errno ==EISDIR && + ((oflags & (O_RDWR |O_TMPFILE )) ==O_RDWR )) {/* make it as if we asked for O_RDONLY & try again */ oflags &= ~O_RDWR ; oflags |=O_RDONLY ;
@@ -248,6 +267,7 @@ open_help(void)" -s -- open with O_SYNC\n" " -t -- open with O_TRUNC (truncate the file to zero length if it exists)\n" " -R -- mark the file as a realtime XFS file immediately after opening it\n" +" -T -- open with O_TMPFILE (create a file not visible in the namespace)\n" " Note1: usually read/write direct IO requests must be blocksize aligned;\n" " some kernels, however, allow sectorsize alignment for direct IO.\n" " Note2: the bmap for non-regular files can be obtained provided the file\n"
@@ -272,7 +292,7 @@ open_f(return 0 ; } -while ((c =getopt (argc, argv,"FRacdfm:nrstx" )) !=EOF ) { +while ((c =getopt (argc, argv,"FRTacdfm:nrstx" )) !=EOF ) {switch (c) {case 'F' :/* Ignored / deprecated now, handled automatically */
@@ -310,6 +330,9 @@ open_f(case 'x' :/* backwards compatibility */ flags |=IO_REALTIME ;break ; +case 'T' : + flags |=IO_TMPFILE ; +break ;default :return command_usage (&open_cmd); }
@@ -325,6 +348,11 @@ open_f(if (!platform_test_xfs_fd (fd)) flags |=IO_FOREIGN ; +if ((flags & (IO_READONLY |IO_TMPFILE )) == (IO_READONLY |IO_TMPFILE )) { +fprintf (stderr,_ ("-T and -r options are incompatible\n" )); +return -1 ; + } +addfile (argv[optind], fd, &geometry, flags);return 0 ; }
@@ -731,7 +759,7 @@ open_init(void) open_cmd.argmin =0 ; open_cmd.argmax =-1 ; open_cmd.flags =CMD_NOMAP_OK |CMD_NOFILE_OK |CMD_FOREIGN_OK ; - open_cmd.args =_ ("[-acdrstx] [path]" ); + open_cmd.args =_ ("[-acdrstxT] [path]" ); open_cmd.oneline =_ ("open the file specified by path" ); open_cmd.help = open_help;
man/man8/xfs_io.8 +9 -1
@@ -88,7 +88,7 @@ command for more details on any command. Display a list of all open files and (optionally) switch to an alternate current open file. .TP -.BI "open [[ \-acdfrstR ] " path " ]" +.BI "open [[ \-acdfrstRT ] " path " ]" Closes the current file, and opens the file specified by .I path instead. Without any arguments, displays statistics about the current
@@ -119,6 +119,14 @@ truncates on open (O_TRUNC). .B \-n opens in non-blocking mode if possible (O_NONBLOCK). .TP +.B \-T +create a temporary file not linked into the filesystem namepspace +(O_TMPFILE). The pathname passed must refer to a directory which +is treated as virtual parent for the newly created invisible file. +Can not be used together with the +.B \-r +option. +.TP .B \-R marks the file as a realtime XFS file after opening it, if it is not already marked as such.
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Quoted 4 lines · Christoph Hellwig
Add a new -T argument to the open command that supports using the
O_TMPFILEflag.Signed-off-by Christoph Hellwig <[email protected]>
Can you also push this into the main CLI interface similar to how all the other open flags can be specified? i.e.
$ xfs_io -d -c "pwrite 0 4k" foo
will open "foo" with O_DIRECT. Be nice just to be able to do
$ xfs_io -dT -c "pwrite 0 4k" foo/
to be able to test O_TMPFILE functionality
FWIW, any plans to add a "link" command to be able to link the tmpfile into the namespace once it is created?
Cheers,
Dave.
Signature · 7 lines
Dave Chinner [email protected] _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Quoted 2 lines · Dave Chinner
Can you also push this into the main CLI interface similar to how all the other open flags can be specified?
Sure.
Quoted 2 lines
FWIW, any plans to add a "link" command to be able to link the tmpfile into the namespace once it is created?
I was planning to do that, but as pointed out in my next mail it seems we don't actually have any other namespace commands in xfs_io, so I'm starting to wonder if it's the right place.
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Very minor point, but you've got a typo in the documentation portion of your patch.
+create a temporary file not linked into the filesystem namepspace
Should be "namespace" of course.
Cheers,
-Shaun
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Quoted 5 lines · Shaun Gosse
Very minor point, but you've got a typo in the documentation portion of your patch.
+create a temporary file not linked into the filesystem namepspace
Should be "namespace" of course.
Thanks Shaun, I'll fix it for the next version.
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
PATCH v2 1/1 xfs_io: add support for O_TMPFILE opens
In reply to Christoph HellwigOn Thu, Feb 20, 2014 at 02:00:00PM -0800, Christoph Hellwig wrote:
Add a new -T argument to the open command that supports using the O_TMPFILE flag.
---
Changes from V1:
- fix typo in the man page
- add -T option to the main option parser
- handle IO_TMPFILE in the file and stat commands
io/file.c +3 -2
@@ -36,7 +36,7 @@ print_fileio( int index, int braces) { - printf(_("%c%03d%c %-14s (%s,%s,%s,%s%s%s%s)\n"), + printf(_("%c%03d%c %-14s (%s,%s,%s,%s%s%s%s%s)\n"), braces?'[' :' ' , index, braces?']' :' ' , file->name, file->flags &IO_FOREIGN ?_ ("foreign" ) :_ ("xfs" ), file->flags & IO_OSYNC ? _("sync") : _("non-sync"),
@@ -44,7 +44,8 @@ print_fileio( file->flags &IO_READONLY ?_ ("read-only" ) :_ ("read-write" ), file->flags &IO_REALTIME ?_ (",real-time" ) :"" , file->flags &IO_APPEND ?_ (",append-only" ) :"" , - file->flags & IO_NONBLOCK ? _(",non-block") : ""); + file->flags &IO_NONBLOCK ?_ (",non-block" ) :"" , + file->flags & IO_TMPFILE ? _(",tmpfile") : ""); }int
io/init.c +3 -1
@@ -136,7 +136,7 @@ init( pagesize =getpagesize ();gettimeofday (&stopwatch,NULL ); -while ((c =getopt (argc, argv,"ac:dFfmp:nrRstVx" )) !=EOF ) { +while ((c =getopt (argc, argv,"ac:dFfmp:nrRstTVx" )) !=EOF ) {switch (c) {case 'a' : flags |=IO_APPEND ;
@@ -179,6 +179,8 @@ init(case 'R' : flags |=IO_REALTIME ;break ; +case 'T' : + flags |=IO_TMPFILE ;case 'x' : expert =1 ;break ;
io/io.h +1 -0
@@ -35,6 +35,7 @@#define IO_TRUNC (1<<6)#define IO_FOREIGN (1<<7)#define IO_NONBLOCK (1<<8) +#define IO_TMPFILE (1<<9)/* * Regular file I/O control
io/open.c +34 -5
@@ -22,6 +22,22 @@#include "init.h" #include "io.h" +#ifndef __O_TMPFILE +#if defined __alpha__ +#define __O_TMPFILE 0100000000 +#elif defined(__hppa__) +#define __O_TMPFILE 040000000 +#elif defined(__sparc__) +#define __O_TMPFILE 0x2000000 +#else +#define __O_TMPFILE 020000000 +#endif +#endif /* __O_TMPFILE */ + +#ifndef O_TMPFILE +#define O_TMPFILE (__O_TMPFILE | O_DIRECTORY) +#endif +static cmdinfo_t open_cmd;static cmdinfo_t stat_cmd;static cmdinfo_t close_cmd;
@@ -77,13 +93,14 @@ stat_f(int verbose = (argc ==2 && !strcmp (argv[1 ],"-v" ));printf (_ ("fd.path = \"%s\"\n" ), file->name); -printf (_ ("fd.flags = %s,%s,%s%s%s%s\n" ), +printf (_ ("fd.flags = %s,%s,%s%s%s%s%s\n" ), file->flags &IO_OSYNC ?_ ("sync" ) :_ ("non-sync" ), file->flags &IO_DIRECT ?_ ("direct" ) :_ ("non-direct" ), file->flags &IO_READONLY ?_ ("read-only" ) :_ ("read-write" ), file->flags &IO_REALTIME ?_ (",real-time" ) :"" , file->flags &IO_APPEND ?_ (",append-only" ) :"" , - file->flags &IO_NONBLOCK ?_ (",non-block" ) :"" ); + file->flags &IO_NONBLOCK ?_ (",non-block" ) :"" , + file->flags &IO_TMPFILE ?_ (",tmpfile" ) :"" );if (fstat64 (file->fd, &st) <0 ) {perror ("fstat64" ); }else {
@@ -143,10 +160,13 @@ openfile( oflags |=O_TRUNC ;if (flags &IO_NONBLOCK ) oflags |=O_NONBLOCK ; +if (flags &IO_TMPFILE ) + oflags |=O_TMPFILE ; fd =open (path, oflags, mode);if (fd <0 ) { -if ((errno ==EISDIR ) && (oflags &O_RDWR )) { +if (errno ==EISDIR && + ((oflags & (O_RDWR |O_TMPFILE )) ==O_RDWR )) {/* make it as if we asked for O_RDONLY & try again */ oflags &= ~O_RDWR ; oflags |=O_RDONLY ;
@@ -248,6 +268,7 @@ open_help(void)" -s -- open with O_SYNC\n" " -t -- open with O_TRUNC (truncate the file to zero length if it exists)\n" " -R -- mark the file as a realtime XFS file immediately after opening it\n" +" -T -- open with O_TMPFILE (create a file not visible in the namespace)\n" " Note1: usually read/write direct IO requests must be blocksize aligned;\n" " some kernels, however, allow sectorsize alignment for direct IO.\n" " Note2: the bmap for non-regular files can be obtained provided the file\n"
@@ -272,7 +293,7 @@ open_f(return 0 ; } -while ((c =getopt (argc, argv,"FRacdfm:nrstx" )) !=EOF ) { +while ((c =getopt (argc, argv,"FRTacdfm:nrstx" )) !=EOF ) {switch (c) {case 'F' :/* Ignored / deprecated now, handled automatically */
@@ -310,6 +331,9 @@ open_f(case 'x' :/* backwards compatibility */ flags |=IO_REALTIME ;break ; +case 'T' : + flags |=IO_TMPFILE ; +break ;default :return command_usage (&open_cmd); }
@@ -325,6 +349,11 @@ open_f(if (!platform_test_xfs_fd (fd)) flags |=IO_FOREIGN ; +if ((flags & (IO_READONLY |IO_TMPFILE )) == (IO_READONLY |IO_TMPFILE )) { +fprintf (stderr,_ ("-T and -r options are incompatible\n" )); +return -1 ; + } +addfile (argv[optind], fd, &geometry, flags);return 0 ; }
@@ -731,7 +760,7 @@ open_init(void) open_cmd.argmin =0 ; open_cmd.argmax =-1 ; open_cmd.flags =CMD_NOMAP_OK |CMD_NOFILE_OK |CMD_FOREIGN_OK ; - open_cmd.args =_ ("[-acdrstx] [path]" ); + open_cmd.args =_ ("[-acdrstxT] [path]" ); open_cmd.oneline =_ ("open the file specified by path" ); open_cmd.help = open_help;
man/man8/xfs_io.8 +10 -2
@@ -4,7 +4,7 @@ xfs_io \- debug the I/O path of an XFS filesystem .SH SYNOPSIS .B xfs_io [ -.B \-adfmrRstx +.B \-adfmrRstxT ] [ .B \-c .I cmd
@@ -88,7 +88,7 @@ command for more details on any command. Display a list of all open files and (optionally) switch to an alternate current open file. .TP -.BI "open [[ \-acdfrstR ] " path " ]" +.BI "open [[ \-acdfrstRT ] " path " ]" Closes the current file, and opens the file specified by .I path instead. Without any arguments, displays statistics about the current
@@ -119,6 +119,14 @@ truncates on open (O_TRUNC). .B \-n opens in non-blocking mode if possible (O_NONBLOCK). .TP +.B \-T +create a temporary file not linked into the filesystem namespace +(O_TMPFILE). The pathname passed must refer to a directory which +is treated as virtual parent for the newly created invisible file. +Can not be used together with the +.B \-r +option. +.TP .B \-R marks the file as a realtime XFS file after opening it, if it is not already marked as such.
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Quoted 5 lines · Christoph Hellwig
On Thu, Feb 20, 2014 at 02:00:00PM -0800, Christoph Hellwig wrote:
Add a new -T argument to the open command that supports using theO_TMPFILEflag.Signed-off-by Christoph Hellwig <[email protected]>
Looks good.
Cheers,
Dave.
Signature · 7 lines
Dave Chinner [email protected] _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH] xfs_io: add support for flink
In reply to Christoph Hellwigio/Makefile +2 -2
@@ -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)
io/init.c +1 -0
@@ -58,6 +58,7 @@ init_commands(void)bmap_init ();fadvise_init ();file_init (); +flink_init ();freeze_init ();fsync_init ();getrusage_init ();
io/io.h +1 -0
@@ -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 );
io/link.c new file +70 -0
70 lines not on this page · raw message
man/man8/xfs_io.8 +3 -0
@@ -638,6 +638,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 +.B flink +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
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH] xfs_io: add support for flink
Quoted 2 lines · Christoph Hellwig
Signed-off-by Christoph Hellwig <[email protected]>
.....
io/link.c line 39
Quoted 11 lines
io/link.c new file +11
-0+static cmdinfo_t flink_cmd; + +static void +flink_help (void ) +{ +printf (_ ( +"\n" +"link the open file descriptor into the filesystem\n" +"\n" +"\n" )); +}
"link the open file descriptor to the supplied filename\n"
?
Quoted 20 lines
io/link.c new file +15
-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 into the filesystem" ); + flink_cmd.help = flink_help; + +add_command (&flink_cmd); +}man/man8/xfs_io.8 +0
-0
man/man8/xfs_io.8 Only available in expert mode and requires privileges. · line 643
Quoted 6 lines
man/man8/xfs_io.8 +3
-0@@ -638,6 +638,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 +.B flink +Link the currently open file descriptor into the filesystem namespace. +.TP
And that needs to indicate that a filename needs to be provided, too.
Cheers,
Dave.
Signature · 7 lines
Dave Chinner [email protected] _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v2 1/1 xfs_io: add support for flink
In reply to Christoph Hellwigio/Makefile +2 -2
@@ -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)
io/init.c +1 -0
@@ -58,6 +58,7 @@ init_commands(void)bmap_init ();fadvise_init ();file_init (); +flink_init ();freeze_init ();fsync_init ();getrusage_init ();
io/io.h +1 -0
@@ -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 );
io/link.c new file +70 -0
70 lines not on this page · raw message
man/man8/xfs_io.8 +4 -0
@@ -638,6 +638,10 @@ 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 +Reads a range of bytes in a specified blocksize from the given +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
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH v2] xfs_io: add support for flink
Quoted 1 line · Christoph Hellwig
Signed-off-by Christoph Hellwig <[email protected]>
....
man/man8/xfs_io.8 Only available in expert mode and requires privileges. · line 644
Quoted 10 lines
man/man8/xfs_io.8 +4
-0@@ -638,6 +638,10 @@ 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 +Reads a range of bytes in a specified blocksize from the given +Link the currently open file descriptor into the filesystem namespace. +.TP
Looks like some noise got into that hunk. Other than that:
I'll remove that extra line when I commit it.
Cheers,
Dave.
Signature · 7 lines
Dave Chinner [email protected] _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH v2] xfs_io: add support for flink
Quoted 5 lines · Dave Chinner
Looks like some noise got into that hunk. Other than that:
Reviewed-by Dave Chinner <[email protected]>I'll remove that extra line when I commit it.
ping?
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH v2] xfs_io: add support for flink
Quoted 8 lines · Christoph Hellwig
Quoted 5 lines · Dave Chinner
Looks like some noise got into that hunk. Other than that:
Reviewed-by Dave Chinner <[email protected]>I'll remove that extra line when I commit it.
ping?
Sorry, I missed them in the last round of commits. I'll sort it out.
Cheers,
Dave.
Signature · 7 lines
Dave Chinner [email protected] _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH v2] xfs_io: add support for flink
Quoted 11 lines · Dave Chinner
Quoted 8 lines · Christoph Hellwig
Quoted 5 lines · Dave Chinner
Looks like some noise got into that hunk. Other than that:
Reviewed-by Dave Chinner <[email protected]>I'll remove that extra line when I commit it.
ping?
Sorry, I missed them in the last round of commits. I'll sort it out.
OK, committed and pushed - aa210c4 should be the new head.
Cheers,
Dave.
Signature · 7 lines
Dave Chinner [email protected] _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs