summaryrefslogtreecommitdiffstats
path: root/fs/ext3
diff options
context:
space:
mode:
authorEric Sandeen <sandeen@redhat.com>2007-02-10 01:46:07 -0800
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-02-11 10:51:34 -0800
commitea9a05a1330053759c02eb2c60547085140a4cbd (patch)
treef81451db36a53d682ad4a623b7144e27a3e04033 /fs/ext3
parentbfb58478fe2f8cbbb776d910ff3549515e3c8f4f (diff)
downloadlinux-ea9a05a1330053759c02eb2c60547085140a4cbd.tar.gz
linux-ea9a05a1330053759c02eb2c60547085140a4cbd.tar.bz2
linux-ea9a05a1330053759c02eb2c60547085140a4cbd.zip
[PATCH] ext3: refuse ro to rw remount of fs with orphan inodes
In the rare case where we have skipped orphan inode processing due to a readonly block device, and the block device subsequently changes back to read-write, disallow a remount,rw transition of the filesystem when we have an unprocessed orphan inodes as this would corrupt the list. Ideally we should process the orphan inode list during the remount, but that's trickier, and this plugs the hole for now. Signed-off-by: Eric Sandeen <sandeen@redhat.com> Cc: "Stephen C. Tweedie" <sct@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/ext3')
-rw-r--r--fs/ext3/super.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/fs/ext3/super.c b/fs/ext3/super.c
index b34886734a44..5eec3eb409a2 100644
--- a/fs/ext3/super.c
+++ b/fs/ext3/super.c
@@ -2344,6 +2344,22 @@ static int ext3_remount (struct super_block * sb, int * flags, char * data)
err = -EROFS;
goto restore_opts;
}
+
+ /*
+ * If we have an unprocessed orphan list hanging
+ * around from a previously readonly bdev mount,
+ * require a full umount/remount for now.
+ */
+ if (es->s_last_orphan) {
+ printk(KERN_WARNING "EXT3-fs: %s: couldn't "
+ "remount RDWR because of unprocessed "
+ "orphan inode list. Please "
+ "umount/remount instead.\n",
+ sb->s_id);
+ err = -EINVAL;
+ goto restore_opts;
+ }
+
/*
* Mounting a RDONLY partition read-write, so reread
* and store the current valid flag. (It may have