From: Bryan Donlan <bdonlan@gmail.com>
To: linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: sct@redhat.com, akpm@linux-foundation.org, adilger@sun.com,
tytso@mit.edu, Bryan Donlan <bdonlan@gmail.com>
Subject: [RESEND/PATCH] ext[234]: Return -EIO not -ESTALE on directory traversal missing inode
Date: Sat, 14 Feb 2009 00:18:08 -0500 [thread overview]
Message-ID: <1234588688-9497-1-git-send-email-bdonlan@gmail.com> (raw)
In-Reply-To: <1234588099-8445-1-git-send-email-bdonlan@fushizen.net>
The ext[234]_iget() functions in the ext[234] family of filesystems returns
-ESTALE if invoked on a deleted inode, in order to report errors to NFS
properly. However, in ext[234]_lookup(), this -ESTALE can be propagated to
userspace if the filesystem is corrupted, and a inode is linked even
though it is marked as deleted. This leads to a misleading error message -
"Stale NFS file handle" - and confusion on the part of the admin.
The bug can be easily reproduced by creating a new filesystem, making a link
to an unused inode using debugfs, then mounting and attempting to ls -l
said link.
This patch thus changes ext[234]_lookup to return -EIO if it receives -ESTALE
from ext[234]_iget(), as ext[234] does for other filesystem metadata
corruption.
Signed-off-by: Bryan Donlan <bdonlan@gmail.com>
---
Apologies for the resend so quickly for those on the CC list - my mailer was
misconfigured and the mail rejected by vger.
fs/ext2/namei.c | 8 ++++++--
fs/ext3/namei.c | 8 ++++++--
fs/ext4/namei.c | 8 ++++++--
3 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/fs/ext2/namei.c b/fs/ext2/namei.c
index 90ea179..7dab3e8 100644
--- a/fs/ext2/namei.c
+++ b/fs/ext2/namei.c
@@ -66,8 +66,12 @@ static struct dentry *ext2_lookup(struct inode * dir, struct dentry *dentry, str
inode = NULL;
if (ino) {
inode = ext2_iget(dir->i_sb, ino);
- if (IS_ERR(inode))
- return ERR_CAST(inode);
+ if (unlikely(IS_ERR(inode))) {
+ if (PTR_ERR(inode) == -ESTALE)
+ return ERR_PTR(-EIO);
+ else
+ return ERR_CAST(inode);
+ }
}
return d_splice_alias(inode, dentry);
}
diff --git a/fs/ext3/namei.c b/fs/ext3/namei.c
index 4db4ffa..625f5dc 100644
--- a/fs/ext3/namei.c
+++ b/fs/ext3/namei.c
@@ -1047,8 +1047,12 @@ static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry, str
return ERR_PTR(-EIO);
}
inode = ext3_iget(dir->i_sb, ino);
- if (IS_ERR(inode))
- return ERR_CAST(inode);
+ if (unlikely(IS_ERR(inode))) {
+ if (PTR_ERR(inode) == -ESTALE)
+ return ERR_PTR(-EIO);
+ else
+ return ERR_CAST(inode);
+ }
}
return d_splice_alias(inode, dentry);
}
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index ba702bd..4b054b3 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c
@@ -1052,8 +1052,12 @@ static struct dentry *ext4_lookup(struct inode *dir, struct dentry *dentry, stru
return ERR_PTR(-EIO);
}
inode = ext4_iget(dir->i_sb, ino);
- if (IS_ERR(inode))
- return ERR_CAST(inode);
+ if (unlikely(IS_ERR(inode))) {
+ if (PTR_ERR(inode) == -ESTALE)
+ return ERR_PTR(-EIO);
+ else
+ return ERR_CAST(inode);
+ }
}
return d_splice_alias(inode, dentry);
}
--
1.5.6.3
next parent reply other threads:[~2009-02-14 5:18 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1234588099-8445-1-git-send-email-bdonlan@fushizen.net>
2009-02-14 5:18 ` Bryan Donlan [this message]
2009-02-14 14:14 ` [RESEND/PATCH] ext[234]: Return -EIO not -ESTALE on directory traversal missing inode Theodore Tso
2009-02-15 4:53 ` Bryan Donlan
2009-02-15 5:39 ` Theodore Tso
2009-02-17 1:10 ` [PATCH v2] ext[234]: Return -EIO not -ESTALE on directory traversal through deleted inode Bryan Donlan
2009-02-20 17:53 ` Bryan Donlan
2009-02-20 17:59 ` Theodore Tso
2009-02-21 7:35 ` Bryan Donlan
2009-02-20 18:25 ` Andrew Morton
[not found] <1234588099-8445-1-git-sen--dry-run>
2009-02-14 5:17 ` [RESEND/PATCH] ext[234]: Return -EIO not -ESTALE on directory traversal missing inode d-email-bdonlan
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=1234588688-9497-1-git-send-email-bdonlan@gmail.com \
--to=bdonlan@gmail.com \
--cc=adilger@sun.com \
--cc=akpm@linux-foundation.org \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=sct@redhat.com \
--cc=tytso@mit.edu \
/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).