All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] xfs_io: Allow "open -P" to specify O_PATH
@ 2017-03-28 14:29 David Howells
  2017-03-29 21:52 ` [PATCH] xfs_io: Allow -P and -L to be given to open for O_PATH and O_NOFOLLOW David Howells
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: David Howells @ 2017-03-28 14:29 UTC (permalink / raw)
  To: linux-xfs
  Cc: dhowells, Andreas Dilger, Christoph Hellwig, linux-fsdevel, Eric Sandeen

xfs_io: Allow "open -P" to specify O_PATH

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.

Signed-off-by: David Howells <dhowells@redhat.com>
---
 io/io.h           |    1 +
 io/open.c         |   13 ++++++++++++-
 man/man8/xfs_io.8 |    6 +++++-
 3 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/io/io.h b/io/io.h
index 952bdb8..b49a133 100644
--- a/io/io.h
+++ b/io/io.h
@@ -38,6 +38,7 @@
 #define IO_FOREIGN	(1<<7)
 #define IO_NONBLOCK	(1<<8)
 #define IO_TMPFILE	(1<<9)
+#define IO_PATH		(1<<10)
 
 /*
  * Regular file I/O control
diff --git a/io/open.c b/io/open.c
index 2ed55cf..9eba8ae 100644
--- a/io/open.c
+++ b/io/open.c
@@ -72,6 +72,8 @@ openfile(
 		oflags |= O_NONBLOCK;
 	if (flags & IO_TMPFILE)
 		oflags |= O_TMPFILE;
+	if (flags & IO_PATH)
+		oflags |= O_PATH;
 
 	fd = open(path, oflags, mode);
 	if (fd < 0) {
@@ -179,6 +181,7 @@ 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"
 " 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 +206,7 @@ open_f(
 		return 0;
 	}
 
-	while ((c = getopt(argc, argv, "FRTacdfm:nrstx")) != EOF) {
+	while ((c = getopt(argc, argv, "FPRTacdfm:nrstx")) != EOF) {
 		switch (c) {
 		case 'F':
 			/* Ignored / deprecated now, handled automatically */
@@ -244,6 +247,9 @@ open_f(
 		case 'T':
 			flags |= IO_TMPFILE;
 			break;
+		case 'P':
+			flags |= IO_PATH;
+			break;
 		default:
 			return command_usage(&open_cmd);
 		}
@@ -257,6 +263,11 @@ open_f(
 		return -1;
 	}
 
+	if ((flags & IO_PATH) && (flags & ~IO_PATH)) {
+		fprintf(stderr, _("-P is incompatible with other options\n"));
+		return -1;
+	}
+
 	fd = openfile(argv[optind], &geometry, flags, mode);
 	if (fd < 0)
 		return 0;
diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8
index 022f0ea..77ba760 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 [[ \-acdfrstRTP ] " 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,10 @@ 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.
 .PD
 .RE
 .TP

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH] xfs_io: Allow -P and -L to be given to open for O_PATH and O_NOFOLLOW
  2017-03-28 14:29 [PATCH] xfs_io: Allow "open -P" to specify O_PATH David Howells
@ 2017-03-29 21:52 ` David Howells
  2018-03-02  3:27   ` Eric Sandeen
  2017-03-29 23:57 ` The XFS_IOC_FSGEOMETRY ioctl doesn't like fds that are opened O_PATH David Howells
  2017-03-30 16:29 ` [PATCH] xfs_io: Allow "open -P" to specify O_PATH Eric Sandeen
  2 siblings, 1 reply; 9+ messages in thread
From: David Howells @ 2017-03-29 21:52 UTC (permalink / raw)
  To: linux-xfs
  Cc: dhowells, Andreas Dilger, Christoph Hellwig, linux-fsdevel, Eric Sandeen

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.

Signed-off-by: David Howells <dhowells@redhat.com>
---
 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

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* The XFS_IOC_FSGEOMETRY ioctl doesn't like fds that are opened O_PATH
  2017-03-28 14:29 [PATCH] xfs_io: Allow "open -P" to specify O_PATH David Howells
  2017-03-29 21:52 ` [PATCH] xfs_io: Allow -P and -L to be given to open for O_PATH and O_NOFOLLOW David Howells
