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); |