Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2e5558f4 authored by Russ W. Knize's avatar Russ W. Knize Committed by Jaegeuk Kim
Browse files

f2fs: account for orphan inodes during recovery



During recovery, orphan inodes are deleted via truncate_hole().
These orphans are added by recover_dentry() via f2fs_delete_entry().
However, f2fs_delete_entry() adds them via add_orphan_inode()
without calling acquire_orphan_inode() first.  This prevents the
counters from being incremented properly, which causes them to
underflow when remove_orphan_inode() is called later on.

Signed-off-by: default avatarRuss Knize <rknize@motorola.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk.kim@samsung.com>
parent 52ab9560
Loading
Loading
Loading
Loading
+13 −6
Original line number Original line Diff line number Diff line
@@ -64,24 +64,31 @@ static int recover_dentry(struct page *ipage, struct inode *inode)
	name.name = raw_inode->i_name;
	name.name = raw_inode->i_name;
retry:
retry:
	de = f2fs_find_entry(dir, &name, &page);
	de = f2fs_find_entry(dir, &name, &page);
	if (de && inode->i_ino == le32_to_cpu(de->ino)) {
	if (de && inode->i_ino == le32_to_cpu(de->ino))
		kunmap(page);
		goto out_unmap_put;
		f2fs_put_page(page, 0);
		goto out;
	}
	if (de) {
	if (de) {
		einode = f2fs_iget(inode->i_sb, le32_to_cpu(de->ino));
		einode = f2fs_iget(inode->i_sb, le32_to_cpu(de->ino));
		if (IS_ERR(einode)) {
		if (IS_ERR(einode)) {
			WARN_ON(1);
			WARN_ON(1);
			if (PTR_ERR(einode) == -ENOENT)
			if (PTR_ERR(einode) == -ENOENT)
				err = -EEXIST;
				err = -EEXIST;
			goto out;
			goto out_unmap_put;
		}
		err = acquire_orphan_inode(F2FS_SB(inode->i_sb));
		if (err) {
			iput(einode);
			goto out_unmap_put;
		}
		}
		f2fs_delete_entry(de, page, einode);
		f2fs_delete_entry(de, page, einode);
		iput(einode);
		iput(einode);
		goto retry;
		goto retry;
	}
	}
	err = __f2fs_add_link(dir, &name, inode);
	err = __f2fs_add_link(dir, &name, inode);
	goto out;

out_unmap_put:
	kunmap(page);
	f2fs_put_page(page, 0);
out:
out:
	f2fs_msg(inode->i_sb, KERN_NOTICE, "recover_inode and its dentry: "
	f2fs_msg(inode->i_sb, KERN_NOTICE, "recover_inode and its dentry: "
			"ino = %x, name = %s, dir = %lx, err = %d",
			"ino = %x, name = %s, dir = %lx, err = %d",