From: David Laight <[email protected]>
To: 'Lennert Buytenhek' <[email protected]>,
Al Viro <[email protected]>
Cc: Jens Axboe <[email protected]>,
"[email protected]" <[email protected]>,
"[email protected]" <[email protected]>,
"[email protected]" <[email protected]>,
"[email protected]" <[email protected]>
Subject: RE: [RFC PATCH] io_uring: add support for IORING_OP_GETDENTS64
Date: Fri, 29 Jan 2021 09:41:36 +0000 [thread overview]
Message-ID: <[email protected]> (raw)
In-Reply-To: <[email protected]>
From: Lennert Buytenhek
> Sent: 28 January 2021 23:07
>
> On Sun, Jan 24, 2021 at 10:21:38PM +0000, David Laight wrote:
>
> > > One open question is whether IORING_OP_GETDENTS64 should be more like
> > > pread(2) and allow passing in a starting offset to read from the
> > > directory from. (This would require some more surgery in fs/readdir.c.)
> >
> > Since directories are seekable this ought to work.
> > Modulo horrid issues with 32bit file offsets.
>
> The incremental patch below does this. (It doesn't apply cleanly on
> top of v1 of the IORING_OP_GETDENTS patch as I have other changes in
> my tree -- I'm including it just to illustrate the changes that would
> make this work.)
>
> This change seems to work, and makes IORING_OP_GETDENTS take an
> explicitly specified directory offset (instead of using the file's
> ->f_pos), making it more like pread(2), and I like the change from
> a conceptual point of view, but it's a bit ugly around
> iterate_dir_use_ctx_pos(). Any thoughts on how to do this more
> cleanly (without breaking iterate_dir() semantics)?
I had a further thought...
I presume the basic operation is:
lock(file);
do_getents(); // Updates file->offset
unlock(file);
Which means you can implement an offset by saving, updating
and restoring file->offset while the lock is held.
This is a bit like the completely broken pread() in uclibc
which uses two lseek() calls to set and restore the offset.
Whoever wrote that needs shooting - worse than useless.
Glibc is as bad:
// Don't even ask what glibc's clock_nanosleep() does, you don't want to know.
while (syscall(SYS_clock_nanosleep, CLOCK_MONOTONIC, TIMER_ABSTIME, &ts, NULL)
David
-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)
prev parent reply other threads:[~2021-01-29 10:19 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-23 11:41 [RFC PATCH] io_uring: add support for IORING_OP_GETDENTS64 Lennert Buytenhek
2021-01-23 17:37 ` Jens Axboe
2021-01-23 18:16 ` Lennert Buytenhek
2021-01-23 18:22 ` Jens Axboe
2021-01-23 23:27 ` Matthew Wilcox
2021-01-23 23:33 ` Jens Axboe
2021-01-28 22:30 ` Lennert Buytenhek
2021-01-23 23:50 ` Andres Freund
2021-01-23 23:56 ` Andres Freund
2021-01-24 1:59 ` Al Viro
2021-01-24 2:17 ` Andres Freund
2021-01-24 22:21 ` David Laight
2021-01-28 23:07 ` Lennert Buytenhek
2021-01-29 5:37 ` Lennert Buytenhek
2021-01-29 9:41 ` David Laight [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox