]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ext4: support freezing ext2 (nojournal) file systems
authorTheodore Ts'o <tytso@mit.edu>
Thu, 18 Sep 2014 21:12:02 +0000 (17:12 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 18 Sep 2014 21:12:02 +0000 (17:12 -0400)
Through an oversight, when we added nojournal support to ext4, we
didn't add support to allow file system freezing.  This is relatively
easy to add, so let's do it.

Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Reported-by: Dexuan Cui <decui@microsoft.com>
fs/ext4/super.c

index 4770c98bdb6115381314708893e8fd96a293a5ee..4db537b3a16262a6ab14d0c29bb0627785818ea6 100644 (file)
@@ -1131,6 +1131,8 @@ static const struct super_operations ext4_nojournal_sops = {
        .drop_inode     = ext4_drop_inode,
        .evict_inode    = ext4_evict_inode,
        .sync_fs        = ext4_sync_fs,
+       .freeze_fs      = ext4_freeze,
+       .unfreeze_fs    = ext4_unfreeze,
        .put_super      = ext4_put_super,
        .statfs         = ext4_statfs,
        .remount_fs     = ext4_remount,
@@ -4758,23 +4760,26 @@ static int ext4_freeze(struct super_block *sb)
 
        journal = EXT4_SB(sb)->s_journal;
 
-       /* Now we set up the journal barrier. */
-       jbd2_journal_lock_updates(journal);
+       if (journal) {
+               /* Now we set up the journal barrier. */
+               jbd2_journal_lock_updates(journal);
 
-       /*
-        * Don't clear the needs_recovery flag if we failed to flush
-        * the journal.
-        */
-       error = jbd2_journal_flush(journal);
-       if (error < 0)
-               goto out;
+               /*
+                * Don't clear the needs_recovery flag if we failed to
+                * flush the journal.
+                */
+               error = jbd2_journal_flush(journal);
+               if (error < 0)
+                       goto out;
+       }
 
        /* Journal blocked and flushed, clear needs_recovery flag. */
        EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER);
        error = ext4_commit_super(sb, 1);
 out:
-       /* we rely on upper layer to stop further updates */
-       jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal);
+       if (journal)
+               /* we rely on upper layer to stop further updates */
+               jbd2_journal_unlock_updates(journal);
        return error;
 }