diff options
Diffstat (limited to 'fs/msdos/namei.c')
-rw-r--r-- | fs/msdos/namei.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/fs/msdos/namei.c b/fs/msdos/namei.c index 9e44158a7540..b0f01b3b0536 100644 --- a/fs/msdos/namei.c +++ b/fs/msdos/namei.c | |||
@@ -280,7 +280,7 @@ static int msdos_create(struct inode *dir, struct dentry *dentry, int mode, | |||
280 | struct nameidata *nd) | 280 | struct nameidata *nd) |
281 | { | 281 | { |
282 | struct super_block *sb = dir->i_sb; | 282 | struct super_block *sb = dir->i_sb; |
283 | struct inode *inode; | 283 | struct inode *inode = NULL; |
284 | struct fat_slot_info sinfo; | 284 | struct fat_slot_info sinfo; |
285 | struct timespec ts; | 285 | struct timespec ts; |
286 | unsigned char msdos_name[MSDOS_NAME]; | 286 | unsigned char msdos_name[MSDOS_NAME]; |
@@ -316,6 +316,8 @@ static int msdos_create(struct inode *dir, struct dentry *dentry, int mode, | |||
316 | d_instantiate(dentry, inode); | 316 | d_instantiate(dentry, inode); |
317 | out: | 317 | out: |
318 | unlock_kernel(); | 318 | unlock_kernel(); |
319 | if (!err) | ||
320 | err = fat_flush_inodes(sb, dir, inode); | ||
319 | return err; | 321 | return err; |
320 | } | 322 | } |
321 | 323 | ||
@@ -341,13 +343,15 @@ static int msdos_rmdir(struct inode *dir, struct dentry *dentry) | |||
341 | err = fat_remove_entries(dir, &sinfo); /* and releases bh */ | 343 | err = fat_remove_entries(dir, &sinfo); /* and releases bh */ |
342 | if (err) | 344 | if (err) |
343 | goto out; | 345 | goto out; |
344 | dir->i_nlink--; | 346 | drop_nlink(dir); |
345 | 347 | ||
346 | inode->i_nlink = 0; | 348 | clear_nlink(inode); |
347 | inode->i_ctime = CURRENT_TIME_SEC; | 349 | inode->i_ctime = CURRENT_TIME_SEC; |
348 | fat_detach(inode); | 350 | fat_detach(inode); |
349 | out: | 351 | out: |
350 | unlock_kernel(); | 352 | unlock_kernel(); |
353 | if (!err) | ||
354 | err = fat_flush_inodes(inode->i_sb, dir, inode); | ||
351 | 355 | ||
352 | return err; | 356 | return err; |
353 | } | 357 | } |
@@ -385,7 +389,7 @@ static int msdos_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
385 | err = msdos_add_entry(dir, msdos_name, 1, is_hid, cluster, &ts, &sinfo); | 389 | err = msdos_add_entry(dir, msdos_name, 1, is_hid, cluster, &ts, &sinfo); |
386 | if (err) | 390 | if (err) |
387 | goto out_free; | 391 | goto out_free; |
388 | dir->i_nlink++; | 392 | inc_nlink(dir); |
389 | 393 | ||
390 | inode = fat_build_inode(sb, sinfo.de, sinfo.i_pos); | 394 | inode = fat_build_inode(sb, sinfo.de, sinfo.i_pos); |
391 | brelse(sinfo.bh); | 395 | brelse(sinfo.bh); |
@@ -401,6 +405,7 @@ static int msdos_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
401 | d_instantiate(dentry, inode); | 405 | d_instantiate(dentry, inode); |
402 | 406 | ||
403 | unlock_kernel(); | 407 | unlock_kernel(); |
408 | fat_flush_inodes(sb, dir, inode); | ||
404 | return 0; | 409 | return 0; |
405 | 410 | ||
406 | out_free: | 411 | out_free: |
@@ -425,11 +430,13 @@ static int msdos_unlink(struct inode *dir, struct dentry *dentry) | |||
425 | err = fat_remove_entries(dir, &sinfo); /* and releases bh */ | 430 | err = fat_remove_entries(dir, &sinfo); /* and releases bh */ |
426 | if (err) | 431 | if (err) |
427 | goto out; | 432 | goto out; |
428 | inode->i_nlink = 0; | 433 | clear_nlink(inode); |
429 | inode->i_ctime = CURRENT_TIME_SEC; | 434 | inode->i_ctime = CURRENT_TIME_SEC; |
430 | fat_detach(inode); | 435 | fat_detach(inode); |
431 | out: | 436 | out: |
432 | unlock_kernel(); | 437 | unlock_kernel(); |
438 | if (!err) | ||
439 | err = fat_flush_inodes(inode->i_sb, dir, inode); | ||
433 | 440 | ||
434 | return err; | 441 | return err; |
435 | } | 442 | } |
@@ -542,9 +549,9 @@ static int do_msdos_rename(struct inode *old_dir, unsigned char *old_name, | |||
542 | if (err) | 549 | if (err) |
543 | goto error_dotdot; | 550 | goto error_dotdot; |
544 | } | 551 | } |
545 | old_dir->i_nlink--; | 552 | drop_nlink(old_dir); |
546 | if (!new_inode) | 553 | if (!new_inode) |
547 | new_dir->i_nlink++; | 554 | inc_nlink(new_dir); |
548 | } | 555 | } |
549 | 556 | ||
550 | err = fat_remove_entries(old_dir, &old_sinfo); /* and releases bh */ | 557 | err = fat_remove_entries(old_dir, &old_sinfo); /* and releases bh */ |
@@ -559,10 +566,9 @@ static int do_msdos_rename(struct inode *old_dir, unsigned char *old_name, | |||
559 | mark_inode_dirty(old_dir); | 566 | mark_inode_dirty(old_dir); |
560 | 567 | ||
561 | if (new_inode) { | 568 | if (new_inode) { |
569 | drop_nlink(new_inode); | ||
562 | if (is_dir) | 570 | if (is_dir) |
563 | new_inode->i_nlink -= 2; | 571 | drop_nlink(new_inode); |
564 | else | ||
565 | new_inode->i_nlink--; | ||
566 | new_inode->i_ctime = ts; | 572 | new_inode->i_ctime = ts; |
567 | } | 573 | } |
568 | out: | 574 | out: |
@@ -635,6 +641,8 @@ static int msdos_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
635 | new_dir, new_msdos_name, new_dentry, is_hid); | 641 | new_dir, new_msdos_name, new_dentry, is_hid); |
636 | out: | 642 | out: |
637 | unlock_kernel(); | 643 | unlock_kernel(); |
644 | if (!err) | ||
645 | err = fat_flush_inodes(old_dir->i_sb, old_dir, new_dir); | ||
638 | return err; | 646 | return err; |
639 | } | 647 | } |
640 | 648 | ||