mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 13:11:40 +00:00
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:
parent
691c6fd2a2
commit
885166c03c
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user