X-Git-Url: http://pilppa.org/gitweb/?a=blobdiff_plain;f=fs%2Fext3%2Fialloc.c;h=47b678d73e7a53d28ef1d0d35eae758bd87e54d7;hb=cc996099174dc05b35b7a29301026987990e7f8c;hp=77126821b2e9de219c0e1f36caea9c263e6f7c2f;hpb=7022b15e2a9f878fd5184586064c63352c3dd225;p=linux-2.6-omap-h63xx.git diff --git a/fs/ext3/ialloc.c b/fs/ext3/ialloc.c index 77126821b2e..47b678d73e7 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) if (IS_ERR(inode)) goto iget_failed; + /* + * If the orphans has i_nlinks > 0 then it should be able to be + * truncated, otherwise it won't be removed from the orphan list + * during processing and an infinite loop will result. + */ + if (inode->i_nlink && !ext3_can_truncate(inode)) + goto bad_orphan; + if (NEXT_ORPHAN(inode) > max_ino) goto bad_orphan; brelse(bitmap_bh); @@ -690,6 +698,7 @@ bad_orphan: printk(KERN_NOTICE "NEXT_ORPHAN(inode)=%u\n", NEXT_ORPHAN(inode)); printk(KERN_NOTICE "max_ino=%lu\n", max_ino); + printk(KERN_NOTICE "i_nlink=%u\n", inode->i_nlink); /* Avoid freeing blocks if we got a bad deleted inode */ if (inode->i_nlink == 0) inode->i_blocks = 0;