]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 9 Jul 2013 19:08:43 +0000 (12:08 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 9 Jul 2013 19:08:43 +0000 (12:08 -0700)
Pull ext3 fix and quota cleanup from Jan Kara:
 "A fix of ext3 error reporting from fsync and a quota cleanup"

* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs:
  quota: Convert use of typedef ctl_table to struct ctl_table
  ext3: Fix fsync error handling after filesystem abort.

fs/ext3/fsync.c
fs/ext3/super.c
fs/quota/dquot.c

index b31dbd4c46ad3f1ae9acd41dc274a9aa870656e9..1cb9c7e10c6f22a76b3f781c6beaa5b79acd1c5b 100644 (file)
@@ -48,9 +48,13 @@ int ext3_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
 
        trace_ext3_sync_file_enter(file, datasync);
 
-       if (inode->i_sb->s_flags & MS_RDONLY)
+       if (inode->i_sb->s_flags & MS_RDONLY) {
+               /* Make sure that we read updated state */
+               smp_rmb();
+               if (EXT3_SB(inode->i_sb)->s_mount_state & EXT3_ERROR_FS)
+                       return -EROFS;
                return 0;
-
+       }
        ret = filemap_write_and_wait_range(inode->i_mapping, start, end);
        if (ret)
                goto out;
index 6356665a74bb006a096023399fe8dca5363f1435..c47f147507227fda66d6b1a59e6922ab60e36ff9 100644 (file)
@@ -174,6 +174,11 @@ static void ext3_handle_error(struct super_block *sb)
        if (test_opt (sb, ERRORS_RO)) {
                ext3_msg(sb, KERN_CRIT,
                        "error: remounting filesystem read-only");
+               /*
+                * Make sure updated value of ->s_mount_state will be visible
+                * before ->s_flags update.
+                */
+               smp_wmb();
                sb->s_flags |= MS_RDONLY;
        }
        ext3_commit_super(sb, es, 1);
@@ -291,8 +296,14 @@ void ext3_abort(struct super_block *sb, const char *function,
        ext3_msg(sb, KERN_CRIT,
                "error: remounting filesystem read-only");
        EXT3_SB(sb)->s_mount_state |= EXT3_ERROR_FS;
-       sb->s_flags |= MS_RDONLY;
        set_opt(EXT3_SB(sb)->s_mount_opt, ABORT);
+       /*
+        * Make sure updated value of ->s_mount_state will be visible
+        * before ->s_flags update.
+        */
+       smp_wmb();
+       sb->s_flags |= MS_RDONLY;
+
        if (EXT3_SB(sb)->s_journal)
                journal_abort(EXT3_SB(sb)->s_journal, -EIO);
 }
index 3e64169ef52710ff11f9c7f8c44ee3c910cbd321..fbad622841f904ebd471ae0668f03018309a076e 100644 (file)
@@ -2585,7 +2585,7 @@ static int do_proc_dqstats(struct ctl_table *table, int write,
        return proc_dointvec(table, write, buffer, lenp, ppos);
 }
 
-static ctl_table fs_dqstats_table[] = {
+static struct ctl_table fs_dqstats_table[] = {
        {
                .procname       = "lookups",
                .data           = &dqstats.stat[DQST_LOOKUPS],
@@ -2654,7 +2654,7 @@ static ctl_table fs_dqstats_table[] = {
        { },
 };
 
-static ctl_table fs_table[] = {
+static struct ctl_table fs_table[] = {
        {
                .procname       = "quota",
                .mode           = 0555,
@@ -2663,7 +2663,7 @@ static ctl_table fs_table[] = {
        { },
 };
 
-static ctl_table sys_table[] = {
+static struct ctl_table sys_table[] = {
        {
                .procname       = "fs",
                .mode           = 0555,