diff options
Diffstat (limited to 'fs/affs/super.c')
| -rw-r--r-- | fs/affs/super.c | 32 |
1 files changed, 12 insertions, 20 deletions
diff --git a/fs/affs/super.c b/fs/affs/super.c index 16a3e4765f68..33c4e7eef470 100644 --- a/fs/affs/super.c +++ b/fs/affs/super.c | |||
| @@ -26,7 +26,7 @@ static int affs_statfs(struct dentry *dentry, struct kstatfs *buf); | |||
| 26 | static int affs_remount (struct super_block *sb, int *flags, char *data); | 26 | static int affs_remount (struct super_block *sb, int *flags, char *data); |
| 27 | 27 | ||
| 28 | static void | 28 | static void |
| 29 | affs_commit_super(struct super_block *sb, int clean) | 29 | affs_commit_super(struct super_block *sb, int wait, int clean) |
| 30 | { | 30 | { |
| 31 | struct affs_sb_info *sbi = AFFS_SB(sb); | 31 | struct affs_sb_info *sbi = AFFS_SB(sb); |
| 32 | struct buffer_head *bh = sbi->s_root_bh; | 32 | struct buffer_head *bh = sbi->s_root_bh; |
| @@ -36,6 +36,8 @@ affs_commit_super(struct super_block *sb, int clean) | |||
| 36 | secs_to_datestamp(get_seconds(), &tail->disk_change); | 36 | secs_to_datestamp(get_seconds(), &tail->disk_change); |
| 37 | affs_fix_checksum(sb, bh); | 37 | affs_fix_checksum(sb, bh); |
| 38 | mark_buffer_dirty(bh); | 38 | mark_buffer_dirty(bh); |
| 39 | if (wait) | ||
| 40 | sync_dirty_buffer(bh); | ||
| 39 | } | 41 | } |
| 40 | 42 | ||
| 41 | static void | 43 | static void |
| @@ -46,8 +48,8 @@ affs_put_super(struct super_block *sb) | |||
| 46 | 48 | ||
| 47 | lock_kernel(); | 49 | lock_kernel(); |
| 48 | 50 | ||
| 49 | if (!(sb->s_flags & MS_RDONLY)) | 51 | if (!(sb->s_flags & MS_RDONLY) && sb->s_dirt) |
| 50 | affs_commit_super(sb, 1); | 52 | affs_commit_super(sb, 1, 1); |
| 51 | 53 | ||
| 52 | kfree(sbi->s_prefix); | 54 | kfree(sbi->s_prefix); |
| 53 | affs_free_bitmap(sb); | 55 | affs_free_bitmap(sb); |
| @@ -61,27 +63,20 @@ affs_put_super(struct super_block *sb) | |||
| 61 | static void | 63 | static void |
| 62 | affs_write_super(struct super_block *sb) | 64 | affs_write_super(struct super_block *sb) |
| 63 | { | 65 | { |
| 64 | int clean = 2; | ||
| 65 | |||
| 66 | lock_super(sb); | 66 | lock_super(sb); |
| 67 | if (!(sb->s_flags & MS_RDONLY)) { | 67 | if (!(sb->s_flags & MS_RDONLY)) |
| 68 | // if (sbi->s_bitmap[i].bm_bh) { | 68 | affs_commit_super(sb, 1, 2); |
| 69 | // if (buffer_dirty(sbi->s_bitmap[i].bm_bh)) { | 69 | sb->s_dirt = 0; |
| 70 | // clean = 0; | ||
| 71 | affs_commit_super(sb, clean); | ||
| 72 | sb->s_dirt = !clean; /* redo until bitmap synced */ | ||
| 73 | } else | ||
| 74 | sb->s_dirt = 0; | ||
| 75 | unlock_super(sb); | 70 | unlock_super(sb); |
| 76 | 71 | ||
| 77 | pr_debug("AFFS: write_super() at %lu, clean=%d\n", get_seconds(), clean); | 72 | pr_debug("AFFS: write_super() at %lu, clean=2\n", get_seconds()); |
| 78 | } | 73 | } |
| 79 | 74 | ||
| 80 | static int | 75 | static int |
| 81 | affs_sync_fs(struct super_block *sb, int wait) | 76 | affs_sync_fs(struct super_block *sb, int wait) |
| 82 | { | 77 | { |
| 83 | lock_super(sb); | 78 | lock_super(sb); |
| 84 | affs_commit_super(sb, 2); | 79 | affs_commit_super(sb, wait, 2); |
| 85 | sb->s_dirt = 0; | 80 | sb->s_dirt = 0; |
| 86 | unlock_super(sb); | 81 | unlock_super(sb); |
| 87 | return 0; | 82 | return 0; |
| @@ -140,8 +135,7 @@ static const struct super_operations affs_sops = { | |||
| 140 | .alloc_inode = affs_alloc_inode, | 135 | .alloc_inode = affs_alloc_inode, |
| 141 | .destroy_inode = affs_destroy_inode, | 136 | .destroy_inode = affs_destroy_inode, |
| 142 | .write_inode = affs_write_inode, | 137 | .write_inode = affs_write_inode, |
| 143 | .delete_inode = affs_delete_inode, | 138 | .evict_inode = affs_evict_inode, |
| 144 | .clear_inode = affs_clear_inode, | ||
| 145 | .put_super = affs_put_super, | 139 | .put_super = affs_put_super, |
| 146 | .write_super = affs_write_super, | 140 | .write_super = affs_write_super, |
| 147 | .sync_fs = affs_sync_fs, | 141 | .sync_fs = affs_sync_fs, |
| @@ -554,9 +548,7 @@ affs_remount(struct super_block *sb, int *flags, char *data) | |||
| 554 | return 0; | 548 | return 0; |
| 555 | } | 549 | } |
| 556 | if (*flags & MS_RDONLY) { | 550 | if (*flags & MS_RDONLY) { |
| 557 | sb->s_dirt = 1; | 551 | affs_write_super(sb); |
| 558 | while (sb->s_dirt) | ||
| 559 | affs_write_super(sb); | ||
| 560 | affs_free_bitmap(sb); | 552 | affs_free_bitmap(sb); |
| 561 | } else | 553 | } else |
| 562 | res = affs_init_bitmap(sb, flags); | 554 | res = affs_init_bitmap(sb, flags); |
