diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/jffs2/acl.c | 3 | ||||
| -rw-r--r-- | fs/jffs2/dir.c | 127 | ||||
| -rw-r--r-- | fs/jffs2/fs.c | 7 |
3 files changed, 74 insertions, 63 deletions
diff --git a/fs/jffs2/acl.c b/fs/jffs2/acl.c index a33aab6b5e68..54a92fd02bbd 100644 --- a/fs/jffs2/acl.c +++ b/fs/jffs2/acl.c | |||
| @@ -234,8 +234,9 @@ static int jffs2_set_acl(struct inode *inode, int type, struct posix_acl *acl) | |||
| 234 | if (inode->i_mode != mode) { | 234 | if (inode->i_mode != mode) { |
| 235 | struct iattr attr; | 235 | struct iattr attr; |
| 236 | 236 | ||
| 237 | attr.ia_valid = ATTR_MODE; | 237 | attr.ia_valid = ATTR_MODE | ATTR_CTIME; |
| 238 | attr.ia_mode = mode; | 238 | attr.ia_mode = mode; |
| 239 | attr.ia_ctime = CURRENT_TIME_SEC; | ||
| 239 | rc = jffs2_do_setattr(inode, &attr); | 240 | rc = jffs2_do_setattr(inode, &attr); |
| 240 | if (rc < 0) | 241 | if (rc < 0) |
| 241 | return rc; | 242 | return rc; |
diff --git a/fs/jffs2/dir.c b/fs/jffs2/dir.c index 7aa4417e085f..166062a68230 100644 --- a/fs/jffs2/dir.c +++ b/fs/jffs2/dir.c | |||
| @@ -222,15 +222,18 @@ static int jffs2_create(struct inode *dir_i, struct dentry *dentry, int mode, | |||
| 222 | dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(ri->ctime)); | 222 | dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(ri->ctime)); |
| 223 | 223 | ||
| 224 | jffs2_free_raw_inode(ri); | 224 | jffs2_free_raw_inode(ri); |
| 225 | d_instantiate(dentry, inode); | ||
| 226 | 225 | ||
| 227 | D1(printk(KERN_DEBUG "jffs2_create: Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n", | 226 | D1(printk(KERN_DEBUG "jffs2_create: Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n", |
| 228 | inode->i_ino, inode->i_mode, inode->i_nlink, | 227 | inode->i_ino, inode->i_mode, inode->i_nlink, |
| 229 | f->inocache->pino_nlink, inode->i_mapping->nrpages)); | 228 | f->inocache->pino_nlink, inode->i_mapping->nrpages)); |
| 229 | |||
| 230 | d_instantiate(dentry, inode); | ||
| 231 | unlock_new_inode(inode); | ||
| 230 | return 0; | 232 | return 0; |
| 231 | 233 | ||
| 232 | fail: | 234 | fail: |
| 233 | make_bad_inode(inode); | 235 | make_bad_inode(inode); |
| 236 | unlock_new_inode(inode); | ||
| 234 | iput(inode); | 237 | iput(inode); |
| 235 | jffs2_free_raw_inode(ri); | 238 | jffs2_free_raw_inode(ri); |
| 236 | return ret; | 239 | return ret; |
| @@ -360,8 +363,8 @@ static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char | |||
| 360 | /* Eeek. Wave bye bye */ | 363 | /* Eeek. Wave bye bye */ |
| 361 | mutex_unlock(&f->sem); | 364 | mutex_unlock(&f->sem); |
| 362 | jffs2_complete_reservation(c); | 365 | jffs2_complete_reservation(c); |
| 363 | jffs2_clear_inode(inode); | 366 | ret = PTR_ERR(fn); |
| 364 | return PTR_ERR(fn); | 367 | goto fail; |
| 365 | } | 368 | } |
| 366 | 369 | ||
| 367 | /* We use f->target field to store the target path. */ | 370 | /* We use f->target field to store the target path. */ |
| @@ -370,8 +373,8 @@ static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char | |||
| 370 | printk(KERN_WARNING "Can't allocate %d bytes of memory\n", targetlen + 1); | 373 | printk(KERN_WARNING "Can't allocate %d bytes of memory\n", targetlen + 1); |
| 371 | mutex_unlock(&f->sem); | 374 | mutex_unlock(&f->sem); |
| 372 | jffs2_complete_reservation(c); | 375 | jffs2_complete_reservation(c); |
| 373 | jffs2_clear_inode(inode); | 376 | ret = -ENOMEM; |
| 374 | return -ENOMEM; | 377 | goto fail; |
| 375 | } | 378 | } |
| 376 | 379 | ||
| 377 | memcpy(f->target, target, targetlen + 1); | 380 | memcpy(f->target, target, targetlen + 1); |
| @@ -386,30 +389,24 @@ static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char | |||
| 386 | jffs2_complete_reservation(c); | 389 | jffs2_complete_reservation(c); |
| 387 | 390 | ||
| 388 | ret = jffs2_init_security(inode, dir_i); | 391 | ret = jffs2_init_security(inode, dir_i); |
| 389 | if (ret) { | 392 | if (ret) |
| 390 | jffs2_clear_inode(inode); | 393 | goto fail; |
| 391 | return ret; | 394 | |
| 392 | } | ||
| 393 | ret = jffs2_init_acl_post(inode); | 395 | ret = jffs2_init_acl_post(inode); |
| 394 | if (ret) { | 396 | if (ret) |
| 395 | jffs2_clear_inode(inode); | 397 | goto fail; |
| 396 | return ret; | ||
| 397 | } | ||
| 398 | 398 | ||
| 399 | ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen, | 399 | ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen, |
| 400 | ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen)); | 400 | ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen)); |
| 401 | if (ret) { | 401 | if (ret) |
| 402 | /* Eep. */ | 402 | goto fail; |
| 403 | jffs2_clear_inode(inode); | ||
| 404 | return ret; | ||
| 405 | } | ||
| 406 | 403 | ||
| 407 | rd = jffs2_alloc_raw_dirent(); | 404 | rd = jffs2_alloc_raw_dirent(); |
| 408 | if (!rd) { | 405 | if (!rd) { |
| 409 | /* Argh. Now we treat it like a normal delete */ | 406 | /* Argh. Now we treat it like a normal delete */ |
| 410 | jffs2_complete_reservation(c); | 407 | jffs2_complete_reservation(c); |
| 411 | jffs2_clear_inode(inode); | 408 | ret = -ENOMEM; |
| 412 | return -ENOMEM; | 409 | goto fail; |
| 413 | } | 410 | } |
| 414 | 411 | ||
| 415 | dir_f = JFFS2_INODE_INFO(dir_i); | 412 | dir_f = JFFS2_INODE_INFO(dir_i); |
| @@ -437,8 +434,8 @@ static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char | |||
| 437 | jffs2_complete_reservation(c); | 434 | jffs2_complete_reservation(c); |
| 438 | jffs2_free_raw_dirent(rd); | 435 | jffs2_free_raw_dirent(rd); |
| 439 | mutex_unlock(&dir_f->sem); | 436 | mutex_unlock(&dir_f->sem); |
| 440 | jffs2_clear_inode(inode); | 437 | ret = PTR_ERR(fd); |
| 441 | return PTR_ERR(fd); | 438 | goto fail; |
| 442 | } | 439 | } |
| 443 | 440 | ||
| 444 | dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime)); | 441 | dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime)); |
| @@ -453,7 +450,14 @@ static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char | |||
| 453 | jffs2_complete_reservation(c); | 450 | jffs2_complete_reservation(c); |
| 454 | 451 | ||
| 455 | d_instantiate(dentry, inode); | 452 | d_instantiate(dentry, inode); |
| 453 | unlock_new_inode(inode); | ||
| 456 | return 0; | 454 | return 0; |
| 455 | |||
| 456 | fail: | ||
| 457 | make_bad_inode(inode); | ||
| 458 | unlock_new_inode(inode); | ||
| 459 | iput(inode); | ||
| 460 | return ret; | ||
| 457 | } | 461 | } |
| 458 | 462 | ||
| 459 | 463 | ||
| @@ -519,8 +523,8 @@ static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode) | |||
| 519 | /* Eeek. Wave bye bye */ | 523 | /* Eeek. Wave bye bye */ |
| 520 | mutex_unlock(&f->sem); | 524 | mutex_unlock(&f->sem); |
| 521 | jffs2_complete_reservation(c); | 525 | jffs2_complete_reservation(c); |
| 522 | jffs2_clear_inode(inode); | 526 | ret = PTR_ERR(fn); |
| 523 | return PTR_ERR(fn); | 527 | goto fail; |
| 524 | } | 528 | } |
| 525 | /* No data here. Only a metadata node, which will be | 529 | /* No data here. Only a metadata node, which will be |
| 526 | obsoleted by the first data write | 530 | obsoleted by the first data write |
| @@ -531,30 +535,24 @@ static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode) | |||
| 531 | jffs2_complete_reservation(c); | 535 | jffs2_complete_reservation(c); |
| 532 | 536 | ||
| 533 | ret = jffs2_init_security(inode, dir_i); | 537 | ret = jffs2_init_security(inode, dir_i); |
| 534 | if (ret) { | 538 | if (ret) |
| 535 | jffs2_clear_inode(inode); | 539 | goto fail; |
| 536 | return ret; | 540 | |
| 537 | } | ||
| 538 | ret = jffs2_init_acl_post(inode); | 541 | ret = jffs2_init_acl_post(inode); |
| 539 | if (ret) { | 542 | if (ret) |
| 540 | jffs2_clear_inode(inode); | 543 | goto fail; |
| 541 | return ret; | ||
| 542 | } | ||
| 543 | 544 | ||
| 544 | ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen, | 545 | ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen, |
| 545 | ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen)); | 546 | ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen)); |
| 546 | if (ret) { | 547 | if (ret) |
| 547 | /* Eep. */ | 548 | goto fail; |
| 548 | jffs2_clear_inode(inode); | ||
| 549 | return ret; | ||
| 550 | } | ||
| 551 | 549 | ||
| 552 | rd = jffs2_alloc_raw_dirent(); | 550 | rd = jffs2_alloc_raw_dirent(); |
| 553 | if (!rd) { | 551 | if (!rd) { |
| 554 | /* Argh. Now we treat it like a normal delete */ | 552 | /* Argh. Now we treat it like a normal delete */ |
| 555 | jffs2_complete_reservation(c); | 553 | jffs2_complete_reservation(c); |
| 556 | jffs2_clear_inode(inode); | 554 | ret = -ENOMEM; |
| 557 | return -ENOMEM; | 555 | goto fail; |
| 558 | } | 556 | } |
| 559 | 557 | ||
| 560 | dir_f = JFFS2_INODE_INFO(dir_i); | 558 | dir_f = JFFS2_INODE_INFO(dir_i); |
| @@ -582,8 +580,8 @@ static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode) | |||
| 582 | jffs2_complete_reservation(c); | 580 | jffs2_complete_reservation(c); |
| 583 | jffs2_free_raw_dirent(rd); | 581 | jffs2_free_raw_dirent(rd); |
| 584 | mutex_unlock(&dir_f->sem); | 582 | mutex_unlock(&dir_f->sem); |
| 585 | jffs2_clear_inode(inode); | 583 | ret = PTR_ERR(fd); |
| 586 | return PTR_ERR(fd); | 584 | goto fail; |
| 587 | } | 585 | } |
| 588 | 586 | ||
| 589 | dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime)); | 587 | dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime)); |
| @@ -599,7 +597,14 @@ static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode) | |||
| 599 | jffs2_complete_reservation(c); | 597 | jffs2_complete_reservation(c); |
| 600 | 598 | ||
| 601 | d_instantiate(dentry, inode); | 599 | d_instantiate(dentry, inode); |
| 600 | unlock_new_inode(inode); | ||
| 602 | return 0; | 601 | return 0; |
| 602 | |||
| 603 | fail: | ||
| 604 | make_bad_inode(inode); | ||
| 605 | unlock_new_inode(inode); | ||
| 606 | iput(inode); | ||
| 607 | return ret; | ||
| 603 | } | 608 | } |
| 604 | 609 | ||
| 605 | static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry) | 610 | static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry) |
| @@ -693,8 +698,8 @@ static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, de | |||
| 693 | /* Eeek. Wave bye bye */ | 698 | /* Eeek. Wave bye bye */ |
| 694 | mutex_unlock(&f->sem); | 699 | mutex_unlock(&f->sem); |
| 695 | jffs2_complete_reservation(c); | 700 | jffs2_complete_reservation(c); |
| 696 | jffs2_clear_inode(inode); | 701 | ret = PTR_ERR(fn); |
| 697 | return PTR_ERR(fn); | 702 | goto fail; |
| 698 | } | 703 | } |
| 699 | /* No data here. Only a metadata node, which will be | 704 | /* No data here. Only a metadata node, which will be |
| 700 | obsoleted by the first data write | 705 | obsoleted by the first data write |
| @@ -705,30 +710,24 @@ static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, de | |||
| 705 | jffs2_complete_reservation(c); | 710 | jffs2_complete_reservation(c); |
| 706 | 711 | ||
| 707 | ret = jffs2_init_security(inode, dir_i); | 712 | ret = jffs2_init_security(inode, dir_i); |
| 708 | if (ret) { | 713 | if (ret) |
| 709 | jffs2_clear_inode(inode); | 714 | goto fail; |
| 710 | return ret; | 715 | |
| 711 | } | ||
| 712 | ret = jffs2_init_acl_post(inode); | 716 | ret = jffs2_init_acl_post(inode); |
| 713 | if (ret) { | 717 | if (ret) |
| 714 | jffs2_clear_inode(inode); | 718 | goto fail; |
| 715 | return ret; | ||
| 716 | } | ||
| 717 | 719 | ||
| 718 | ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen, | 720 | ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen, |
| 719 | ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen)); | 721 | ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen)); |
| 720 | if (ret) { | 722 | if (ret) |
| 721 | /* Eep. */ | 723 | goto fail; |
| 722 | jffs2_clear_inode(inode); | ||
| 723 | return ret; | ||
| 724 | } | ||
| 725 | 724 | ||
| 726 | rd = jffs2_alloc_raw_dirent(); | 725 | rd = jffs2_alloc_raw_dirent(); |
| 727 | if (!rd) { | 726 | if (!rd) { |
| 728 | /* Argh. Now we treat it like a normal delete */ | 727 | /* Argh. Now we treat it like a normal delete */ |
| 729 | jffs2_complete_reservation(c); | 728 | jffs2_complete_reservation(c); |
| 730 | jffs2_clear_inode(inode); | 729 | ret = -ENOMEM; |
| 731 | return -ENOMEM; | 730 | goto fail; |
| 732 | } | 731 | } |
| 733 | 732 | ||
| 734 | dir_f = JFFS2_INODE_INFO(dir_i); | 733 | dir_f = JFFS2_INODE_INFO(dir_i); |
| @@ -759,8 +758,8 @@ static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, de | |||
| 759 | jffs2_complete_reservation(c); | 758 | jffs2_complete_reservation(c); |
| 760 | jffs2_free_raw_dirent(rd); | 759 | jffs2_free_raw_dirent(rd); |
| 761 | mutex_unlock(&dir_f->sem); | 760 | mutex_unlock(&dir_f->sem); |
| 762 | jffs2_clear_inode(inode); | 761 | ret = PTR_ERR(fd); |
| 763 | return PTR_ERR(fd); | 762 | goto fail; |
| 764 | } | 763 | } |
| 765 | 764 | ||
| 766 | dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime)); | 765 | dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime)); |
| @@ -775,8 +774,14 @@ static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, de | |||
| 775 | jffs2_complete_reservation(c); | 774 | jffs2_complete_reservation(c); |
| 776 | 775 | ||
| 777 | d_instantiate(dentry, inode); | 776 | d_instantiate(dentry, inode); |
| 778 | 777 | unlock_new_inode(inode); | |
| 779 | return 0; | 778 | return 0; |
| 779 | |||
| 780 | fail: | ||
| 781 | make_bad_inode(inode); | ||
| 782 | unlock_new_inode(inode); | ||
| 783 | iput(inode); | ||
| 784 | return ret; | ||
| 780 | } | 785 | } |
| 781 | 786 | ||
| 782 | static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry, | 787 | static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry, |
diff --git a/fs/jffs2/fs.c b/fs/jffs2/fs.c index 8bc2c80ab159..459d39d1ea0b 100644 --- a/fs/jffs2/fs.c +++ b/fs/jffs2/fs.c | |||
| @@ -465,7 +465,12 @@ struct inode *jffs2_new_inode (struct inode *dir_i, int mode, struct jffs2_raw_i | |||
| 465 | inode->i_blocks = 0; | 465 | inode->i_blocks = 0; |
| 466 | inode->i_size = 0; | 466 | inode->i_size = 0; |
| 467 | 467 | ||
| 468 | insert_inode_hash(inode); | 468 | if (insert_inode_locked(inode) < 0) { |
| 469 | make_bad_inode(inode); | ||
| 470 | unlock_new_inode(inode); | ||
| 471 | iput(inode); | ||
| 472 | return ERR_PTR(-EINVAL); | ||
| 473 | } | ||
| 469 | 474 | ||
| 470 | return inode; | 475 | return inode; |
| 471 | } | 476 | } |
