diff options
Diffstat (limited to 'fs/jffs2/super.c')
-rw-r--r-- | fs/jffs2/super.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c index 4c4e18c54a51..07a22caf2687 100644 --- a/fs/jffs2/super.c +++ b/fs/jffs2/super.c | |||
@@ -53,10 +53,29 @@ static void jffs2_i_init_once(void *foo) | |||
53 | inode_init_once(&f->vfs_inode); | 53 | inode_init_once(&f->vfs_inode); |
54 | } | 54 | } |
55 | 55 | ||
56 | static void jffs2_write_super(struct super_block *sb) | ||
57 | { | ||
58 | struct jffs2_sb_info *c = JFFS2_SB_INFO(sb); | ||
59 | |||
60 | lock_super(sb); | ||
61 | sb->s_dirt = 0; | ||
62 | |||
63 | if (!(sb->s_flags & MS_RDONLY)) { | ||
64 | D1(printk(KERN_DEBUG "jffs2_write_super()\n")); | ||
65 | jffs2_garbage_collect_trigger(c); | ||
66 | jffs2_erase_pending_blocks(c, 0); | ||
67 | jffs2_flush_wbuf_gc(c, 0); | ||
68 | } | ||
69 | |||
70 | unlock_super(sb); | ||
71 | } | ||
72 | |||
56 | static int jffs2_sync_fs(struct super_block *sb, int wait) | 73 | static int jffs2_sync_fs(struct super_block *sb, int wait) |
57 | { | 74 | { |
58 | struct jffs2_sb_info *c = JFFS2_SB_INFO(sb); | 75 | struct jffs2_sb_info *c = JFFS2_SB_INFO(sb); |
59 | 76 | ||
77 | jffs2_write_super(sb); | ||
78 | |||
60 | mutex_lock(&c->alloc_sem); | 79 | mutex_lock(&c->alloc_sem); |
61 | jffs2_flush_wbuf_pad(c); | 80 | jffs2_flush_wbuf_pad(c); |
62 | mutex_unlock(&c->alloc_sem); | 81 | mutex_unlock(&c->alloc_sem); |
@@ -174,6 +193,11 @@ static void jffs2_put_super (struct super_block *sb) | |||
174 | 193 | ||
175 | D2(printk(KERN_DEBUG "jffs2: jffs2_put_super()\n")); | 194 | D2(printk(KERN_DEBUG "jffs2: jffs2_put_super()\n")); |
176 | 195 | ||
196 | lock_kernel(); | ||
197 | |||
198 | if (sb->s_dirt) | ||
199 | jffs2_write_super(sb); | ||
200 | |||
177 | mutex_lock(&c->alloc_sem); | 201 | mutex_lock(&c->alloc_sem); |
178 | jffs2_flush_wbuf_pad(c); | 202 | jffs2_flush_wbuf_pad(c); |
179 | mutex_unlock(&c->alloc_sem); | 203 | mutex_unlock(&c->alloc_sem); |
@@ -192,6 +216,8 @@ static void jffs2_put_super (struct super_block *sb) | |||
192 | if (c->mtd->sync) | 216 | if (c->mtd->sync) |
193 | c->mtd->sync(c->mtd); | 217 | c->mtd->sync(c->mtd); |
194 | 218 | ||
219 | unlock_kernel(); | ||
220 | |||
195 | D1(printk(KERN_DEBUG "jffs2_put_super returning\n")); | 221 | D1(printk(KERN_DEBUG "jffs2_put_super returning\n")); |
196 | } | 222 | } |
197 | 223 | ||