Re: [PATCH] xfs_io: Allow -P and -L to be given to open for O_PATH and O_NOFOLLOW

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 3/29/17 4:52 PM, David Howells wrote:
> Allow "open -P" to specify O_PATH so that paths which would otherwise be
> unopenable might be opened for stat()'ing.  Such things include files that
> would incur an access error or device files for which no corresponding
> driver is available.
> 
> Allow "-L" to be given in conjunction with O_PATH to specify O_NOFOLLOW
> also.

Hey David - 

Trolling through old patches and finding lots of stuff that fell through
the cracks.  :(  This seems ok, but what is the usecase for it?  Was this
designed for some particular testcase?

Thanks,
-Eric

> Signed-off-by: David Howells <dhowells@xxxxxxxxxx>
> ---
>  io/io.h           |    2 ++
>  io/open.c         |   22 ++++++++++++++++++++--
>  man/man8/xfs_io.8 |   12 +++++++++++-
>  3 files changed, 33 insertions(+), 3 deletions(-)
> 
> diff --git a/io/io.h b/io/io.h
> index 952bdb8..4399419 100644
> --- a/io/io.h
> +++ b/io/io.h
> @@ -38,6 +38,8 @@
>  #define IO_FOREIGN	(1<<7)
>  #define IO_NONBLOCK	(1<<8)
>  #define IO_TMPFILE	(1<<9)
> +#define IO_PATH		(1<<10)
> +#define IO_NOFOLLOW	(1<<11)
>  
>  /*
>   * Regular file I/O control
> diff --git a/io/open.c b/io/open.c
> index 2ed55cf..f7f508a 100644
> --- a/io/open.c
> +++ b/io/open.c
> @@ -72,6 +72,10 @@ openfile(
>  		oflags |= O_NONBLOCK;
>  	if (flags & IO_TMPFILE)
>  		oflags |= O_TMPFILE;
> +	if (flags & IO_PATH)
> +		oflags |= O_PATH;
> +	if (flags & IO_NOFOLLOW)
> +		oflags |= O_NOFOLLOW;
>  
>  	fd = open(path, oflags, mode);
>  	if (fd < 0) {
> @@ -179,6 +183,8 @@ open_help(void)
>  " -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"
> +" -P -- open with O_PATH (create an fd that is merely a location reference)\n"
> +" -L -- open with O_NOFOLLOW (don't follow symlink)\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"
> @@ -203,7 +209,7 @@ open_f(
>  		return 0;
>  	}
>  
> -	while ((c = getopt(argc, argv, "FRTacdfm:nrstx")) != EOF) {
> +	while ((c = getopt(argc, argv, "FLPRTacdfm:nrstx")) != EOF) {
>  		switch (c) {
>  		case 'F':
>  			/* Ignored / deprecated now, handled automatically */
> @@ -244,6 +250,12 @@ open_f(
>  		case 'T':
>  			flags |= IO_TMPFILE;
>  			break;
> +		case 'P':
> +			flags |= IO_PATH;
> +			break;
> +		case 'L':
> +			flags |= IO_NOFOLLOW;
> +			break;
>  		default:
>  			return command_usage(&open_cmd);
>  		}
> @@ -257,6 +269,12 @@ open_f(
>  		return -1;
>  	}
>  
> +	if ((flags & (IO_PATH|IO_NOFOLLOW)) &&
> +	    (flags & ~(IO_PATH|IO_NOFOLLOW))) {
> +		fprintf(stderr, _("-P and -L are incompatible with the other options\n"));
> +		return -1;
> +	}
> +
>  	fd = openfile(argv[optind], &geometry, flags, mode);
>  	if (fd < 0)
>  		return 0;
> @@ -772,7 +790,7 @@ open_init(void)
>  	open_cmd.argmax = -1;
>  	open_cmd.flags = CMD_NOMAP_OK | CMD_NOFILE_OK |
>  			 CMD_FOREIGN_OK | CMD_FLAG_ONESHOT;
> -	open_cmd.args = _("[-acdrstxT] [-m mode] [path]");
> +	open_cmd.args = _("[-acdrstxRTPL] [-m mode] [path]");
>  	open_cmd.oneline = _("open the file specified by path");
>  	open_cmd.help = open_help;
>  
> diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8
> index 022f0ea..e77be40 100644
> --- a/man/man8/xfs_io.8
> +++ b/man/man8/xfs_io.8
> @@ -122,7 +122,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 [[ \-acdfrstRT ] " path " ]"
> +.BI "open [[ \-acdfrstRTPL ] " path " ]"
>  Closes the current file, and opens the file specified by
>  .I path
>  instead. Without any arguments, displays statistics about the current
> @@ -164,6 +164,16 @@ option.
>  .B \-R
>  marks the file as a realtime XFS file after
>  opening it, if it is not already marked as such.
> +.TP
> +.B \-P
> +opens the path as a referent only (O_PATH).  This is incompatible with other
> +flags specifying other O_xxx flags apart from
> +.BR \-L .
> +.TP
> +.B \-L
> +doesn't follow symlinks (O_NOFOLLOW).  This is incompatible with other
> +flags specifying other O_xxx flags apart from
> +.BR \-P .
>  .PD
>  .RE
>  .TP
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 



[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux