public inbox for [email protected]
 help / color / mirror / Atom feed
* io_uring statx fails with AT_EMPTY_PATH
@ 2020-04-27 15:29 Clay Harris
  2020-04-27 16:40 ` Jens Axboe
  0 siblings, 1 reply; 4+ messages in thread
From: Clay Harris @ 2020-04-27 15:29 UTC (permalink / raw)
  To: io-uring

Jens Axboe recommended that I post io_uring stuff to this list.
So, here goes.

https://bugzilla.kernel.org/show_bug.cgi?id=207453

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

* Re: io_uring statx fails with AT_EMPTY_PATH
  2020-04-27 15:29 io_uring statx fails with AT_EMPTY_PATH Clay Harris
@ 2020-04-27 16:40 ` Jens Axboe
  2020-04-27 16:52   ` Jens Axboe
  0 siblings, 1 reply; 4+ messages in thread
From: Jens Axboe @ 2020-04-27 16:40 UTC (permalink / raw)
  To: Clay Harris, io-uring

On 4/27/20 9:29 AM, Clay Harris wrote:
> Jens Axboe recommended that I post io_uring stuff to this list.
> So, here goes.
> 
> https://bugzilla.kernel.org/show_bug.cgi?id=207453

The below should fix it.


diff --git a/fs/io_uring.c b/fs/io_uring.c
index c687f57fb651..084dfade5cda 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -524,6 +524,7 @@ enum {
 	REQ_F_OVERFLOW_BIT,
 	REQ_F_POLLED_BIT,
 	REQ_F_BUFFER_SELECTED_BIT,
+	REQ_F_NO_FILE_TABLE_BIT,
 
 	/* not a real bit, just to check we're not overflowing the space */
 	__REQ_F_LAST_BIT,
@@ -577,6 +578,8 @@ enum {
 	REQ_F_POLLED		= BIT(REQ_F_POLLED_BIT),
 	/* buffer already selected */
 	REQ_F_BUFFER_SELECTED	= BIT(REQ_F_BUFFER_SELECTED_BIT),
+	/* doesn't need file table for this request */
+	REQ_F_NO_FILE_TABLE	= BIT(REQ_F_NO_FILE_TABLE_BIT),
 };
 
 struct async_poll {
@@ -799,6 +802,7 @@ static const struct io_op_def io_op_defs[] = {
 		.needs_file		= 1,
 		.fd_non_neg		= 1,
 		.needs_fs		= 1,
+		.file_table		= 1,
 	},
 	[IORING_OP_READ] = {
 		.needs_mm		= 1,
@@ -3355,8 +3359,12 @@ static int io_statx(struct io_kiocb *req, bool force_nonblock)
 	struct kstat stat;
 	int ret;
 
-	if (force_nonblock)
+	if (force_nonblock) {
+		/* only need file table for an actual valid fd */
+		if (ctx->dfd == -1 || ctx->dfd == AT_FDCWD)
+			req->flags |= REQ_F_NO_FILE_TABLE;
 		return -EAGAIN;
+	}
 
 	if (vfs_stat_set_lookup_flags(&lookup_flags, ctx->how.flags))
 		return -EINVAL;
@@ -5429,7 +5437,7 @@ static int io_grab_files(struct io_kiocb *req)
 	int ret = -EBADF;
 	struct io_ring_ctx *ctx = req->ctx;
 
-	if (req->work.files)
+	if (req->work.files || (req->flags & REQ_F_NO_FILE_TABLE))
 		return 0;
 	if (!ctx->ring_file)
 		return -EBADF;

-- 
Jens Axboe


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

* Re: io_uring statx fails with AT_EMPTY_PATH
  2020-04-27 16:40 ` Jens Axboe
@ 2020-04-27 16:52   ` Jens Axboe
  2020-05-12  8:47     ` Clay Harris
  0 siblings, 1 reply; 4+ messages in thread
From: Jens Axboe @ 2020-04-27 16:52 UTC (permalink / raw)
  To: Clay Harris, io-uring

On 4/27/20 10:40 AM, Jens Axboe wrote:
> On 4/27/20 9:29 AM, Clay Harris wrote:
>> Jens Axboe recommended that I post io_uring stuff to this list.
>> So, here goes.
>>
>> https://bugzilla.kernel.org/show_bug.cgi?id=207453
> 
> The below should fix it.

Added a test case for this to the liburing regression suite as well.

-- 
Jens Axboe


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

* Re: io_uring statx fails with AT_EMPTY_PATH
  2020-04-27 16:52   ` Jens Axboe
@ 2020-05-12  8:47     ` Clay Harris
  0 siblings, 0 replies; 4+ messages in thread
From: Clay Harris @ 2020-05-12  8:47 UTC (permalink / raw)
  To: Jens Axboe; +Cc: io-uring

On Mon, Apr 27 2020 at 10:52:22 -0600, Jens Axboe quoth thus:

> On 4/27/20 10:40 AM, Jens Axboe wrote:
> > On 4/27/20 9:29 AM, Clay Harris wrote:
> >> Jens Axboe recommended that I post io_uring stuff to this list.
> >> So, here goes.
> >>
> >> https://bugzilla.kernel.org/show_bug.cgi?id=207453
> > 
> > The below should fix it.
> 
> Added a test case for this to the liburing regression suite as well.
> 

I have verified that the original bug is fixed as of kernel 5.6.11.

 -- Test 0: statx:fd 3: SUCCEED, file mode 100664
 -- Test 1: statx:path uring_statx.c: SUCCEED, file mode 100664
 -- Test 2: io_uring_statx:fd 3: SUCCEED, file mode 100664
 -- Test 3: io_uring_statx:path uring_statx.c: SUCCEED, file mode 100664
 ---- fd 3 set O_NONBLOCK
 -- Test 4: statx:fd 3 O_NONBLOCK: SUCCEED, file mode 100664
 -- Test 5: io_uring_statx:fd 3 O_NONBLOCK: SUCCEED, file mode 100664

========

I want to note that there are two other issues with io_uring
statx with AT_EMPTY_PATH:

1) Tests 2 and 5 fail (EBADF) if the fd is opened with O_PATH,
   while all of the other tests continue to work fine.

2) io_uring statx returns EBADF when IOSQE_FIXED_FILE is specified,
   but IOSQE_FIXED_FILE + AT_EMPTY_PATH should be a valid combination.

> -- 
> Jens Axboe

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

end of thread, other threads:[~2020-05-12  8:47 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-04-27 15:29 io_uring statx fails with AT_EMPTY_PATH Clay Harris
2020-04-27 16:40 ` Jens Axboe
2020-04-27 16:52   ` Jens Axboe
2020-05-12  8:47     ` Clay Harris

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox