f2fs: don't let the orphan inode counter underflow

Accounting errors from buggy code calling the acquire/release/remove
orphan inode interfaces can cause n_orphans to underflow, which will
then cause acquire_orphan_inode() to return -ENOSPC on the next
operation.  This commit guards against that condition.

Signed-off-by: Russ Knize <rknize@motorola.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
This commit is contained in:
Russ W. Knize 2013-09-24 09:35:40 -05:00 committed by Jaegeuk Kim
parent 691c6fd2a2
commit 885166c03c

View File

@ -206,6 +206,7 @@ int acquire_orphan_inode(struct f2fs_sb_info *sbi)
void release_orphan_inode(struct f2fs_sb_info *sbi) void release_orphan_inode(struct f2fs_sb_info *sbi)
{ {
mutex_lock(&sbi->orphan_inode_mutex); mutex_lock(&sbi->orphan_inode_mutex);
BUG_ON(sbi->n_orphans == 0);
sbi->n_orphans--; sbi->n_orphans--;
mutex_unlock(&sbi->orphan_inode_mutex); mutex_unlock(&sbi->orphan_inode_mutex);
} }
@ -253,6 +254,7 @@ void remove_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino)
if (orphan->ino == ino) { if (orphan->ino == ino) {
list_del(&orphan->list); list_del(&orphan->list);
kmem_cache_free(orphan_entry_slab, orphan); kmem_cache_free(orphan_entry_slab, orphan);
BUG_ON(sbi->n_orphans == 0);
sbi->n_orphans--; sbi->n_orphans--;
break; break;
} }