@ 2017-03-29 23:57 ` David Howells
  2017-03-30  0:23   ` Darrick J. Wong
  2017-03-30 16:29 ` [PATCH] xfs_io: Allow "open -P" to specify O_PATH Eric Sandeen
  2 siblings, 1 reply; 9+ messages in thread
From: David Howells @ 2017-03-29 23:57 UTC (permalink / raw)
  To: linux-xfs
  Cc: dhowells, Andreas Dilger, Christoph Hellwig, linux-fsdevel, Eric Sandeen

Should XFS_IOC_FSGEOMETRY work on fds that are opened O_PATH on an XFS
filesystem?  Or should xfs_io not call that ioctl on O_PATH fds?

David

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: The XFS_IOC_FSGEOMETRY ioctl doesn't like fds that are opened O_PATH
  2017-03-29 23:57 ` The XFS_IOC_FSGEOMETRY ioctl doesn't like fds that are opened O_PATH David Howells
@ 2017-03-30  0:23   ` Darrick J. Wong
  2017-03-30  2:56     ` Eric Biggers
  2017-03-30  8:03     ` David Howells
  0 siblings, 2 replies; 9+ messages in thread
From: Darrick J. Wong @ 2017-03-30  0:23 UTC (permalink / raw)
  To: David Howells
  Cc: linux-xfs, Andreas Dilger, Christoph Hellwig, linux-fsdevel,
	Eric Sandeen

On Thu, Mar 30, 2017 at 12:57:08AM +0100, David Howells wrote:
> Should XFS_IOC_FSGEOMETRY work on fds that are opened O_PATH on an XFS
> filesystem?  Or should xfs_io not call that ioctl on O_PATH fds?

Given that read/write don't work under O_PATH, I wouldn't expect ioctls
to work either.

I tried to write a two line program to call FSGEOMETRY to see what
actually happens but got so bogged down in trying to figure out what
magic incantation of C headers one needs to pull in the appropriate
structure typedefs for an ioctl I wasn't even trying to call that I gave
up.

Seriously, what the f*ck do you have to #include just to be able to use
O_PATH?

--D

> 
> David
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: The XFS_IOC_FSGEOMETRY ioctl doesn't like fds that are opened O_PATH
  2017-03-30  0:23   ` Darrick J. Wong
@ 2017-03-30  2:56     ` Eric Biggers
  2017-03-30  3:25       ` Darrick J. Wong
  2017-03-30  8:03     ` David Howells
  1 sibling, 1 reply; 9+ messages in thread
From: Eric Biggers @ 2017-03-30  2:56 UTC (permalink / raw)
  To: Darrick J. Wong
  Cc: David Howells, linux-xfs, Andreas Dilger, Christoph Hellwig,
	linux-fsdevel, Eric Sandeen

On Wed, Mar 29, 2017 at 05:23:28PM -0700, Darrick J. Wong wrote:
> On Thu, Mar 30, 2017 at 12:57:08AM +0100, David Howells wrote:
> > Should XFS_IOC_FSGEOMETRY work on fds that are opened O_PATH on an XFS
> > filesystem?  Or should xfs_io not call that ioctl on O_PATH fds?
> 
> Given that read/write don't work under O_PATH, I wouldn't expect ioctls
> to work either.
> 
> I tried to write a two line program to call FSGEOMETRY to see what
> actually happens but got so bogged down in trying to figure out what
> magic incantation of C headers one needs to pull in the appropriate
> structure typedefs for an ioctl I wasn't even trying to call that I gave
> up.
> 
> Seriously, what the f*ck do you have to #include just to be able to use
> O_PATH?

>From open(2):

      "The O_DIRECT, O_NOATIME, O_PATH, and  O_TMPFILE  flags  are
      Linux-specific.  One must define _GNU_SOURCE to obtain their definitions."

Also, ioctl() with an O_PATH file descriptor always fails with EBADF because
sys_ioctl() uses fdget() rather than fdget_raw().  The filesystem isn't involved
at all.  This is intentional, I believe.

- Eric

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: The XFS_IOC_FSGEOMETRY ioctl doesn't like fds that are opened O_PATH
  2017-03-30  2:56     ` Eric Biggers
