diff options
Diffstat (limited to 'fs/fat')
-rw-r--r-- | fs/fat/dir.c | 16 | ||||
-rw-r--r-- | fs/fat/fat.h | 6 | ||||
-rw-r--r-- | fs/fat/fatent.c | 13 | ||||
-rw-r--r-- | fs/fat/file.c | 14 | ||||
-rw-r--r-- | fs/fat/inode.c | 31 | ||||
-rw-r--r-- | fs/fat/namei_msdos.c | 4 | ||||
-rw-r--r-- | fs/fat/namei_vfat.c | 4 |
7 files changed, 69 insertions, 19 deletions
diff --git a/fs/fat/dir.c b/fs/fat/dir.c index 7e7924c2ea30..3b8e71b412fd 100644 --- a/fs/fat/dir.c +++ b/fs/fat/dir.c | |||
@@ -840,7 +840,7 @@ const struct file_operations fat_dir_operations = { | |||
840 | #ifdef CONFIG_COMPAT | 840 | #ifdef CONFIG_COMPAT |
841 | .compat_ioctl = fat_compat_dir_ioctl, | 841 | .compat_ioctl = fat_compat_dir_ioctl, |
842 | #endif | 842 | #endif |
843 | .fsync = file_fsync, | 843 | .fsync = fat_file_fsync, |
844 | }; | 844 | }; |
845 | 845 | ||
846 | static int fat_get_short_entry(struct inode *dir, loff_t *pos, | 846 | static int fat_get_short_entry(struct inode *dir, loff_t *pos, |
@@ -967,7 +967,7 @@ static int __fat_remove_entries(struct inode *dir, loff_t pos, int nr_slots) | |||
967 | de++; | 967 | de++; |
968 | nr_slots--; | 968 | nr_slots--; |
969 | } | 969 | } |
970 | mark_buffer_dirty(bh); | 970 | mark_buffer_dirty_inode(bh, dir); |
971 | if (IS_DIRSYNC(dir)) | 971 | if (IS_DIRSYNC(dir)) |
972 | err = sync_dirty_buffer(bh); | 972 | err = sync_dirty_buffer(bh); |
973 | brelse(bh); | 973 | brelse(bh); |
@@ -1001,7 +1001,7 @@ int fat_remove_entries(struct inode *dir, struct fat_slot_info *sinfo) | |||
1001 | de--; | 1001 | de--; |
1002 | nr_slots--; | 1002 | nr_slots--; |
1003 | } | 1003 | } |
1004 | mark_buffer_dirty(bh); | 1004 | mark_buffer_dirty_inode(bh, dir); |
1005 | if (IS_DIRSYNC(dir)) | 1005 | if (IS_DIRSYNC(dir)) |
1006 | err = sync_dirty_buffer(bh); | 1006 | err = sync_dirty_buffer(bh); |
1007 | brelse(bh); | 1007 | brelse(bh); |
@@ -1051,7 +1051,7 @@ static int fat_zeroed_cluster(struct inode *dir, sector_t blknr, int nr_used, | |||
1051 | } | 1051 | } |
1052 | memset(bhs[n]->b_data, 0, sb->s_blocksize); | 1052 | memset(bhs[n]->b_data, 0, sb->s_blocksize); |
1053 | set_buffer_uptodate(bhs[n]); | 1053 | set_buffer_uptodate(bhs[n]); |
1054 | mark_buffer_dirty(bhs[n]); | 1054 | mark_buffer_dirty_inode(bhs[n], dir); |
1055 | 1055 | ||
1056 | n++; | 1056 | n++; |
1057 | blknr++; | 1057 | blknr++; |
@@ -1131,7 +1131,7 @@ int fat_alloc_new_dir(struct inode *dir, struct timespec *ts) | |||
1131 | de[0].size = de[1].size = 0; | 1131 | de[0].size = de[1].size = 0; |
1132 | memset(de + 2, 0, sb->s_blocksize - 2 * sizeof(*de)); | 1132 | memset(de + 2, 0, sb->s_blocksize - 2 * sizeof(*de)); |
1133 | set_buffer_uptodate(bhs[0]); | 1133 | set_buffer_uptodate(bhs[0]); |
1134 | mark_buffer_dirty(bhs[0]); | 1134 | mark_buffer_dirty_inode(bhs[0], dir); |
1135 | 1135 | ||
1136 | err = fat_zeroed_cluster(dir, blknr, 1, bhs, MAX_BUF_PER_PAGE); | 1136 | err = fat_zeroed_cluster(dir, blknr, 1, bhs, MAX_BUF_PER_PAGE); |
1137 | if (err) | 1137 | if (err) |
@@ -1193,7 +1193,7 @@ static int fat_add_new_entries(struct inode *dir, void *slots, int nr_slots, | |||
1193 | slots += copy; | 1193 | slots += copy; |
1194 | size -= copy; | 1194 | size -= copy; |
1195 | set_buffer_uptodate(bhs[n]); | 1195 | set_buffer_uptodate(bhs[n]); |
1196 | mark_buffer_dirty(bhs[n]); | 1196 | mark_buffer_dirty_inode(bhs[n], dir); |
1197 | if (!size) | 1197 | if (!size) |
1198 | break; | 1198 | break; |
1199 | n++; | 1199 | n++; |
@@ -1293,7 +1293,7 @@ found: | |||
1293 | for (i = 0; i < long_bhs; i++) { | 1293 | for (i = 0; i < long_bhs; i++) { |
1294 | int copy = min_t(int, sb->s_blocksize - offset, size); | 1294 | int copy = min_t(int, sb->s_blocksize - offset, size); |
1295 | memcpy(bhs[i]->b_data + offset, slots, copy); | 1295 | memcpy(bhs[i]->b_data + offset, slots, copy); |
1296 | mark_buffer_dirty(bhs[i]); | 1296 | mark_buffer_dirty_inode(bhs[i], dir); |
1297 | offset = 0; | 1297 | offset = 0; |
1298 | slots += copy; | 1298 | slots += copy; |
1299 | size -= copy; | 1299 | size -= copy; |
@@ -1304,7 +1304,7 @@ found: | |||
1304 | /* Fill the short name slot. */ | 1304 | /* Fill the short name slot. */ |
1305 | int copy = min_t(int, sb->s_blocksize - offset, size); | 1305 | int copy = min_t(int, sb->s_blocksize - offset, size); |
1306 | memcpy(bhs[i]->b_data + offset, slots, copy); | 1306 | memcpy(bhs[i]->b_data + offset, slots, copy); |
1307 | mark_buffer_dirty(bhs[i]); | 1307 | mark_buffer_dirty_inode(bhs[i], dir); |
1308 | if (IS_DIRSYNC(dir)) | 1308 | if (IS_DIRSYNC(dir)) |
1309 | err = sync_dirty_buffer(bhs[i]); | 1309 | err = sync_dirty_buffer(bhs[i]); |
1310 | } | 1310 | } |
diff --git a/fs/fat/fat.h b/fs/fat/fat.h index ed10896d5da5..adb0e72a176d 100644 --- a/fs/fat/fat.h +++ b/fs/fat/fat.h | |||
@@ -79,6 +79,7 @@ struct msdos_sb_info { | |||
79 | 79 | ||
80 | int fatent_shift; | 80 | int fatent_shift; |
81 | struct fatent_operations *fatent_ops; | 81 | struct fatent_operations *fatent_ops; |
82 | struct inode *fat_inode; | ||
82 | 83 | ||
83 | spinlock_t inode_hash_lock; | 84 | spinlock_t inode_hash_lock; |
84 | struct hlist_head inode_hashtable[FAT_HASH_SIZE]; | 85 | struct hlist_head inode_hashtable[FAT_HASH_SIZE]; |
@@ -256,6 +257,7 @@ struct fat_entry { | |||
256 | } u; | 257 | } u; |
257 | int nr_bhs; | 258 | int nr_bhs; |
258 | struct buffer_head *bhs[2]; | 259 | struct buffer_head *bhs[2]; |
260 | struct inode *fat_inode; | ||
259 | }; | 261 | }; |
260 | 262 | ||
261 | static inline void fatent_init(struct fat_entry *fatent) | 263 | static inline void fatent_init(struct fat_entry *fatent) |
@@ -264,6 +266,7 @@ static inline void fatent_init(struct fat_entry *fatent) | |||
264 | fatent->entry = 0; | 266 | fatent->entry = 0; |
265 | fatent->u.ent32_p = NULL; | 267 | fatent->u.ent32_p = NULL; |
266 | fatent->bhs[0] = fatent->bhs[1] = NULL; | 268 | fatent->bhs[0] = fatent->bhs[1] = NULL; |
269 | fatent->fat_inode = NULL; | ||
267 | } | 270 | } |
268 | 271 | ||
269 | static inline void fatent_set_entry(struct fat_entry *fatent, int entry) | 272 | static inline void fatent_set_entry(struct fat_entry *fatent, int entry) |
@@ -280,6 +283,7 @@ static inline void fatent_brelse(struct fat_entry *fatent) | |||
280 | brelse(fatent->bhs[i]); | 283 | brelse(fatent->bhs[i]); |
281 | fatent->nr_bhs = 0; | 284 | fatent->nr_bhs = 0; |
282 | fatent->bhs[0] = fatent->bhs[1] = NULL; | 285 | fatent->bhs[0] = fatent->bhs[1] = NULL; |
286 | fatent->fat_inode = NULL; | ||
283 | } | 287 | } |
284 | 288 | ||
285 | extern void fat_ent_access_init(struct super_block *sb); | 289 | extern void fat_ent_access_init(struct super_block *sb); |
@@ -301,6 +305,8 @@ extern int fat_setattr(struct dentry * dentry, struct iattr * attr); | |||
301 | extern void fat_truncate(struct inode *inode); | 305 | extern void fat_truncate(struct inode *inode); |
302 | extern int fat_getattr(struct vfsmount *mnt, struct dentry *dentry, | 306 | extern int fat_getattr(struct vfsmount *mnt, struct dentry *dentry, |
303 | struct kstat *stat); | 307 | struct kstat *stat); |
308 | extern int fat_file_fsync(struct file *file, struct dentry *dentry, | ||
309 | int datasync); | ||
304 | 310 | ||
305 | /* fat/inode.c */ | 311 | /* fat/inode.c */ |
306 | extern void fat_attach(struct inode *inode, loff_t i_pos); | 312 | extern void fat_attach(struct inode *inode, loff_t i_pos); |
diff --git a/fs/fat/fatent.c b/fs/fat/fatent.c index 60c31f7e678c..a81037721a6f 100644 --- a/fs/fat/fatent.c +++ b/fs/fat/fatent.c | |||
@@ -73,6 +73,8 @@ static int fat12_ent_bread(struct super_block *sb, struct fat_entry *fatent, | |||
73 | struct buffer_head **bhs = fatent->bhs; | 73 | struct buffer_head **bhs = fatent->bhs; |
74 | 74 | ||
75 | WARN_ON(blocknr < MSDOS_SB(sb)->fat_start); | 75 | WARN_ON(blocknr < MSDOS_SB(sb)->fat_start); |
76 | fatent->fat_inode = MSDOS_SB(sb)->fat_inode; | ||
77 | |||
76 | bhs[0] = sb_bread(sb, blocknr); | 78 | bhs[0] = sb_bread(sb, blocknr); |
77 | if (!bhs[0]) | 79 | if (!bhs[0]) |
78 | goto err; | 80 | goto err; |
@@ -103,6 +105,7 @@ static int fat_ent_bread(struct super_block *sb, struct fat_entry *fatent, | |||
103 | struct fatent_operations *ops = MSDOS_SB(sb)->fatent_ops; | 105 | struct fatent_operations *ops = MSDOS_SB(sb)->fatent_ops; |
104 | 106 | ||
105 | WARN_ON(blocknr < MSDOS_SB(sb)->fat_start); | 107 | WARN_ON(blocknr < MSDOS_SB(sb)->fat_start); |
108 | fatent->fat_inode = MSDOS_SB(sb)->fat_inode; | ||
106 | fatent->bhs[0] = sb_bread(sb, blocknr); | 109 | fatent->bhs[0] = sb_bread(sb, blocknr); |
107 | if (!fatent->bhs[0]) { | 110 | if (!fatent->bhs[0]) { |
108 | printk(KERN_ERR "FAT: FAT read failed (blocknr %llu)\n", | 111 | printk(KERN_ERR "FAT: FAT read failed (blocknr %llu)\n", |
@@ -167,9 +170,9 @@ static void fat12_ent_put(struct fat_entry *fatent, int new) | |||
167 | } | 170 | } |
168 | spin_unlock(&fat12_entry_lock); | 171 | spin_unlock(&fat12_entry_lock); |
169 | 172 | ||
170 | mark_buffer_dirty(fatent->bhs[0]); | 173 | mark_buffer_dirty_inode(fatent->bhs[0], fatent->fat_inode); |
171 | if (fatent->nr_bhs == 2) | 174 | if (fatent->nr_bhs == 2) |
172 | mark_buffer_dirty(fatent->bhs[1]); | 175 | mark_buffer_dirty_inode(fatent->bhs[1], fatent->fat_inode); |
173 | } | 176 | } |
174 | 177 | ||
175 | static void fat16_ent_put(struct fat_entry *fatent, int new) | 178 | static void fat16_ent_put(struct fat_entry *fatent, int new) |
@@ -178,7 +181,7 @@ static void fat16_ent_put(struct fat_entry *fatent, int new) | |||
178 | new = EOF_FAT16; | 181 | new = EOF_FAT16; |
179 | 182 | ||
180 | *fatent->u.ent16_p = cpu_to_le16(new); | 183 | *fatent->u.ent16_p = cpu_to_le16(new); |
181 | mark_buffer_dirty(fatent->bhs[0]); | 184 | mark_buffer_dirty_inode(fatent->bhs[0], fatent->fat_inode); |
182 | } | 185 | } |
183 | 186 | ||
184 | static void fat32_ent_put(struct fat_entry *fatent, int new) | 187 | static void fat32_ent_put(struct fat_entry *fatent, int new) |
@@ -189,7 +192,7 @@ static void fat32_ent_put(struct fat_entry *fatent, int new) | |||
189 | WARN_ON(new & 0xf0000000); | 192 | WARN_ON(new & 0xf0000000); |
190 | new |= le32_to_cpu(*fatent->u.ent32_p) & ~0x0fffffff; | 193 | new |= le32_to_cpu(*fatent->u.ent32_p) & ~0x0fffffff; |
191 | *fatent->u.ent32_p = cpu_to_le32(new); | 194 | *fatent->u.ent32_p = cpu_to_le32(new); |
192 | mark_buffer_dirty(fatent->bhs[0]); | 195 | mark_buffer_dirty_inode(fatent->bhs[0], fatent->fat_inode); |
193 | } | 196 | } |
194 | 197 | ||
195 | static int fat12_ent_next(struct fat_entry *fatent) | 198 | static int fat12_ent_next(struct fat_entry *fatent) |
@@ -381,7 +384,7 @@ static int fat_mirror_bhs(struct super_block *sb, struct buffer_head **bhs, | |||
381 | } | 384 | } |
382 | memcpy(c_bh->b_data, bhs[n]->b_data, sb->s_blocksize); | 385 | memcpy(c_bh->b_data, bhs[n]->b_data, sb->s_blocksize); |
383 | set_buffer_uptodate(c_bh); | 386 | set_buffer_uptodate(c_bh); |
384 | mark_buffer_dirty(c_bh); | 387 | mark_buffer_dirty_inode(c_bh, sbi->fat_inode); |
385 | if (sb->s_flags & MS_SYNCHRONOUS) | 388 | if (sb->s_flags & MS_SYNCHRONOUS) |
386 | err = sync_dirty_buffer(c_bh); | 389 | err = sync_dirty_buffer(c_bh); |
387 | brelse(c_bh); | 390 | brelse(c_bh); |
diff --git a/fs/fat/file.c b/fs/fat/file.c index 9b94094c7010..b28ea646ff60 100644 --- a/fs/fat/file.c +++ b/fs/fat/file.c | |||
@@ -139,6 +139,18 @@ static int fat_file_release(struct inode *inode, struct file *filp) | |||
139 | return 0; | 139 | return 0; |
140 | } | 140 | } |
141 | 141 | ||
142 | int fat_file_fsync(struct file *filp, struct dentry *dentry, int datasync) | ||
143 | { | ||
144 | struct inode *inode = dentry->d_inode; | ||
145 | int res, err; | ||
146 | |||
147 | res = simple_fsync(filp, dentry, datasync); | ||
148 | err = sync_mapping_buffers(MSDOS_SB(inode->i_sb)->fat_inode->i_mapping); | ||
149 | |||
150 | return res ? res : err; | ||
151 | } | ||
152 | |||
153 | |||
142 | const struct file_operations fat_file_operations = { | 154 | const struct file_operations fat_file_operations = { |
143 | .llseek = generic_file_llseek, | 155 | .llseek = generic_file_llseek, |
144 | .read = do_sync_read, | 156 | .read = do_sync_read, |
@@ -148,7 +160,7 @@ const struct file_operations fat_file_operations = { | |||
148 | .mmap = generic_file_mmap, | 160 | .mmap = generic_file_mmap, |
149 | .release = fat_file_release, | 161 | .release = fat_file_release, |
150 | .ioctl = fat_generic_ioctl, | 162 | .ioctl = fat_generic_ioctl, |
151 | .fsync = file_fsync, | 163 | .fsync = fat_file_fsync, |
152 | .splice_read = generic_file_splice_read, | 164 | .splice_read = generic_file_splice_read, |
153 | }; | 165 | }; |
154 | 166 | ||
diff --git a/fs/fat/inode.c b/fs/fat/inode.c index 2b9052265e3e..304b411cb8bc 100644 --- a/fs/fat/inode.c +++ b/fs/fat/inode.c | |||
@@ -441,16 +441,35 @@ static void fat_clear_inode(struct inode *inode) | |||
441 | 441 | ||
442 | static void fat_write_super(struct super_block *sb) | 442 | static void fat_write_super(struct super_block *sb) |
443 | { | 443 | { |
444 | lock_super(sb); | ||
444 | sb->s_dirt = 0; | 445 | sb->s_dirt = 0; |
445 | 446 | ||
446 | if (!(sb->s_flags & MS_RDONLY)) | 447 | if (!(sb->s_flags & MS_RDONLY)) |
447 | fat_clusters_flush(sb); | 448 | fat_clusters_flush(sb); |
449 | unlock_super(sb); | ||
450 | } | ||
451 | |||
452 | static int fat_sync_fs(struct super_block *sb, int wait) | ||
453 | { | ||
454 | lock_super(sb); | ||
455 | fat_clusters_flush(sb); | ||
456 | sb->s_dirt = 0; | ||
457 | unlock_super(sb); | ||
458 | |||
459 | return 0; | ||
448 | } | 460 | } |
449 | 461 | ||
450 | static void fat_put_super(struct super_block *sb) | 462 | static void fat_put_super(struct super_block *sb) |
451 | { | 463 | { |
452 | struct msdos_sb_info *sbi = MSDOS_SB(sb); | 464 | struct msdos_sb_info *sbi = MSDOS_SB(sb); |
453 | 465 | ||
466 | lock_kernel(); | ||
467 | |||
468 | if (sb->s_dirt) | ||
469 | fat_write_super(sb); | ||
470 | |||
471 | iput(sbi->fat_inode); | ||
472 | |||
454 | if (sbi->nls_disk) { | 473 | if (sbi->nls_disk) { |
455 | unload_nls(sbi->nls_disk); | 474 | unload_nls(sbi->nls_disk); |
456 | sbi->nls_disk = NULL; | 475 | sbi->nls_disk = NULL; |
@@ -467,6 +486,8 @@ static void fat_put_super(struct super_block *sb) | |||
467 | 486 | ||
468 | sb->s_fs_info = NULL; | 487 | sb->s_fs_info = NULL; |
469 | kfree(sbi); | 488 | kfree(sbi); |
489 | |||
490 | unlock_kernel(); | ||
470 | } | 491 | } |
471 | 492 | ||
472 | static struct kmem_cache *fat_inode_cachep; | 493 | static struct kmem_cache *fat_inode_cachep; |
@@ -632,6 +653,7 @@ static const struct super_operations fat_sops = { | |||
632 | .delete_inode = fat_delete_inode, | 653 | .delete_inode = fat_delete_inode, |
633 | .put_super = fat_put_super, | 654 | .put_super = fat_put_super, |
634 | .write_super = fat_write_super, | 655 | .write_super = fat_write_super, |
656 | .sync_fs = fat_sync_fs, | ||
635 | .statfs = fat_statfs, | 657 | .statfs = fat_statfs, |
636 | .clear_inode = fat_clear_inode, | 658 | .clear_inode = fat_clear_inode, |
637 | .remount_fs = fat_remount, | 659 | .remount_fs = fat_remount, |
@@ -1194,7 +1216,7 @@ static int fat_read_root(struct inode *inode) | |||
1194 | int fat_fill_super(struct super_block *sb, void *data, int silent, | 1216 | int fat_fill_super(struct super_block *sb, void *data, int silent, |
1195 | const struct inode_operations *fs_dir_inode_ops, int isvfat) | 1217 | const struct inode_operations *fs_dir_inode_ops, int isvfat) |
1196 | { | 1218 | { |
1197 | struct inode *root_inode = NULL; | 1219 | struct inode *root_inode = NULL, *fat_inode = NULL; |
1198 | struct buffer_head *bh; | 1220 | struct buffer_head *bh; |
1199 | struct fat_boot_sector *b; | 1221 | struct fat_boot_sector *b; |
1200 | struct msdos_sb_info *sbi; | 1222 | struct msdos_sb_info *sbi; |
@@ -1434,6 +1456,11 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, | |||
1434 | } | 1456 | } |
1435 | 1457 | ||
1436 | error = -ENOMEM; | 1458 | error = -ENOMEM; |
1459 | fat_inode = new_inode(sb); | ||
1460 | if (!fat_inode) | ||
1461 | goto out_fail; | ||
1462 | MSDOS_I(fat_inode)->i_pos = 0; | ||
1463 | sbi->fat_inode = fat_inode; | ||
1437 | root_inode = new_inode(sb); | 1464 | root_inode = new_inode(sb); |
1438 | if (!root_inode) | 1465 | if (!root_inode) |
1439 | goto out_fail; | 1466 | goto out_fail; |
@@ -1459,6 +1486,8 @@ out_invalid: | |||
1459 | " on dev %s.\n", sb->s_id); | 1486 | " on dev %s.\n", sb->s_id); |
1460 | 1487 | ||
1461 | out_fail: | 1488 | out_fail: |
1489 | if (fat_inode) | ||
1490 | iput(fat_inode); | ||
1462 | if (root_inode) | 1491 | if (root_inode) |
1463 | iput(root_inode); | 1492 | iput(root_inode); |
1464 | if (sbi->nls_io) | 1493 | if (sbi->nls_io) |
diff --git a/fs/fat/namei_msdos.c b/fs/fat/namei_msdos.c index 72f5c6402ef3..82f88733b681 100644 --- a/fs/fat/namei_msdos.c +++ b/fs/fat/namei_msdos.c | |||
@@ -544,7 +544,7 @@ static int do_msdos_rename(struct inode *old_dir, unsigned char *old_name, | |||
544 | int start = MSDOS_I(new_dir)->i_logstart; | 544 | int start = MSDOS_I(new_dir)->i_logstart; |
545 | dotdot_de->start = cpu_to_le16(start); | 545 | dotdot_de->start = cpu_to_le16(start); |
546 | dotdot_de->starthi = cpu_to_le16(start >> 16); | 546 | dotdot_de->starthi = cpu_to_le16(start >> 16); |
547 | mark_buffer_dirty(dotdot_bh); | 547 | mark_buffer_dirty_inode(dotdot_bh, old_inode); |
548 | if (IS_DIRSYNC(new_dir)) { | 548 | if (IS_DIRSYNC(new_dir)) { |
549 | err = sync_dirty_buffer(dotdot_bh); | 549 | err = sync_dirty_buffer(dotdot_bh); |
550 | if (err) | 550 | if (err) |
@@ -586,7 +586,7 @@ error_dotdot: | |||
586 | int start = MSDOS_I(old_dir)->i_logstart; | 586 | int start = MSDOS_I(old_dir)->i_logstart; |
587 | dotdot_de->start = cpu_to_le16(start); | 587 | dotdot_de->start = cpu_to_le16(start); |
588 | dotdot_de->starthi = cpu_to_le16(start >> 16); | 588 | dotdot_de->starthi = cpu_to_le16(start >> 16); |
589 | mark_buffer_dirty(dotdot_bh); | 589 | mark_buffer_dirty_inode(dotdot_bh, old_inode); |
590 | corrupt |= sync_dirty_buffer(dotdot_bh); | 590 | corrupt |= sync_dirty_buffer(dotdot_bh); |
591 | } | 591 | } |
592 | error_inode: | 592 | error_inode: |
diff --git a/fs/fat/namei_vfat.c b/fs/fat/namei_vfat.c index cb6ddb8c0bc2..8d6fdcfd41df 100644 --- a/fs/fat/namei_vfat.c +++ b/fs/fat/namei_vfat.c | |||
@@ -965,7 +965,7 @@ static int vfat_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
965 | int start = MSDOS_I(new_dir)->i_logstart; | 965 | int start = MSDOS_I(new_dir)->i_logstart; |
966 | dotdot_de->start = cpu_to_le16(start); | 966 | dotdot_de->start = cpu_to_le16(start); |
967 | dotdot_de->starthi = cpu_to_le16(start >> 16); | 967 | dotdot_de->starthi = cpu_to_le16(start >> 16); |
968 | mark_buffer_dirty(dotdot_bh); | 968 | mark_buffer_dirty_inode(dotdot_bh, old_inode); |
969 | if (IS_DIRSYNC(new_dir)) { | 969 | if (IS_DIRSYNC(new_dir)) { |
970 | err = sync_dirty_buffer(dotdot_bh); | 970 | err = sync_dirty_buffer(dotdot_bh); |
971 | if (err) | 971 | if (err) |
@@ -1009,7 +1009,7 @@ error_dotdot: | |||
1009 | int start = MSDOS_I(old_dir)->i_logstart; | 1009 | int start = MSDOS_I(old_dir)->i_logstart; |
1010 | dotdot_de->start = cpu_to_le16(start); | 1010 | dotdot_de->start = cpu_to_le16(start); |
1011 | dotdot_de->starthi = cpu_to_le16(start >> 16); | 1011 | dotdot_de->starthi = cpu_to_le16(start >> 16); |
1012 | mark_buffer_dirty(dotdot_bh); | 1012 | mark_buffer_dirty_inode(dotdot_bh, old_inode); |
1013 | corrupt |= sync_dirty_buffer(dotdot_bh); | 1013 | corrupt |= sync_dirty_buffer(dotdot_bh); |
1014 | } | 1014 | } |
1015 | error_inode: | 1015 | error_inode: |