diff options
| -rw-r--r-- | drivers/mtd/mtdchar.c | 11 | ||||
| -rw-r--r-- | drivers/mtd/nand/Kconfig | 21 | ||||
| -rw-r--r-- | drivers/mtd/nand/r852.c | 27 | ||||
| -rw-r--r-- | fs/jffs2/acl.c | 3 | ||||
| -rw-r--r-- | fs/jffs2/dir.c | 127 | ||||
| -rw-r--r-- | fs/jffs2/fs.c | 7 |
6 files changed, 106 insertions, 90 deletions
diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c index 000d65ea55a4..91c8013cf0d9 100644 --- a/drivers/mtd/mtdchar.c +++ b/drivers/mtd/mtdchar.c | |||
| @@ -404,14 +404,9 @@ static int mtd_do_writeoob(struct file *file, struct mtd_info *mtd, | |||
| 404 | if (ops.ooboffs && ops.ooblen > (mtd->oobsize - ops.ooboffs)) | 404 | if (ops.ooboffs && ops.ooblen > (mtd->oobsize - ops.ooboffs)) |
| 405 | return -EINVAL; | 405 | return -EINVAL; |
| 406 | 406 | ||
| 407 | ops.oobbuf = kmalloc(length, GFP_KERNEL); | 407 | ops.oobbuf = memdup_user(ptr, length); |
| 408 | if (!ops.oobbuf) | 408 | if (IS_ERR(ops.oobbuf)) |
| 409 | return -ENOMEM; | 409 | return PTR_ERR(ops.oobbuf); |
| 410 | |||
| 411 | if (copy_from_user(ops.oobbuf, ptr, length)) { | ||
| 412 | kfree(ops.oobbuf); | ||
| 413 | return -EFAULT; | ||
| 414 | } | ||
| 415 | 410 | ||
| 416 | start &= ~((uint64_t)mtd->oobsize - 1); | 411 | start &= ~((uint64_t)mtd->oobsize - 1); |
| 417 | ret = mtd->write_oob(mtd, start, &ops); | 412 | ret = mtd->write_oob(mtd, start, &ops); |
diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig index 98a04b3c9526..ffc3720929f1 100644 --- a/drivers/mtd/nand/Kconfig +++ b/drivers/mtd/nand/Kconfig | |||
| @@ -1,13 +1,3 @@ | |||
| 1 | menuconfig MTD_NAND | ||
| 2 | tristate "NAND Device Support" | ||
| 3 | depends on MTD | ||
| 4 | select MTD_NAND_IDS | ||
| 5 | select MTD_NAND_ECC | ||
| 6 | help | ||
| 7 | This enables support for accessing all type of NAND flash | ||
| 8 | devices. For further information see | ||
| 9 | <http://www.linux-mtd.infradead.org/doc/nand.html>. | ||
| 10 | |||
| 11 | config MTD_NAND_ECC | 1 | config MTD_NAND_ECC |
| 12 | tristate | 2 | tristate |
| 13 | 3 | ||
| @@ -19,6 +9,17 @@ config MTD_NAND_ECC_SMC | |||
| 19 | Software ECC according to the Smart Media Specification. | 9 | Software ECC according to the Smart Media Specification. |
| 20 | The original Linux implementation had byte 0 and 1 swapped. | 10 | The original Linux implementation had byte 0 and 1 swapped. |
| 21 | 11 | ||
| 12 | |||
| 13 | menuconfig MTD_NAND | ||
| 14 | tristate "NAND Device Support" | ||
| 15 | depends on MTD | ||
| 16 | select MTD_NAND_IDS | ||
| 17 | select MTD_NAND_ECC | ||
| 18 | help | ||
| 19 | This enables support for accessing all type of NAND flash | ||
| 20 | devices. For further information see | ||
| 21 | <http://www.linux-mtd.infradead.org/doc/nand.html>. | ||
| 22 | |||
| 22 | if MTD_NAND | 23 | if MTD_NAND |
| 23 | 24 | ||
| 24 | config MTD_NAND_VERIFY_WRITE | 25 | config MTD_NAND_VERIFY_WRITE |
diff --git a/drivers/mtd/nand/r852.c b/drivers/mtd/nand/r852.c index 78a423295474..bcfc851fe550 100644 --- a/drivers/mtd/nand/r852.c +++ b/drivers/mtd/nand/r852.c | |||
| @@ -150,7 +150,6 @@ static void r852_dma_done(struct r852_device *dev, int error) | |||
| 150 | if (dev->phys_dma_addr && dev->phys_dma_addr != dev->phys_bounce_buffer) | 150 | if (dev->phys_dma_addr && dev->phys_dma_addr != dev->phys_bounce_buffer) |
| 151 | pci_unmap_single(dev->pci_dev, dev->phys_dma_addr, R852_DMA_LEN, | 151 | pci_unmap_single(dev->pci_dev, dev->phys_dma_addr, R852_DMA_LEN, |
| 152 | dev->dma_dir ? PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE); | 152 | dev->dma_dir ? PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE); |
| 153 | complete(&dev->dma_done); | ||
| 154 | } | 153 | } |
| 155 | 154 | ||
| 156 | /* | 155 | /* |
| @@ -182,6 +181,7 @@ static void r852_do_dma(struct r852_device *dev, uint8_t *buf, int do_read) | |||
| 182 | /* Set dma direction */ | 181 | /* Set dma direction */ |
| 183 | dev->dma_dir = do_read; | 182 | dev->dma_dir = do_read; |
| 184 | dev->dma_stage = 1; | 183 | dev->dma_stage = 1; |
| 184 | INIT_COMPLETION(dev->dma_done); | ||
| 185 | 185 | ||
| 186 | dbg_verbose("doing dma %s ", do_read ? "read" : "write"); | 186 | dbg_verbose("doing dma %s ", do_read ? "read" : "write"); |
| 187 | 187 | ||
| @@ -494,6 +494,11 @@ int r852_ecc_correct(struct mtd_info *mtd, uint8_t *dat, | |||
| 494 | if (dev->card_unstable) | 494 | if (dev->card_unstable) |
| 495 | return 0; | 495 | return 0; |
| 496 | 496 | ||
| 497 | if (dev->dma_error) { | ||
| 498 | dev->dma_error = 0; | ||
| 499 | return -1; | ||
| 500 | } | ||
| 501 | |||
| 497 | r852_write_reg(dev, R852_CTL, dev->ctlreg | R852_CTL_ECC_ACCESS); | 502 | r852_write_reg(dev, R852_CTL, dev->ctlreg | R852_CTL_ECC_ACCESS); |
| 498 | ecc_reg = r852_read_reg_dword(dev, R852_DATALINE); | 503 | ecc_reg = r852_read_reg_dword(dev, R852_DATALINE); |
| 499 | r852_write_reg(dev, R852_CTL, dev->ctlreg); | 504 | r852_write_reg(dev, R852_CTL, dev->ctlreg); |
| @@ -707,6 +712,7 @@ void r852_card_detect_work(struct work_struct *work) | |||
| 707 | container_of(work, struct r852_device, card_detect_work.work); | 712 | container_of(work, struct r852_device, card_detect_work.work); |
| 708 | 713 | ||
| 709 | r852_card_update_present(dev); | 714 | r852_card_update_present(dev); |
| 715 | r852_update_card_detect(dev); | ||
| 710 | dev->card_unstable = 0; | 716 | dev->card_unstable = 0; |
| 711 | 717 | ||
| 712 | /* False alarm */ | 718 | /* False alarm */ |
| @@ -722,7 +728,6 @@ void r852_card_detect_work(struct work_struct *work) | |||
| 722 | else | 728 | else |
| 723 | r852_unregister_nand_device(dev); | 729 | r852_unregister_nand_device(dev); |
| 724 | exit: | 730 | exit: |
| 725 | /* Update detection logic */ | ||
| 726 | r852_update_card_detect(dev); | 731 | r852_update_card_detect(dev); |
| 727 | } | 732 | } |
| 728 | 733 | ||
| @@ -796,6 +801,7 @@ static irqreturn_t r852_irq(int irq, void *data) | |||
| 796 | if (dma_status & R852_DMA_IRQ_ERROR) { | 801 | if (dma_status & R852_DMA_IRQ_ERROR) { |
| 797 | dbg("recieved dma error IRQ"); | 802 | dbg("recieved dma error IRQ"); |
| 798 | r852_dma_done(dev, -EIO); | 803 | r852_dma_done(dev, -EIO); |
| 804 | complete(&dev->dma_done); | ||
| 799 | goto out; | 805 | goto out; |
| 800 | } | 806 | } |
| 801 | 807 | ||
| @@ -825,8 +831,10 @@ static irqreturn_t r852_irq(int irq, void *data) | |||
| 825 | r852_dma_enable(dev); | 831 | r852_dma_enable(dev); |
| 826 | 832 | ||
| 827 | /* Operation done */ | 833 | /* Operation done */ |
| 828 | if (dev->dma_stage == 3) | 834 | if (dev->dma_stage == 3) { |
| 829 | r852_dma_done(dev, 0); | 835 | r852_dma_done(dev, 0); |
| 836 | complete(&dev->dma_done); | ||
| 837 | } | ||
| 830 | goto out; | 838 | goto out; |
| 831 | } | 839 | } |
| 832 | 840 | ||
| @@ -940,18 +948,19 @@ int r852_probe(struct pci_dev *pci_dev, const struct pci_device_id *id) | |||
| 940 | 948 | ||
| 941 | r852_dma_test(dev); | 949 | r852_dma_test(dev); |
| 942 | 950 | ||
| 951 | dev->irq = pci_dev->irq; | ||
| 952 | spin_lock_init(&dev->irqlock); | ||
| 953 | |||
| 954 | dev->card_detected = 0; | ||
| 955 | r852_card_update_present(dev); | ||
| 956 | |||
| 943 | /*register irq handler*/ | 957 | /*register irq handler*/ |
| 944 | error = -ENODEV; | 958 | error = -ENODEV; |
| 945 | if (request_irq(pci_dev->irq, &r852_irq, IRQF_SHARED, | 959 | if (request_irq(pci_dev->irq, &r852_irq, IRQF_SHARED, |
| 946 | DRV_NAME, dev)) | 960 | DRV_NAME, dev)) |
| 947 | goto error10; | 961 | goto error10; |
| 948 | 962 | ||
| 949 | dev->irq = pci_dev->irq; | ||
| 950 | spin_lock_init(&dev->irqlock); | ||
| 951 | |||
| 952 | /* kick initial present test */ | 963 | /* kick initial present test */ |
| 953 | dev->card_detected = 0; | ||
| 954 | r852_card_update_present(dev); | ||
| 955 | queue_delayed_work(dev->card_workqueue, | 964 | queue_delayed_work(dev->card_workqueue, |
| 956 | &dev->card_detect_work, 0); | 965 | &dev->card_detect_work, 0); |
| 957 | 966 | ||
| @@ -1081,7 +1090,7 @@ int r852_resume(struct device *device) | |||
| 1081 | dev->card_detected ? "added" : "removed"); | 1090 | dev->card_detected ? "added" : "removed"); |
| 1082 | 1091 | ||
| 1083 | queue_delayed_work(dev->card_workqueue, | 1092 | queue_delayed_work(dev->card_workqueue, |
| 1084 | &dev->card_detect_work, 1000); | 1093 | &dev->card_detect_work, msecs_to_jiffies(1000)); |
| 1085 | return 0; | 1094 | return 0; |
| 1086 | } | 1095 | } |
| 1087 | 1096 | ||
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 | } |