@ 2017-03-30  3:25       ` Darrick J. Wong
  0 siblings, 0 replies; 9+ messages in thread
From: Darrick J. Wong @ 2017-03-30  3:25 UTC (permalink / raw)
  To: Eric Biggers
  Cc: David Howells, linux-xfs, Andreas Dilger, Christoph Hellwig,
	linux-fsdevel, Eric Sandeen

On Wed, Mar 29, 2017 at 07:56:20PM -0700, Eric Biggers wrote:
> On Wed, Mar 29, 2017 at 05:23:28PM -0700, Darrick J. Wong wrote:
> > On Thu, Mar 30, 2017 at 12:57:08AM +0100, David Howells wrote:
> > > Should XFS_IOC_FSGEOMETRY work on fds that are opened O_PATH on an XFS
> > > filesystem?  Or should xfs_io not call that ioctl on O_PATH fds?
> > 
> > Given that read/write don't work under O_PATH, I wouldn't expect ioctls
> > to work either.
> > 
> > I tried to write a two line program to call FSGEOMETRY to see what
> > actually happens but got so bogged down in trying to figure out what
> > magic incantation of C headers one needs to pull in the appropriate
> > structure typedefs for an ioctl I wasn't even trying to call that I gave
> > up.
> > 
> > Seriously, what the f*ck do you have to #include just to be able to use
> > O_PATH?
> 
> From open(2):
> 
>       "The O_DIRECT, O_NOATIME, O_PATH, and  O_TMPFILE  flags  are
>       Linux-specific.  One must define _GNU_SOURCE to obtain their definitions."

Ah, thank you.  I missed that, having skipped straight to the section on
O_PATH... ($deity I hate userspace)

> Also, ioctl() with an O_PATH file descriptor always fails with EBADF because
> sys_ioctl() uses fdget() rather than fdget_raw().  The filesystem isn't involved
> at all.  This is intentional, I believe.

Yes, it is.

--D

> 
> - Eric

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: The XFS_IOC_FSGEOMETRY ioctl doesn't like fds that are opened O_PATH
  2017-03-30  0:23   ` Darrick J. Wong
  2017-03-30  2:56     ` Eric Biggers
@ 2017-03-30  8:03     ` David Howells
  1 sibling, 0 replies; 9+ messages in thread
From: David Howells @ 2017-03-30  8:03 UTC (permalink / raw)
  To: Eric Biggers
  Cc: dhowells, Darrick J. Wong, linux-xfs, Andreas Dilger,
	Christoph Hellwig, linux-fsdevel, Eric Sandeen

Eric Biggers <ebiggers3@gmail.com> wrote:

> Also, ioctl() with an O_PATH file descriptor always fails with EBADF because
> sys_ioctl() uses fdget() rather than fdget_raw().  The filesystem isn't
> involved at all.  This is intentional, I believe.

Yeah.  Apparently so, though some ioctls might make sense if they're asking
about the filesystem.

Anyway, I need to fix xfs_io for that now too if I'm going to use that.  I
wonder what xfs_io needs the geometry for.

I'm getting the impression xfs_io isn't really the tool I should be using for
this.

Dvid

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] xfs_io: Allow "open -P" to specify O_PATH
  2017-03-28 14:29 [PATCH] xfs_io: Allow "open -P" to specify O_PATH David Howells
  2017-03-29 21:52 ` [PATCH] xfs_io: Allow -P and -L to be given to open for O_PATH and O_NOFOLLOW David Howells
  2017-03-29 23:57 ` The XFS_IOC_FSGEOMETRY ioctl doesn't like fds that are opened O_PATH David Howells
