From: Linus Torvalds <torvalds@linux-foundation.org>
To: Al Viro <viro@ZenIV.linux.org.uk>
Cc: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>,
linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [RFC] readdir mess
Date: Tue, 12 Aug 2008 14:04:25 -0700 (PDT) [thread overview]
Message-ID: <alpine.LFD.1.10.0808121351570.3462@nehalem.linux-foundation.org> (raw)
In-Reply-To: <20080812203808.GV28946@ZenIV.linux.org.uk>
On Tue, 12 Aug 2008, Al Viro wrote:
>
> Would you care to grep for vfs_readdir() in the tree? It's not just
> sys_getdents(); for better of worse the thing had become a general-purpose
> iterator. And I'm not suggesting to pass the damn thing to caller of
> sys_getdents(). At all.
Umm. What does that matter wrt what I said?
What does that matter wrt your bogus argument about EIO (which we do
_wrong_ right now, exactly because we return EIO too eagerly, instead of
returning the partial data we got)?
vfs_readdir() itself would not change AT ALL. The change I talked about
was in the caller. Which you should realize, since I actually _called_
vfs_readdir() in that example code.
Here's a patch to get the _semantics_ I talked about, to make the thing
more obvious.
But the actual _change_ I talked about would be to try to avoid using
"buf.error" entirely, and just make all the (many, I know) filesystem
readdir() functions return the callback value instead of 0. Which would
mean that most of the users would be able to drop their "buf.error" use
entirely, along with the ugly
if (error >= 0)
error = buf.error;
that I have in this patch.
(Side note: the "if (error >= 0)" approach is what old_readdir() already
does, so that function actually gets the EIO case _correct_: it's only
the newer sys_getdents() that is buggy)
Linus
---
fs/readdir.c | 6 ++----
1 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/fs/readdir.c b/fs/readdir.c
index 4e026e5..e4ded16 100644
--- a/fs/readdir.c
+++ b/fs/readdir.c
@@ -205,9 +205,8 @@ asmlinkage long sys_getdents(unsigned int fd, struct linux_dirent __user * diren
buf.error = 0;
error = vfs_readdir(file, filldir, &buf);
- if (error < 0)
- goto out_putf;
- error = buf.error;
+ if (error >= 0)
+ error = buf.error;
lastdirent = buf.previous;
if (lastdirent) {
if (put_user(file->f_pos, &lastdirent->d_off))
@@ -216,7 +215,6 @@ asmlinkage long sys_getdents(unsigned int fd, struct linux_dirent __user * diren
error = count - buf.count;
}
-out_putf:
fput(file);
out:
return error;
next prev parent reply other threads:[~2008-08-12 21:04 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-08-12 6:22 [RFC] readdir mess Al Viro
2008-08-12 17:02 ` OGAWA Hirofumi
2008-08-12 17:18 ` Linus Torvalds
2008-08-12 18:10 ` Al Viro
2008-08-12 18:22 ` Al Viro
2008-08-12 18:37 ` Al Viro
2008-08-12 19:24 ` Al Viro
2008-08-12 20:02 ` Linus Torvalds
2008-08-12 20:21 ` Linus Torvalds
2008-08-12 20:38 ` Al Viro
2008-08-12 21:04 ` Linus Torvalds [this message]
2008-08-13 0:04 ` Al Viro
2008-08-13 0:28 ` Linus Torvalds
2008-08-13 1:19 ` Al Viro
2008-08-13 1:51 ` Linus Torvalds
2008-08-13 8:36 ` Brad Boyer
2008-08-13 16:19 ` Al Viro
2008-08-15 5:06 ` Jan Harkes
2008-08-15 5:34 ` Al Viro
2008-08-15 16:58 ` Linus Torvalds
2008-08-24 10:10 ` Al Viro
2008-08-24 11:03 ` Al Viro
2008-08-25 16:16 ` J. Bruce Fields
2008-08-24 17:20 ` Linus Torvalds
2008-08-24 19:59 ` Al Viro
2008-08-24 23:51 ` Linus Torvalds
2008-08-25 1:33 ` Al Viro
2008-08-25 1:44 ` Al Viro
2008-08-12 19:45 ` OGAWA Hirofumi
2008-08-12 20:05 ` Linus Torvalds
2008-08-12 20:59 ` Al Viro
2008-08-12 21:24 ` Linus Torvalds
2008-08-12 21:54 ` Al Viro
2008-08-12 22:04 ` Linus Torvalds
2008-08-13 16:20 ` J. Bruce Fields
2008-08-12 21:47 ` Alan Cox
2008-08-12 22:20 ` Linus Torvalds
2008-08-12 22:10 ` Alan Cox
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 \
--in-reply-to=alpine.LFD.1.10.0808121351570.3462@nehalem.linux-foundation.org \
--to=torvalds@linux-foundation.org \
--cc=hirofumi@mail.parknet.co.jp \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=viro@ZenIV.linux.org.uk \
/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;
as well as URLs for NNTP newsgroup(s).