aboutsummaryrefslogtreecommitdiffstats
path: root/fs/msdos/namei.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/msdos/namei.c')
-rw-r--r--fs/msdos/namei.c28
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);
317out: 317out:
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);
349out: 351out:
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
406out_free: 411out_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);
431out: 436out:
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 }
568out: 574out:
@@ -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);
636out: 642out:
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