@ 2017-03-30 16:29 ` Eric Sandeen
  2 siblings, 0 replies; 9+ messages in thread
From: Eric Sandeen @ 2017-03-30 16:29 UTC (permalink / raw)
  To: David Howells, linux-xfs; +Cc: Andreas Dilger, Christoph Hellwig, linux-fsdevel

On 3/28/17 10:29 AM, David Howells wrote:
> xfs_io: Allow "open -P" to specify O_PATH
> 
> 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.

Given all the trouble you ran into with this (and I guess I'm not too surprised),
it might make more sense to change stat_f() and statx_f() to be able
to take a pathname separate from the target pathname on the xfs_io
commandline, i.e. something like:

xfs_io -c "stat foo"

instead of 

xfs_io -P -c "stat" foo

-Eric

> Signed-off-by: David Howells <dhowells@redhat.com>
> ---
>  io/io.h           |    1 +
>  io/open.c         |   13 ++++++++++++-
>  man/man8/xfs_io.8 |    6 +++++-
>  3 files changed, 18 insertions(+), 2 deletions(-)
> 
> diff --git a/io/io.h b/io/io.h
> index 952bdb8..b49a133 100644
> --- a/io/io.h
> +++ b/io/io.h
> @@ -38,6 +38,7 @@
>  #define IO_FOREIGN	(1<<7)
>  #define IO_NONBLOCK	(1<<8)
>  #define IO_TMPFILE	(1<<9)
> +#define IO_PATH		(1<<10)
>  
>  /*
>   * Regular file I/O control
> diff --git a/io/open.c b/io/open.c
> index 2ed55cf..9eba8ae 100644
> --- a/io/open.c
> +++ b/io/open.c
> @@ -72,6 +72,8 @@ openfile(
>  		oflags |= O_NONBLOCK;
>  	if (flags & IO_TMPFILE)
>  		oflags |= O_TMPFILE;
> +	if (flags & IO_PATH)
> +		oflags |= O_PATH;
>  
>  	fd = open(path, oflags, mode);
>  	if (fd < 0) {
> @@ -179,6 +181,7 @@ 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"
>  " 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 +206,7 @@ open_f(
>  		return 0;
>  	}
>  
> -	while ((c = getopt(argc, argv, "FRTacdfm:nrstx")) != EOF) {
> +	while ((c = getopt(argc, argv, "FPRTacdfm:nrstx")) != EOF) {
>  		switch (c) {
>  		case 'F':
>  			/* Ignored / deprecated now, handled automatically */
> @@ -244,6 +247,9 @@ open_f(
>  		case 'T':
>  			flags |= IO_TMPFILE;
>  			break;
> +		case 'P':
> +			flags |= IO_PATH;
> +			break;
>  		default:
>  			return command_usage(&open_cmd);
>  		}
> @@ -257,6 +263,11 @@ open_f(
>  		return -1;
>  	}
>  
> +	if ((flags & IO_PATH) && (flags & ~IO_PATH)) {
> +		fprintf(stderr, _("-P is incompatible with other options\n"));
> +		return -1;
> +	}
> +
>  	fd = openfile(argv[optind], &geometry, flags, mode);
>  	if (fd < 0)
>  		return 0;
> diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8
> index 022f0ea..77ba760 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 [[ \-acdfrstRTP ] " 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,10 @@ 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.
>  .PD
>  .RE
>  .TP
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] xfs_io: Allow -P and -L to be given to open for O_PATH and O_NOFOLLOW
  2017-03-29 21:52 ` [PATCH] xfs_io: Allow -P and -L to be given to open for O_PATH and O_NOFOLLOW David Howells
@ 2018-03-02  3:27   ` Eric Sandeen
  0 siblings, 0 replies; 9+ messages in thread
From: Eric Sandeen @ 2018-03-02  3:27 UTC (permalink / raw)
  To: David Howells, linux-xfs; +Cc: Andreas Dilger, Christoph Hellwig, linux-fsdevel

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@redhat.com>
> ---
>  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@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2018-03-02  3:27 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-03-28 14:29 [PATCH] xfs_io: Allow "open -P" to specify O_PATH David Howells
2017-03-29 21:52 ` [PATCH] xfs_io: Allow -P and -L to be given to open for O_PATH and O_NOFOLLOW David Howells
2018-03-02  3:27   ` Eric Sandeen
2017-03-29 23:57 ` The XFS_IOC_FSGEOMETRY ioctl doesn't like fds that are opened O_PATH David Howells
2017-03-30  0:23   ` Darrick J. Wong
2017-03-30  2:56     ` Eric Biggers
2017-03-30  3:25       ` Darrick J. Wong
2017-03-30  8:03     ` David Howells
2017-03-30 16:29 ` [PATCH] xfs_io: Allow "open -P" to specify O_PATH Eric Sandeen

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.