diff options
author | Chao Yu <chao2.yu@samsung.com> | 2014-06-24 02:16:24 -0400 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2014-07-09 17:04:25 -0400 |
commit | 1256010ab1a372c8ffc01fc37ff767d8bc15378b (patch) | |
tree | 9baae96617ee3546c8eb14b9c5b853aab455ea97 /fs | |
parent | b434babf854eab82397759e98425423cd9bc4786 (diff) |
f2fs: reduce region of f2fs_lock_op covered for better concurrency
In our rename process, region of f2fs_lock_op covered is too big as some of the
code like f2fs_empty_dir/f2fs_find_entry are not needed to protect by this lock.
So in the extreme case like doing checkpoint when we rename old inode to exist
inode in a large directory could cause lower concurrency.
Let's reduce the region of f2fs_lock_op to fix this.
Signed-off-by: Chao Yu <chao2.yu@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/f2fs/namei.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c index 89b0bd9420cc..1b3cae03c24f 100644 --- a/fs/f2fs/namei.c +++ b/fs/f2fs/namei.c | |||
@@ -387,8 +387,6 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
387 | goto out_old; | 387 | goto out_old; |
388 | } | 388 | } |
389 | 389 | ||
390 | f2fs_lock_op(sbi); | ||
391 | |||
392 | if (new_inode) { | 390 | if (new_inode) { |
393 | 391 | ||
394 | err = -ENOTEMPTY; | 392 | err = -ENOTEMPTY; |
@@ -401,6 +399,8 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
401 | if (!new_entry) | 399 | if (!new_entry) |
402 | goto out_dir; | 400 | goto out_dir; |
403 | 401 | ||
402 | f2fs_lock_op(sbi); | ||
403 | |||
404 | err = acquire_orphan_inode(sbi); | 404 | err = acquire_orphan_inode(sbi); |
405 | if (err) | 405 | if (err) |
406 | goto put_out_dir; | 406 | goto put_out_dir; |
@@ -429,9 +429,13 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
429 | update_inode_page(old_inode); | 429 | update_inode_page(old_inode); |
430 | update_inode_page(new_inode); | 430 | update_inode_page(new_inode); |
431 | } else { | 431 | } else { |
432 | f2fs_lock_op(sbi); | ||
433 | |||
432 | err = f2fs_add_link(new_dentry, old_inode); | 434 | err = f2fs_add_link(new_dentry, old_inode); |
433 | if (err) | 435 | if (err) { |
436 | f2fs_unlock_op(sbi); | ||
434 | goto out_dir; | 437 | goto out_dir; |
438 | } | ||
435 | 439 | ||
436 | if (old_dir_entry) { | 440 | if (old_dir_entry) { |
437 | inc_nlink(new_dir); | 441 | inc_nlink(new_dir); |
@@ -466,6 +470,7 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
466 | return 0; | 470 | return 0; |
467 | 471 | ||
468 | put_out_dir: | 472 | put_out_dir: |
473 | f2fs_unlock_op(sbi); | ||
469 | kunmap(new_page); | 474 | kunmap(new_page); |
470 | f2fs_put_page(new_page, 0); | 475 | f2fs_put_page(new_page, 0); |
471 | out_dir: | 476 | out_dir: |
@@ -473,7 +478,6 @@ out_dir: | |||
473 | kunmap(old_dir_page); | 478 | kunmap(old_dir_page); |
474 | f2fs_put_page(old_dir_page, 0); | 479 | f2fs_put_page(old_dir_page, 0); |
475 | } | 480 | } |
476 | f2fs_unlock_op(sbi); | ||
477 | out_old: | 481 | out_old: |
478 | kunmap(old_page); | 482 | kunmap(old_page); |
479 | f2fs_put_page(old_page, 0); | 483 | f2fs_put_page(old_page, 0); |