xfs-masters
[Top] [All Lists]

[xfs-masters] Re: [PATCH] update sb->s_frozen when freezing read-only mo

To: Christoph Hellwig <hch@xxxxxx>
Subject: [xfs-masters] Re: [PATCH] update sb->s_frozen when freezing read-only mounted device, too
From: Akinobu Mita <akinobu.mita@xxxxxxxxx>
Date: Thu, 11 Oct 2007 00:20:51 +0900
Cc: linux-kernel@xxxxxxxxxxxxxxx, xfs@xxxxxxxxxxx, Tim Shimmin <xfs-masters@xxxxxxxxxxx>, David Chinner <dgc@xxxxxxx>
Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=beta; h=domainkey-signature:received:received:date:from:to:cc:subject:message-id:mail-followup-to:references:mime-version:content-type:content-disposition:in-reply-to:user-agent; bh=VkL76X3GzFRZ+KeLjTsoHi5H6XnRq0riFB2JbUzTR7U=; b=OPvyaD7UT6vfcz8Yq+yI4cbrhtXQSzy9TeZqwh4lvbyq6DJEGEB7CEb6BGzFzrbeftU+EpVO+GAnbRSkZrjx7Zc+dy9OQIHODcUjCVuERWtSo7AAUlIGQjW+f5eNUJHFB4PV9UdXbhcJz4rwuFL6LsiMscjhQ/ornZ174Hv304g=
Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:date:from:to:cc:subject:message-id:mail-followup-to:references:mime-version:content-type:content-disposition:in-reply-to:user-agent; b=DeFllw/s5tPRw0dViD9krydVBtNUr0GSGGMMOkB5IfCiTyXzSLGmnRAVi5MmiuVzHfD4+0S0xs5SIztoQSoEVO7gJ61QINj1UDkBdkVA9P4T5AgazXwOU6NPbB/8ZowcYSWn6RXzSrqT42NPZxIgLEno80KMPFc3PWiM4/XmTug=
In-reply-to: <961aa3350710050620q42eb6192wdacce1510cc76a4b@xxxxxxxxxxxxxx>
Mail-followup-to: Akinobu Mita <akinobu.mita@xxxxxxxxx>, Christoph Hellwig <hch@xxxxxx>, linux-kernel@xxxxxxxxxxxxxxx, xfs@xxxxxxxxxxx, Tim Shimmin <xfs-masters@xxxxxxxxxxx>, David Chinner <dgc@xxxxxxx>
References: <20070929100912.GB4121@APFDCB5C> <20071004202004.GA13316@xxxxxx> <961aa3350710050620q42eb6192wdacce1510cc76a4b@xxxxxxxxxxxxxx>
Reply-to: xfs-masters@xxxxxxxxxxx
Sender: xfs-masters-bounce@xxxxxxxxxxx
User-agent: Mutt/1.4.2.3i
freeze_bdev() with read-only mounted device(*) does not change sb->s_frozen
from SB_UNFROZEN to SB_FREEZE_TRANS.

Because of this behavior, xfs_freeze can break read-only filesystem.

Because xfs_thaw does nothing for the filesystem whose sb->s_frozen is
SB_UNFROZEN. So frozen read-only XFS filesystem will never be unfrozen.
Thus we cannot do any unmount/remount operations for that filesystem.

This patch updates sb->s_frozen when freeze_bdev() is called for read-only
mounted device, too.

(*) freezing read-only filesystem is not so pointless.  Because it can
prevent from someone trying to remount read/write while freezing.

Cc: David Chinner <dgc@xxxxxxx>
Cc:  Tim Shimmin <xfs-masters@xxxxxxxxxxx>
Cc: Christoph Hellwig <hch@xxxxxx>
Signed-off-by: Akinobu Mita <akinobu.mita@xxxxxxxxx>

---
 fs/buffer.c |   25 ++++++++++++++++---------
 1 file changed, 16 insertions(+), 9 deletions(-)

Index: 2.6-git/fs/buffer.c
===================================================================
--- 2.6-git.orig/fs/buffer.c
+++ 2.6-git/fs/buffer.c
@@ -190,21 +190,28 @@ struct super_block *freeze_bdev(struct b
 
        down(&bdev->bd_mount_sem);
        sb = get_super(bdev);
-       if (sb && !(sb->s_flags & MS_RDONLY)) {
-               sb->s_frozen = SB_FREEZE_WRITE;
-               smp_wmb();
-
-               __fsync_super(sb);
+       if (!sb)
+               goto out;
 
+       if (sb->s_flags & MS_RDONLY) {
                sb->s_frozen = SB_FREEZE_TRANS;
                smp_wmb();
+               goto out;
+       }
 
-               sync_blockdev(sb->s_bdev);
+       sb->s_frozen = SB_FREEZE_WRITE;
+       smp_wmb();
 
-               if (sb->s_op->write_super_lockfs)
-                       sb->s_op->write_super_lockfs(sb);
-       }
+       __fsync_super(sb);
+
+       sb->s_frozen = SB_FREEZE_TRANS;
+       smp_wmb();
 
+       sync_blockdev(sb->s_bdev);
+
+       if (sb->s_op->write_super_lockfs)
+               sb->s_op->write_super_lockfs(sb);
+out:
        sync_blockdev(bdev);
        return sb;      /* thaw_bdev releases s->s_umount and bd_mount_sem */
 }


<Prev in Thread] Current Thread [Next in Thread>