diff options
Diffstat (limited to 'fs/ext3/ialloc.c')
| -rw-r--r-- | fs/ext3/ialloc.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/fs/ext3/ialloc.c b/fs/ext3/ialloc.c index 77126821b2e9..47b678d73e7a 100644 --- a/fs/ext3/ialloc.c +++ b/fs/ext3/ialloc.c | |||
| @@ -669,6 +669,14 @@ struct inode *ext3_orphan_get(struct super_block *sb, unsigned long ino) | |||
| 669 | if (IS_ERR(inode)) | 669 | if (IS_ERR(inode)) |
| 670 | goto iget_failed; | 670 | goto iget_failed; |
| 671 | 671 | ||
| 672 | /* | ||
| 673 | * If the orphans has i_nlinks > 0 then it should be able to be | ||
| 674 | * truncated, otherwise it won't be removed from the orphan list | ||
| 675 | * during processing and an infinite loop will result. | ||
| 676 | */ | ||
| 677 | if (inode->i_nlink && !ext3_can_truncate(inode)) | ||
| 678 | goto bad_orphan; | ||
| 679 | |||
| 672 | if (NEXT_ORPHAN(inode) > max_ino) | 680 | if (NEXT_ORPHAN(inode) > max_ino) |
| 673 | goto bad_orphan; | 681 | goto bad_orphan; |
| 674 | brelse(bitmap_bh); | 682 | brelse(bitmap_bh); |
| @@ -690,6 +698,7 @@ bad_orphan: | |||
| 690 | printk(KERN_NOTICE "NEXT_ORPHAN(inode)=%u\n", | 698 | printk(KERN_NOTICE "NEXT_ORPHAN(inode)=%u\n", |
| 691 | NEXT_ORPHAN(inode)); | 699 | NEXT_ORPHAN(inode)); |
| 692 | printk(KERN_NOTICE "max_ino=%lu\n", max_ino); | 700 | printk(KERN_NOTICE "max_ino=%lu\n", max_ino); |
| 701 | printk(KERN_NOTICE "i_nlink=%u\n", inode->i_nlink); | ||
| 693 | /* Avoid freeing blocks if we got a bad deleted inode */ | 702 | /* Avoid freeing blocks if we got a bad deleted inode */ |
| 694 | if (inode->i_nlink == 0) | 703 | if (inode->i_nlink == 0) |
| 695 | inode->i_blocks = 0; | 704 | inode->i_blocks = 0; |
