aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorFrederic Weisbecker <fweisbec@gmail.com>2009-08-24 21:38:12 -0400
committerFrederic Weisbecker <fweisbec@gmail.com>2009-09-14 01:18:29 -0400
commit7e94277050e31aa4204060f03953bba72598cf7d (patch)
tree7a53cd463e76c0ed5e72345152755b5318ad430b /fs
parentb10ab4c337a600456ed2d9daea0331016f7cdeeb (diff)
kill-the-bkl/reiserfs: fix recursive reiserfs write lock in reiserfs_commit_write()
reiserfs_commit_write() is always called with the write lock held. Thus the current calls to reiserfs_write_lock() in this function are acquiring the lock recursively. We can safely drop them. This also solves further assumptions for this lock to be really released while calling reiserfs_write_unlock(). Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jeff Mahoney <jeffm@suse.com> Cc: Chris Mason <chris.mason@oracle.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Alexander Beregalov <a.beregalov@gmail.com> Cc: Laurent Riffard <laurent.riffard@free.fr>
Diffstat (limited to 'fs')
-rw-r--r--fs/reiserfs/inode.c11
1 files changed, 2 insertions, 9 deletions
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c
index 853f4f6fe920..965c8eaadb1e 100644
--- a/fs/reiserfs/inode.c
+++ b/fs/reiserfs/inode.c
@@ -2795,7 +2795,6 @@ int reiserfs_commit_write(struct file *f, struct page *page,
2795 */ 2795 */
2796 if (pos > inode->i_size) { 2796 if (pos > inode->i_size) {
2797 struct reiserfs_transaction_handle myth; 2797 struct reiserfs_transaction_handle myth;
2798 reiserfs_write_lock(inode->i_sb);
2799 /* If the file have grown beyond the border where it 2798 /* If the file have grown beyond the border where it
2800 can have a tail, unmark it as needing a tail 2799 can have a tail, unmark it as needing a tail
2801 packing */ 2800 packing */
@@ -2806,10 +2805,9 @@ int reiserfs_commit_write(struct file *f, struct page *page,
2806 REISERFS_I(inode)->i_flags &= ~i_pack_on_close_mask; 2805 REISERFS_I(inode)->i_flags &= ~i_pack_on_close_mask;
2807 2806
2808 ret = journal_begin(&myth, inode->i_sb, 1); 2807 ret = journal_begin(&myth, inode->i_sb, 1);
2809 if (ret) { 2808 if (ret)
2810 reiserfs_write_unlock(inode->i_sb);
2811 goto journal_error; 2809 goto journal_error;
2812 } 2810
2813 reiserfs_update_inode_transaction(inode); 2811 reiserfs_update_inode_transaction(inode);
2814 inode->i_size = pos; 2812 inode->i_size = pos;
2815 /* 2813 /*
@@ -2821,16 +2819,13 @@ int reiserfs_commit_write(struct file *f, struct page *page,
2821 reiserfs_update_sd(&myth, inode); 2819 reiserfs_update_sd(&myth, inode);
2822 update_sd = 1; 2820 update_sd = 1;
2823 ret = journal_end(&myth, inode->i_sb, 1); 2821 ret = journal_end(&myth, inode->i_sb, 1);
2824 reiserfs_write_unlock(inode->i_sb);
2825 if (ret) 2822 if (ret)
2826 goto journal_error; 2823 goto journal_error;
2827 } 2824 }
2828 if (th) { 2825 if (th) {
2829 reiserfs_write_lock(inode->i_sb);
2830 if (!update_sd) 2826 if (!update_sd)
2831 mark_inode_dirty(inode); 2827 mark_inode_dirty(inode);
2832 ret = reiserfs_end_persistent_transaction(th); 2828 ret = reiserfs_end_persistent_transaction(th);
2833 reiserfs_write_unlock(inode->i_sb);
2834 if (ret) 2829 if (ret)
2835 goto out; 2830 goto out;
2836 } 2831 }
@@ -2840,11 +2835,9 @@ int reiserfs_commit_write(struct file *f, struct page *page,
2840 2835
2841 journal_error: 2836 journal_error:
2842 if (th) { 2837 if (th) {
2843 reiserfs_write_lock(inode->i_sb);
2844 if (!update_sd) 2838 if (!update_sd)
2845 reiserfs_update_sd(th, inode); 2839 reiserfs_update_sd(th, inode);
2846 ret = reiserfs_end_persistent_transaction(th); 2840 ret = reiserfs_end_persistent_transaction(th);
2847 reiserfs_write_unlock(inode->i_sb);
2848 } 2841 }
2849 2842
2850 return ret; 2843 return ret;