diff options
-rw-r--r-- | Documentation/filesystems/Locking | 8 | ||||
-rw-r--r-- | Documentation/filesystems/vfs.txt | 8 | ||||
-rw-r--r-- | fs/buffer.c | 8 | ||||
-rw-r--r-- | fs/ext3/super.c | 45 | ||||
-rw-r--r-- | fs/ext4/super.c | 45 | ||||
-rw-r--r-- | fs/gfs2/ops_super.c | 16 | ||||
-rw-r--r-- | fs/jfs/super.c | 10 | ||||
-rw-r--r-- | fs/reiserfs/super.c | 10 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_super.c | 8 | ||||
-rw-r--r-- | fs/xfs/xfs_fsops.c | 11 | ||||
-rw-r--r-- | fs/xfs/xfs_fsops.h | 2 | ||||
-rw-r--r-- | include/linux/fs.h | 4 |
12 files changed, 107 insertions, 68 deletions
diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking index cfbfa15a46ba..ec6a9392a173 100644 --- a/Documentation/filesystems/Locking +++ b/Documentation/filesystems/Locking | |||
@@ -97,8 +97,8 @@ prototypes: | |||
97 | void (*put_super) (struct super_block *); | 97 | void (*put_super) (struct super_block *); |
98 | void (*write_super) (struct super_block *); | 98 | void (*write_super) (struct super_block *); |
99 | int (*sync_fs)(struct super_block *sb, int wait); | 99 | int (*sync_fs)(struct super_block *sb, int wait); |
100 | void (*write_super_lockfs) (struct super_block *); | 100 | int (*freeze_fs) (struct super_block *); |
101 | void (*unlockfs) (struct super_block *); | 101 | int (*unfreeze_fs) (struct super_block *); |
102 | int (*statfs) (struct dentry *, struct kstatfs *); | 102 | int (*statfs) (struct dentry *, struct kstatfs *); |
103 | int (*remount_fs) (struct super_block *, int *, char *); | 103 | int (*remount_fs) (struct super_block *, int *, char *); |
104 | void (*clear_inode) (struct inode *); | 104 | void (*clear_inode) (struct inode *); |
@@ -119,8 +119,8 @@ delete_inode: no | |||
119 | put_super: yes yes no | 119 | put_super: yes yes no |
120 | write_super: no yes read | 120 | write_super: no yes read |
121 | sync_fs: no no read | 121 | sync_fs: no no read |
122 | write_super_lockfs: ? | 122 | freeze_fs: ? |
123 | unlockfs: ? | 123 | unfreeze_fs: ? |
124 | statfs: no no no | 124 | statfs: no no no |
125 | remount_fs: yes yes maybe (see below) | 125 | remount_fs: yes yes maybe (see below) |
126 | clear_inode: no | 126 | clear_inode: no |
diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt index ef19afa186a9..deeeed0faa8f 100644 --- a/Documentation/filesystems/vfs.txt +++ b/Documentation/filesystems/vfs.txt | |||
@@ -210,8 +210,8 @@ struct super_operations { | |||
210 | void (*put_super) (struct super_block *); | 210 | void (*put_super) (struct super_block *); |
211 | void (*write_super) (struct super_block *); | 211 | void (*write_super) (struct super_block *); |
212 | int (*sync_fs)(struct super_block *sb, int wait); | 212 | int (*sync_fs)(struct super_block *sb, int wait); |
213 | void (*write_super_lockfs) (struct super_block *); | 213 | int (*freeze_fs) (struct super_block *); |
214 | void (*unlockfs) (struct super_block *); | 214 | int (*unfreeze_fs) (struct super_block *); |
215 | int (*statfs) (struct dentry *, struct kstatfs *); | 215 | int (*statfs) (struct dentry *, struct kstatfs *); |
216 | int (*remount_fs) (struct super_block *, int *, char *); | 216 | int (*remount_fs) (struct super_block *, int *, char *); |
217 | void (*clear_inode) (struct inode *); | 217 | void (*clear_inode) (struct inode *); |
@@ -270,11 +270,11 @@ or bottom half). | |||
270 | a superblock. The second parameter indicates whether the method | 270 | a superblock. The second parameter indicates whether the method |
271 | should wait until the write out has been completed. Optional. | 271 | should wait until the write out has been completed. Optional. |
272 | 272 | ||
273 | write_super_lockfs: called when VFS is locking a filesystem and | 273 | freeze_fs: called when VFS is locking a filesystem and |
274 | forcing it into a consistent state. This method is currently | 274 | forcing it into a consistent state. This method is currently |
275 | used by the Logical Volume Manager (LVM). | 275 | used by the Logical Volume Manager (LVM). |
276 | 276 | ||
277 | unlockfs: called when VFS is unlocking a filesystem and making it writable | 277 | unfreeze_fs: called when VFS is unlocking a filesystem and making it writable |
278 | again. | 278 | again. |
279 | 279 | ||
280 | statfs: called when the VFS needs to get filesystem statistics. This | 280 | statfs: called when the VFS needs to get filesystem statistics. This |
diff --git a/fs/buffer.c b/fs/buffer.c index c26da785938a..87f9e537b8c3 100644 --- a/fs/buffer.c +++ b/fs/buffer.c | |||
@@ -221,8 +221,8 @@ struct super_block *freeze_bdev(struct block_device *bdev) | |||
221 | 221 | ||
222 | sync_blockdev(sb->s_bdev); | 222 | sync_blockdev(sb->s_bdev); |
223 | 223 | ||
224 | if (sb->s_op->write_super_lockfs) | 224 | if (sb->s_op->freeze_fs) |
225 | sb->s_op->write_super_lockfs(sb); | 225 | sb->s_op->freeze_fs(sb); |
226 | } | 226 | } |
227 | 227 | ||
228 | sync_blockdev(bdev); | 228 | sync_blockdev(bdev); |
@@ -242,8 +242,8 @@ void thaw_bdev(struct block_device *bdev, struct super_block *sb) | |||
242 | if (sb) { | 242 | if (sb) { |
243 | BUG_ON(sb->s_bdev != bdev); | 243 | BUG_ON(sb->s_bdev != bdev); |
244 | 244 | ||
245 | if (sb->s_op->unlockfs) | 245 | if (sb->s_op->unfreeze_fs) |
246 | sb->s_op->unlockfs(sb); | 246 | sb->s_op->unfreeze_fs(sb); |
247 | sb->s_frozen = SB_UNFROZEN; | 247 | sb->s_frozen = SB_UNFROZEN; |
248 | smp_wmb(); | 248 | smp_wmb(); |
249 | wake_up(&sb->s_wait_unfrozen); | 249 | wake_up(&sb->s_wait_unfrozen); |
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 5d047a030a73..b70d90e08a3c 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
@@ -48,8 +48,8 @@ static int ext3_load_journal(struct super_block *, struct ext3_super_block *, | |||
48 | unsigned long journal_devnum); | 48 | unsigned long journal_devnum); |
49 | static int ext3_create_journal(struct super_block *, struct ext3_super_block *, | 49 | static int ext3_create_journal(struct super_block *, struct ext3_super_block *, |
50 | unsigned int); | 50 | unsigned int); |
51 | static void ext3_commit_super (struct super_block * sb, | 51 | static int ext3_commit_super(struct super_block *sb, |
52 | struct ext3_super_block * es, | 52 | struct ext3_super_block *es, |
53 | int sync); | 53 | int sync); |
54 | static void ext3_mark_recovery_complete(struct super_block * sb, | 54 | static void ext3_mark_recovery_complete(struct super_block * sb, |
55 | struct ext3_super_block * es); | 55 | struct ext3_super_block * es); |
@@ -60,9 +60,9 @@ static const char *ext3_decode_error(struct super_block * sb, int errno, | |||
60 | char nbuf[16]); | 60 | char nbuf[16]); |
61 | static int ext3_remount (struct super_block * sb, int * flags, char * data); | 61 | static int ext3_remount (struct super_block * sb, int * flags, char * data); |
62 | static int ext3_statfs (struct dentry * dentry, struct kstatfs * buf); | 62 | static int ext3_statfs (struct dentry * dentry, struct kstatfs * buf); |
63 | static void ext3_unlockfs(struct super_block *sb); | 63 | static int ext3_unfreeze(struct super_block *sb); |
64 | static void ext3_write_super (struct super_block * sb); | 64 | static void ext3_write_super (struct super_block * sb); |
65 | static void ext3_write_super_lockfs(struct super_block *sb); | 65 | static int ext3_freeze(struct super_block *sb); |
66 | 66 | ||
67 | /* | 67 | /* |
68 | * Wrappers for journal_start/end. | 68 | * Wrappers for journal_start/end. |
@@ -759,8 +759,8 @@ static const struct super_operations ext3_sops = { | |||
759 | .put_super = ext3_put_super, | 759 | .put_super = ext3_put_super, |
760 | .write_super = ext3_write_super, | 760 | .write_super = ext3_write_super, |
761 | .sync_fs = ext3_sync_fs, | 761 | .sync_fs = ext3_sync_fs, |
762 | .write_super_lockfs = ext3_write_super_lockfs, | 762 | .freeze_fs = ext3_freeze, |
763 | .unlockfs = ext3_unlockfs, | 763 | .unfreeze_fs = ext3_unfreeze, |
764 | .statfs = ext3_statfs, | 764 | .statfs = ext3_statfs, |
765 | .remount_fs = ext3_remount, | 765 | .remount_fs = ext3_remount, |
766 | .clear_inode = ext3_clear_inode, | 766 | .clear_inode = ext3_clear_inode, |
@@ -2311,21 +2311,23 @@ static int ext3_create_journal(struct super_block * sb, | |||
2311 | return 0; | 2311 | return 0; |
2312 | } | 2312 | } |
2313 | 2313 | ||
2314 | static void ext3_commit_super (struct super_block * sb, | 2314 | static int ext3_commit_super(struct super_block *sb, |
2315 | struct ext3_super_block * es, | 2315 | struct ext3_super_block *es, |
2316 | int sync) | 2316 | int sync) |
2317 | { | 2317 | { |
2318 | struct buffer_head *sbh = EXT3_SB(sb)->s_sbh; | 2318 | struct buffer_head *sbh = EXT3_SB(sb)->s_sbh; |
2319 | int error = 0; | ||
2319 | 2320 | ||
2320 | if (!sbh) | 2321 | if (!sbh) |
2321 | return; | 2322 | return error; |
2322 | es->s_wtime = cpu_to_le32(get_seconds()); | 2323 | es->s_wtime = cpu_to_le32(get_seconds()); |
2323 | es->s_free_blocks_count = cpu_to_le32(ext3_count_free_blocks(sb)); | 2324 | es->s_free_blocks_count = cpu_to_le32(ext3_count_free_blocks(sb)); |
2324 | es->s_free_inodes_count = cpu_to_le32(ext3_count_free_inodes(sb)); | 2325 | es->s_free_inodes_count = cpu_to_le32(ext3_count_free_inodes(sb)); |
2325 | BUFFER_TRACE(sbh, "marking dirty"); | 2326 | BUFFER_TRACE(sbh, "marking dirty"); |
2326 | mark_buffer_dirty(sbh); | 2327 | mark_buffer_dirty(sbh); |
2327 | if (sync) | 2328 | if (sync) |
2328 | sync_dirty_buffer(sbh); | 2329 | error = sync_dirty_buffer(sbh); |
2330 | return error; | ||
2329 | } | 2331 | } |
2330 | 2332 | ||
2331 | 2333 | ||
@@ -2439,12 +2441,14 @@ static int ext3_sync_fs(struct super_block *sb, int wait) | |||
2439 | * LVM calls this function before a (read-only) snapshot is created. This | 2441 | * LVM calls this function before a (read-only) snapshot is created. This |
2440 | * gives us a chance to flush the journal completely and mark the fs clean. | 2442 | * gives us a chance to flush the journal completely and mark the fs clean. |
2441 | */ | 2443 | */ |
2442 | static void ext3_write_super_lockfs(struct super_block *sb) | 2444 | static int ext3_freeze(struct super_block *sb) |
2443 | { | 2445 | { |
2446 | int error = 0; | ||
2447 | journal_t *journal; | ||
2444 | sb->s_dirt = 0; | 2448 | sb->s_dirt = 0; |
2445 | 2449 | ||
2446 | if (!(sb->s_flags & MS_RDONLY)) { | 2450 | if (!(sb->s_flags & MS_RDONLY)) { |
2447 | journal_t *journal = EXT3_SB(sb)->s_journal; | 2451 | journal = EXT3_SB(sb)->s_journal; |
2448 | 2452 | ||
2449 | /* Now we set up the journal barrier. */ | 2453 | /* Now we set up the journal barrier. */ |
2450 | journal_lock_updates(journal); | 2454 | journal_lock_updates(journal); |
@@ -2453,20 +2457,28 @@ static void ext3_write_super_lockfs(struct super_block *sb) | |||
2453 | * We don't want to clear needs_recovery flag when we failed | 2457 | * We don't want to clear needs_recovery flag when we failed |
2454 | * to flush the journal. | 2458 | * to flush the journal. |
2455 | */ | 2459 | */ |
2456 | if (journal_flush(journal) < 0) | 2460 | error = journal_flush(journal); |
2457 | return; | 2461 | if (error < 0) |
2462 | goto out; | ||
2458 | 2463 | ||
2459 | /* Journal blocked and flushed, clear needs_recovery flag. */ | 2464 | /* Journal blocked and flushed, clear needs_recovery flag. */ |
2460 | EXT3_CLEAR_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); | 2465 | EXT3_CLEAR_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); |
2461 | ext3_commit_super(sb, EXT3_SB(sb)->s_es, 1); | 2466 | error = ext3_commit_super(sb, EXT3_SB(sb)->s_es, 1); |
2467 | if (error) | ||
2468 | goto out; | ||
2462 | } | 2469 | } |
2470 | return 0; | ||
2471 | |||
2472 | out: | ||
2473 | journal_unlock_updates(journal); | ||
2474 | return error; | ||
2463 | } | 2475 | } |
2464 | 2476 | ||
2465 | /* | 2477 | /* |
2466 | * Called by LVM after the snapshot is done. We need to reset the RECOVER | 2478 | * Called by LVM after the snapshot is done. We need to reset the RECOVER |
2467 | * flag here, even though the filesystem is not technically dirty yet. | 2479 | * flag here, even though the filesystem is not technically dirty yet. |
2468 | */ | 2480 | */ |
2469 | static void ext3_unlockfs(struct super_block *sb) | 2481 | static int ext3_unfreeze(struct super_block *sb) |
2470 | { | 2482 | { |
2471 | if (!(sb->s_flags & MS_RDONLY)) { | 2483 | if (!(sb->s_flags & MS_RDONLY)) { |
2472 | lock_super(sb); | 2484 | lock_super(sb); |
@@ -2476,6 +2488,7 @@ static void ext3_unlockfs(struct super_block *sb) | |||
2476 | unlock_super(sb); | 2488 | unlock_super(sb); |
2477 | journal_unlock_updates(EXT3_SB(sb)->s_journal); | 2489 | journal_unlock_updates(EXT3_SB(sb)->s_journal); |
2478 | } | 2490 | } |
2491 | return 0; | ||
2479 | } | 2492 | } |
2480 | 2493 | ||
2481 | static int ext3_remount (struct super_block * sb, int * flags, char * data) | 2494 | static int ext3_remount (struct super_block * sb, int * flags, char * data) |
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 8f7e0be8ab1b..e5f06a5f045e 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -51,7 +51,7 @@ struct proc_dir_entry *ext4_proc_root; | |||
51 | 51 | ||
52 | static int ext4_load_journal(struct super_block *, struct ext4_super_block *, | 52 | static int ext4_load_journal(struct super_block *, struct ext4_super_block *, |
53 | unsigned long journal_devnum); | 53 | unsigned long journal_devnum); |
54 | static void ext4_commit_super(struct super_block *sb, | 54 | static int ext4_commit_super(struct super_block *sb, |
55 | struct ext4_super_block *es, int sync); | 55 | struct ext4_super_block *es, int sync); |
56 | static void ext4_mark_recovery_complete(struct super_block *sb, | 56 | static void ext4_mark_recovery_complete(struct super_block *sb, |
57 | struct ext4_super_block *es); | 57 | struct ext4_super_block *es); |
@@ -62,9 +62,9 @@ static const char *ext4_decode_error(struct super_block *sb, int errno, | |||
62 | char nbuf[16]); | 62 | char nbuf[16]); |
63 | static int ext4_remount(struct super_block *sb, int *flags, char *data); | 63 | static int ext4_remount(struct super_block *sb, int *flags, char *data); |
64 | static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf); | 64 | static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf); |
65 | static void ext4_unlockfs(struct super_block *sb); | 65 | static int ext4_unfreeze(struct super_block *sb); |
66 | static void ext4_write_super(struct super_block *sb); | 66 | static void ext4_write_super(struct super_block *sb); |
67 | static void ext4_write_super_lockfs(struct super_block *sb); | 67 | static int ext4_freeze(struct super_block *sb); |
68 | 68 | ||
69 | 69 | ||
70 | ext4_fsblk_t ext4_block_bitmap(struct super_block *sb, | 70 | ext4_fsblk_t ext4_block_bitmap(struct super_block *sb, |
@@ -978,8 +978,8 @@ static const struct super_operations ext4_sops = { | |||
978 | .put_super = ext4_put_super, | 978 | .put_super = ext4_put_super, |
979 | .write_super = ext4_write_super, | 979 | .write_super = ext4_write_super, |
980 | .sync_fs = ext4_sync_fs, | 980 | .sync_fs = ext4_sync_fs, |
981 | .write_super_lockfs = ext4_write_super_lockfs, | 981 | .freeze_fs = ext4_freeze, |
982 | .unlockfs = ext4_unlockfs, | 982 | .unfreeze_fs = ext4_unfreeze, |
983 | .statfs = ext4_statfs, | 983 | .statfs = ext4_statfs, |
984 | .remount_fs = ext4_remount, | 984 | .remount_fs = ext4_remount, |
985 | .clear_inode = ext4_clear_inode, | 985 | .clear_inode = ext4_clear_inode, |
@@ -2888,13 +2888,14 @@ static int ext4_load_journal(struct super_block *sb, | |||
2888 | return 0; | 2888 | return 0; |
2889 | } | 2889 | } |
2890 | 2890 | ||
2891 | static void ext4_commit_super(struct super_block *sb, | 2891 | static int ext4_commit_super(struct super_block *sb, |
2892 | struct ext4_super_block *es, int sync) | 2892 | struct ext4_super_block *es, int sync) |
2893 | { | 2893 | { |
2894 | struct buffer_head *sbh = EXT4_SB(sb)->s_sbh; | 2894 | struct buffer_head *sbh = EXT4_SB(sb)->s_sbh; |
2895 | int error = 0; | ||
2895 | 2896 | ||
2896 | if (!sbh) | 2897 | if (!sbh) |
2897 | return; | 2898 | return error; |
2898 | if (buffer_write_io_error(sbh)) { | 2899 | if (buffer_write_io_error(sbh)) { |
2899 | /* | 2900 | /* |
2900 | * Oh, dear. A previous attempt to write the | 2901 | * Oh, dear. A previous attempt to write the |
@@ -2918,14 +2919,19 @@ static void ext4_commit_super(struct super_block *sb, | |||
2918 | BUFFER_TRACE(sbh, "marking dirty"); | 2919 | BUFFER_TRACE(sbh, "marking dirty"); |
2919 | mark_buffer_dirty(sbh); | 2920 | mark_buffer_dirty(sbh); |
2920 | if (sync) { | 2921 | if (sync) { |
2921 | sync_dirty_buffer(sbh); | 2922 | error = sync_dirty_buffer(sbh); |
2922 | if (buffer_write_io_error(sbh)) { | 2923 | if (error) |
2924 | return error; | ||
2925 | |||
2926 | error = buffer_write_io_error(sbh); | ||
2927 | if (error) { | ||
2923 | printk(KERN_ERR "EXT4-fs: I/O error while writing " | 2928 | printk(KERN_ERR "EXT4-fs: I/O error while writing " |
2924 | "superblock for %s.\n", sb->s_id); | 2929 | "superblock for %s.\n", sb->s_id); |
2925 | clear_buffer_write_io_error(sbh); | 2930 | clear_buffer_write_io_error(sbh); |
2926 | set_buffer_uptodate(sbh); | 2931 | set_buffer_uptodate(sbh); |
2927 | } | 2932 | } |
2928 | } | 2933 | } |
2934 | return error; | ||
2929 | } | 2935 | } |
2930 | 2936 | ||
2931 | 2937 | ||
@@ -3058,12 +3064,14 @@ static int ext4_sync_fs(struct super_block *sb, int wait) | |||
3058 | * LVM calls this function before a (read-only) snapshot is created. This | 3064 | * LVM calls this function before a (read-only) snapshot is created. This |
3059 | * gives us a chance to flush the journal completely and mark the fs clean. | 3065 | * gives us a chance to flush the journal completely and mark the fs clean. |
3060 | */ | 3066 | */ |
3061 | static void ext4_write_super_lockfs(struct super_block *sb) | 3067 | static int ext4_freeze(struct super_block *sb) |
3062 | { | 3068 | { |
3069 | int error = 0; | ||
3070 | journal_t *journal; | ||
3063 | sb->s_dirt = 0; | 3071 | sb->s_dirt = 0; |
3064 | 3072 | ||
3065 | if (!(sb->s_flags & MS_RDONLY)) { | 3073 | if (!(sb->s_flags & MS_RDONLY)) { |
3066 | journal_t *journal = EXT4_SB(sb)->s_journal; | 3074 | journal = EXT4_SB(sb)->s_journal; |
3067 | 3075 | ||
3068 | if (journal) { | 3076 | if (journal) { |
3069 | /* Now we set up the journal barrier. */ | 3077 | /* Now we set up the journal barrier. */ |
@@ -3073,21 +3081,29 @@ static void ext4_write_super_lockfs(struct super_block *sb) | |||
3073 | * We don't want to clear needs_recovery flag when we | 3081 | * We don't want to clear needs_recovery flag when we |
3074 | * failed to flush the journal. | 3082 | * failed to flush the journal. |
3075 | */ | 3083 | */ |
3076 | if (jbd2_journal_flush(journal) < 0) | 3084 | error = jbd2_journal_flush(journal); |
3077 | return; | 3085 | if (error < 0) |
3086 | goto out; | ||
3078 | } | 3087 | } |
3079 | 3088 | ||
3080 | /* Journal blocked and flushed, clear needs_recovery flag. */ | 3089 | /* Journal blocked and flushed, clear needs_recovery flag. */ |
3081 | EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); | 3090 | EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); |
3082 | ext4_commit_super(sb, EXT4_SB(sb)->s_es, 1); | 3091 | ext4_commit_super(sb, EXT4_SB(sb)->s_es, 1); |
3092 | error = ext4_commit_super(sb, EXT4_SB(sb)->s_es, 1); | ||
3093 | if (error) | ||
3094 | goto out; | ||
3083 | } | 3095 | } |
3096 | return 0; | ||
3097 | out: | ||
3098 | jbd2_journal_unlock_updates(journal); | ||
3099 | return error; | ||
3084 | } | 3100 | } |
3085 | 3101 | ||
3086 | /* | 3102 | /* |
3087 | * Called by LVM after the snapshot is done. We need to reset the RECOVER | 3103 | * Called by LVM after the snapshot is done. We need to reset the RECOVER |
3088 | * flag here, even though the filesystem is not technically dirty yet. | 3104 | * flag here, even though the filesystem is not technically dirty yet. |
3089 | */ | 3105 | */ |
3090 | static void ext4_unlockfs(struct super_block *sb) | 3106 | static int ext4_unfreeze(struct super_block *sb) |
3091 | { | 3107 | { |
3092 | if (EXT4_SB(sb)->s_journal && !(sb->s_flags & MS_RDONLY)) { | 3108 | if (EXT4_SB(sb)->s_journal && !(sb->s_flags & MS_RDONLY)) { |
3093 | lock_super(sb); | 3109 | lock_super(sb); |
@@ -3097,6 +3113,7 @@ static void ext4_unlockfs(struct super_block *sb) | |||
3097 | unlock_super(sb); | 3113 | unlock_super(sb); |
3098 | jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal); | 3114 | jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal); |
3099 | } | 3115 | } |
3116 | return 0; | ||
3100 | } | 3117 | } |
3101 | 3118 | ||
3102 | static int ext4_remount(struct super_block *sb, int *flags, char *data) | 3119 | static int ext4_remount(struct super_block *sb, int *flags, char *data) |
diff --git a/fs/gfs2/ops_super.c b/fs/gfs2/ops_super.c index 777783deddcb..320323d03479 100644 --- a/fs/gfs2/ops_super.c +++ b/fs/gfs2/ops_super.c | |||
@@ -211,18 +211,18 @@ static int gfs2_sync_fs(struct super_block *sb, int wait) | |||
211 | } | 211 | } |
212 | 212 | ||
213 | /** | 213 | /** |
214 | * gfs2_write_super_lockfs - prevent further writes to the filesystem | 214 | * gfs2_freeze - prevent further writes to the filesystem |
215 | * @sb: the VFS structure for the filesystem | 215 | * @sb: the VFS structure for the filesystem |
216 | * | 216 | * |
217 | */ | 217 | */ |
218 | 218 | ||
219 | static void gfs2_write_super_lockfs(struct super_block *sb) | 219 | static int gfs2_freeze(struct super_block *sb) |
220 | { | 220 | { |
221 | struct gfs2_sbd *sdp = sb->s_fs_info; | 221 | struct gfs2_sbd *sdp = sb->s_fs_info; |
222 | int error; | 222 | int error; |
223 | 223 | ||
224 | if (test_bit(SDF_SHUTDOWN, &sdp->sd_flags)) | 224 | if (test_bit(SDF_SHUTDOWN, &sdp->sd_flags)) |
225 | return; | 225 | return -EINVAL; |
226 | 226 | ||
227 | for (;;) { | 227 | for (;;) { |
228 | error = gfs2_freeze_fs(sdp); | 228 | error = gfs2_freeze_fs(sdp); |
@@ -242,17 +242,19 @@ static void gfs2_write_super_lockfs(struct super_block *sb) | |||
242 | fs_err(sdp, "retrying...\n"); | 242 | fs_err(sdp, "retrying...\n"); |
243 | msleep(1000); | 243 | msleep(1000); |
244 | } | 244 | } |
245 | return 0; | ||
245 | } | 246 | } |
246 | 247 | ||
247 | /** | 248 | /** |
248 | * gfs2_unlockfs - reallow writes to the filesystem | 249 | * gfs2_unfreeze - reallow writes to the filesystem |
249 | * @sb: the VFS structure for the filesystem | 250 | * @sb: the VFS structure for the filesystem |
250 | * | 251 | * |
251 | */ | 252 | */ |
252 | 253 | ||
253 | static void gfs2_unlockfs(struct super_block *sb) | 254 | static int gfs2_unfreeze(struct super_block *sb) |
254 | { | 255 | { |
255 | gfs2_unfreeze_fs(sb->s_fs_info); | 256 | gfs2_unfreeze_fs(sb->s_fs_info); |
257 | return 0; | ||
256 | } | 258 | } |
257 | 259 | ||
258 | /** | 260 | /** |
@@ -688,8 +690,8 @@ const struct super_operations gfs2_super_ops = { | |||
688 | .put_super = gfs2_put_super, | 690 | .put_super = gfs2_put_super, |
689 | .write_super = gfs2_write_super, | 691 | .write_super = gfs2_write_super, |
690 | .sync_fs = gfs2_sync_fs, | 692 | .sync_fs = gfs2_sync_fs, |
691 | .write_super_lockfs = gfs2_write_super_lockfs, | 693 | .freeze_fs = gfs2_freeze, |
692 | .unlockfs = gfs2_unlockfs, | 694 | .unfreeze_fs = gfs2_unfreeze, |
693 | .statfs = gfs2_statfs, | 695 | .statfs = gfs2_statfs, |
694 | .remount_fs = gfs2_remount_fs, | 696 | .remount_fs = gfs2_remount_fs, |
695 | .clear_inode = gfs2_clear_inode, | 697 | .clear_inode = gfs2_clear_inode, |
diff --git a/fs/jfs/super.c b/fs/jfs/super.c index 0dae345e481b..b37d1f78b854 100644 --- a/fs/jfs/super.c +++ b/fs/jfs/super.c | |||
@@ -543,7 +543,7 @@ out_kfree: | |||
543 | return ret; | 543 | return ret; |
544 | } | 544 | } |
545 | 545 | ||
546 | static void jfs_write_super_lockfs(struct super_block *sb) | 546 | static int jfs_freeze(struct super_block *sb) |
547 | { | 547 | { |
548 | struct jfs_sb_info *sbi = JFS_SBI(sb); | 548 | struct jfs_sb_info *sbi = JFS_SBI(sb); |
549 | struct jfs_log *log = sbi->log; | 549 | struct jfs_log *log = sbi->log; |
@@ -553,9 +553,10 @@ static void jfs_write_super_lockfs(struct super_block *sb) | |||
553 | lmLogShutdown(log); | 553 | lmLogShutdown(log); |
554 | updateSuper(sb, FM_CLEAN); | 554 | updateSuper(sb, FM_CLEAN); |
555 | } | 555 | } |
556 | return 0; | ||
556 | } | 557 | } |
557 | 558 | ||
558 | static void jfs_unlockfs(struct super_block *sb) | 559 | static int jfs_unfreeze(struct super_block *sb) |
559 | { | 560 | { |
560 | struct jfs_sb_info *sbi = JFS_SBI(sb); | 561 | struct jfs_sb_info *sbi = JFS_SBI(sb); |
561 | struct jfs_log *log = sbi->log; | 562 | struct jfs_log *log = sbi->log; |
@@ -568,6 +569,7 @@ static void jfs_unlockfs(struct super_block *sb) | |||
568 | else | 569 | else |
569 | txResume(sb); | 570 | txResume(sb); |
570 | } | 571 | } |
572 | return 0; | ||
571 | } | 573 | } |
572 | 574 | ||
573 | static int jfs_get_sb(struct file_system_type *fs_type, | 575 | static int jfs_get_sb(struct file_system_type *fs_type, |
@@ -735,8 +737,8 @@ static const struct super_operations jfs_super_operations = { | |||
735 | .delete_inode = jfs_delete_inode, | 737 | .delete_inode = jfs_delete_inode, |
736 | .put_super = jfs_put_super, | 738 | .put_super = jfs_put_super, |
737 | .sync_fs = jfs_sync_fs, | 739 | .sync_fs = jfs_sync_fs, |
738 | .write_super_lockfs = jfs_write_super_lockfs, | 740 | .freeze_fs = jfs_freeze, |
739 | .unlockfs = jfs_unlockfs, | 741 | .unfreeze_fs = jfs_unfreeze, |
740 | .statfs = jfs_statfs, | 742 | .statfs = jfs_statfs, |
741 | .remount_fs = jfs_remount, | 743 | .remount_fs = jfs_remount, |
742 | .show_options = jfs_show_options, | 744 | .show_options = jfs_show_options, |
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index c55651f1407c..f3c820b75829 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c | |||
@@ -83,7 +83,7 @@ static void reiserfs_write_super(struct super_block *s) | |||
83 | reiserfs_sync_fs(s, 1); | 83 | reiserfs_sync_fs(s, 1); |
84 | } | 84 | } |
85 | 85 | ||
86 | static void reiserfs_write_super_lockfs(struct super_block *s) | 86 | static int reiserfs_freeze(struct super_block *s) |
87 | { | 87 | { |
88 | struct reiserfs_transaction_handle th; | 88 | struct reiserfs_transaction_handle th; |
89 | reiserfs_write_lock(s); | 89 | reiserfs_write_lock(s); |
@@ -101,11 +101,13 @@ static void reiserfs_write_super_lockfs(struct super_block *s) | |||
101 | } | 101 | } |
102 | s->s_dirt = 0; | 102 | s->s_dirt = 0; |
103 | reiserfs_write_unlock(s); | 103 | reiserfs_write_unlock(s); |
104 | return 0; | ||
104 | } | 105 | } |
105 | 106 | ||
106 | static void reiserfs_unlockfs(struct super_block *s) | 107 | static int reiserfs_unfreeze(struct super_block *s) |
107 | { | 108 | { |
108 | reiserfs_allow_writes(s); | 109 | reiserfs_allow_writes(s); |
110 | return 0; | ||
109 | } | 111 | } |
110 | 112 | ||
111 | extern const struct in_core_key MAX_IN_CORE_KEY; | 113 | extern const struct in_core_key MAX_IN_CORE_KEY; |
@@ -613,8 +615,8 @@ static const struct super_operations reiserfs_sops = { | |||
613 | .put_super = reiserfs_put_super, | 615 | .put_super = reiserfs_put_super, |
614 | .write_super = reiserfs_write_super, | 616 | .write_super = reiserfs_write_super, |
615 | .sync_fs = reiserfs_sync_fs, | 617 | .sync_fs = reiserfs_sync_fs, |
616 | .write_super_lockfs = reiserfs_write_super_lockfs, | 618 | .freeze_fs = reiserfs_freeze, |
617 | .unlockfs = reiserfs_unlockfs, | 619 | .unfreeze_fs = reiserfs_unfreeze, |
618 | .statfs = reiserfs_statfs, | 620 | .statfs = reiserfs_statfs, |
619 | .remount_fs = reiserfs_remount, | 621 | .remount_fs = reiserfs_remount, |
620 | .show_options = generic_show_options, | 622 | .show_options = generic_show_options, |
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index be846d606ae8..95a971080368 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c | |||
@@ -1269,14 +1269,14 @@ xfs_fs_remount( | |||
1269 | * need to take care of the metadata. Once that's done write a dummy | 1269 | * need to take care of the metadata. Once that's done write a dummy |
1270 | * record to dirty the log in case of a crash while frozen. | 1270 | * record to dirty the log in case of a crash while frozen. |
1271 | */ | 1271 | */ |
1272 | STATIC void | 1272 | STATIC int |
1273 | xfs_fs_lockfs( | 1273 | xfs_fs_freeze( |
1274 | struct super_block *sb) | 1274 | struct super_block *sb) |
1275 | { | 1275 | { |
1276 | struct xfs_mount *mp = XFS_M(sb); | 1276 | struct xfs_mount *mp = XFS_M(sb); |
1277 | 1277 | ||
1278 | xfs_quiesce_attr(mp); | 1278 | xfs_quiesce_attr(mp); |
1279 | xfs_fs_log_dummy(mp); | 1279 | return -xfs_fs_log_dummy(mp); |
1280 | } | 1280 | } |
1281 | 1281 | ||
1282 | STATIC int | 1282 | STATIC int |
@@ -1557,7 +1557,7 @@ static struct super_operations xfs_super_operations = { | |||
1557 | .put_super = xfs_fs_put_super, | 1557 | .put_super = xfs_fs_put_super, |
1558 | .write_super = xfs_fs_write_super, | 1558 | .write_super = xfs_fs_write_super, |
1559 | .sync_fs = xfs_fs_sync_super, | 1559 | .sync_fs = xfs_fs_sync_super, |
1560 | .write_super_lockfs = xfs_fs_lockfs, | 1560 | .freeze_fs = xfs_fs_freeze, |
1561 | .statfs = xfs_fs_statfs, | 1561 | .statfs = xfs_fs_statfs, |
1562 | .remount_fs = xfs_fs_remount, | 1562 | .remount_fs = xfs_fs_remount, |
1563 | .show_options = xfs_fs_show_options, | 1563 | .show_options = xfs_fs_show_options, |
diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 852b6d32e8d0..680d0e0ec932 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c | |||
@@ -595,17 +595,19 @@ out: | |||
595 | return 0; | 595 | return 0; |
596 | } | 596 | } |
597 | 597 | ||
598 | void | 598 | int |
599 | xfs_fs_log_dummy( | 599 | xfs_fs_log_dummy( |
600 | xfs_mount_t *mp) | 600 | xfs_mount_t *mp) |
601 | { | 601 | { |
602 | xfs_trans_t *tp; | 602 | xfs_trans_t *tp; |
603 | xfs_inode_t *ip; | 603 | xfs_inode_t *ip; |
604 | int error; | ||
604 | 605 | ||
605 | tp = _xfs_trans_alloc(mp, XFS_TRANS_DUMMY1); | 606 | tp = _xfs_trans_alloc(mp, XFS_TRANS_DUMMY1); |
606 | if (xfs_trans_reserve(tp, 0, XFS_ICHANGE_LOG_RES(mp), 0, 0, 0)) { | 607 | error = xfs_trans_reserve(tp, 0, XFS_ICHANGE_LOG_RES(mp), 0, 0, 0); |
608 | if (error) { | ||
607 | xfs_trans_cancel(tp, 0); | 609 | xfs_trans_cancel(tp, 0); |
608 | return; | 610 | return error; |
609 | } | 611 | } |
610 | 612 | ||
611 | ip = mp->m_rootip; | 613 | ip = mp->m_rootip; |
@@ -615,9 +617,10 @@ xfs_fs_log_dummy( | |||
615 | xfs_trans_ihold(tp, ip); | 617 | xfs_trans_ihold(tp, ip); |
616 | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); | 618 | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); |
617 | xfs_trans_set_sync(tp); | 619 | xfs_trans_set_sync(tp); |
618 | xfs_trans_commit(tp, 0); | 620 | error = xfs_trans_commit(tp, 0); |
619 | 621 | ||
620 | xfs_iunlock(ip, XFS_ILOCK_EXCL); | 622 | xfs_iunlock(ip, XFS_ILOCK_EXCL); |
623 | return error; | ||
621 | } | 624 | } |
622 | 625 | ||
623 | int | 626 | int |
diff --git a/fs/xfs/xfs_fsops.h b/fs/xfs/xfs_fsops.h index 300d0c9d61ad..88435e0a77c9 100644 --- a/fs/xfs/xfs_fsops.h +++ b/fs/xfs/xfs_fsops.h | |||
@@ -25,6 +25,6 @@ extern int xfs_fs_counts(xfs_mount_t *mp, xfs_fsop_counts_t *cnt); | |||
25 | extern int xfs_reserve_blocks(xfs_mount_t *mp, __uint64_t *inval, | 25 | extern int xfs_reserve_blocks(xfs_mount_t *mp, __uint64_t *inval, |
26 | xfs_fsop_resblks_t *outval); | 26 | xfs_fsop_resblks_t *outval); |
27 | extern int xfs_fs_goingdown(xfs_mount_t *mp, __uint32_t inflags); | 27 | extern int xfs_fs_goingdown(xfs_mount_t *mp, __uint32_t inflags); |
28 | extern void xfs_fs_log_dummy(xfs_mount_t *mp); | 28 | extern int xfs_fs_log_dummy(xfs_mount_t *mp); |
29 | 29 | ||
30 | #endif /* __XFS_FSOPS_H__ */ | 30 | #endif /* __XFS_FSOPS_H__ */ |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 0b87b29f4797..3e59182de9df 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -1377,8 +1377,8 @@ struct super_operations { | |||
1377 | void (*put_super) (struct super_block *); | 1377 | void (*put_super) (struct super_block *); |
1378 | void (*write_super) (struct super_block *); | 1378 | void (*write_super) (struct super_block *); |
1379 | int (*sync_fs)(struct super_block *sb, int wait); | 1379 | int (*sync_fs)(struct super_block *sb, int wait); |
1380 | void (*write_super_lockfs) (struct super_block *); | 1380 | int (*freeze_fs) (struct super_block *); |
1381 | void (*unlockfs) (struct super_block *); | 1381 | int (*unfreeze_fs) (struct super_block *); |
1382 | int (*statfs) (struct dentry *, struct kstatfs *); | 1382 | int (*statfs) (struct dentry *, struct kstatfs *); |
1383 | int (*remount_fs) (struct super_block *, int *, char *); | 1383 | int (*remount_fs) (struct super_block *, int *, char *); |
1384 | void (*clear_inode) (struct inode *); | 1384 | void (*clear_inode) (struct inode *); |