From: Miklos Szeredi <miklos@szeredi.hu>
To: akpm@osdl.org
Cc: linux-kernel@vger.kernel.org
Subject: [PATCH] Can't unmount bad inode
Date: Wed, 19 Jan 2005 22:20:51 +0100 [thread overview]
Message-ID: <E1CrNFz-0001JF-00@dorka.pomaz.szeredi.hu> (raw)
Andrew,
This patch fixes a problem when a inode which is the root of a mount
becomes bad (make_bad_inode()). In this case follow_link will return
-EIO, so the name resolution fails, and umount won't work. The
solution is just to remove the follow_link method from bad_inode_ops.
Any filesystem operation (other than unmount) will still fail, since
every other method returns -EIO.
A test case for this is:
1) export an smbfs on A and mount the share on B
2) create directory X on A
3) bind mount X to Y on B
4) remove directory X, and create regular file X (same name) on A
5) stat X on B, this will make X a bad inode (file type changed)
6) umount Y
Without the patch applied, umount won't succeed, and a reboot is
necessary to get rid of the mount.
With the patch applied, umount will succeed.
The same is true for any filesystem which uses make_bad_inode() to
mark an existing inode bad (NFS, SMBFS, FUSE, etc...).
Signed-off-by: Miklos Szeredi <miklos@szeredi.hu>
--- linux-2.6.10/fs/bad_inode.c.orig 2005-01-19 21:48:24.000000000 +0100
+++ linux-2.6.10/fs/bad_inode.c 2005-01-19 22:07:56.000000000 +0100
@@ -15,17 +15,6 @@
#include <linux/smp_lock.h>
#include <linux/namei.h>
-/*
- * The follow_link operation is special: it must behave as a no-op
- * so that a bad root inode can at least be unmounted. To do this
- * we must dput() the base and return the dentry with a dget().
- */
-static int bad_follow_link(struct dentry *dent, struct nameidata *nd)
-{
- nd_set_link(nd, ERR_PTR(-EIO));
- return 0;
-}
-
static int return_EIO(void)
{
return -EIO;
@@ -70,7 +59,8 @@ struct inode_operations bad_inode_ops =
.mknod = EIO_ERROR,
.rename = EIO_ERROR,
.readlink = EIO_ERROR,
- .follow_link = bad_follow_link,
+ /* follow_link must be no-op, otherwise unmounting this inode
+ won't work */
.truncate = EIO_ERROR,
.permission = EIO_ERROR,
.getattr = EIO_ERROR,
next reply other threads:[~2005-01-19 21:21 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-01-19 21:20 Miklos Szeredi [this message]
2005-01-19 21:45 ` [PATCH] Can't unmount bad inode Al Viro
2005-01-19 21:58 ` Miklos Szeredi
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=E1CrNFz-0001JF-00@dorka.pomaz.szeredi.hu \
--to=miklos@szeredi.hu \
--cc=akpm@osdl.org \
--cc=linux-kernel@vger.kernel.org \
/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).