From: Jaegeuk Kim Date: Tue, 8 Oct 2013 01:19:28 +0000 (+0900) Subject: f2fs: fix writing incorrect orphan blocks X-Git-Url: http://drtracing.org/?a=commitdiff_plain;h=ccaaca25919a2cdeccd8fdce5f546e3ed7f6a9e9;p=deliverable%2Flinux.git f2fs: fix writing incorrect orphan blocks Previously, there was a erroneous scenario like below. thread 1: thread 2: f2fs_unlink - acquire_orphan_inode : sbi->n_orphans++ write_checkpoint - block_operations : f2fs_lock_all - do_checkpoint : write orphan blocks with sbi->n_orphans - unblock_operations - f2fs_lock_op - release_orphan_inode - f2fs_unlock_op During the checkpoint by thread 2, f2fs stores a wrong orphan block according to the wrong sbi->n_orphans. To avoid this, simply we should make cover acquire_orphan_inode too with f2fs_lock_op. Signed-off-by: Jaegeuk Kim --- diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c index 29f73fdf958e..575adac17f8b 100644 --- a/fs/f2fs/namei.c +++ b/fs/f2fs/namei.c @@ -228,14 +228,14 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry) if (!de) goto fail; + f2fs_lock_op(sbi); err = acquire_orphan_inode(sbi); if (err) { + f2fs_unlock_op(sbi); kunmap(page); f2fs_put_page(page, 0); goto fail; } - - f2fs_lock_op(sbi); f2fs_delete_entry(de, page, inode); f2fs_unlock_op(sbi);