diff options
Diffstat (limited to 'fs/reiserfs/inode.c')
-rw-r--r-- | fs/reiserfs/inode.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index ffa34b861bdb..b33d67bba2fd 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c | |||
@@ -2363,6 +2363,13 @@ static int reiserfs_write_full_page(struct page *page, | |||
2363 | int bh_per_page = PAGE_CACHE_SIZE / s->s_blocksize; | 2363 | int bh_per_page = PAGE_CACHE_SIZE / s->s_blocksize; |
2364 | th.t_trans_id = 0; | 2364 | th.t_trans_id = 0; |
2365 | 2365 | ||
2366 | /* no logging allowed when nonblocking or from PF_MEMALLOC */ | ||
2367 | if (checked && (current->flags & PF_MEMALLOC)) { | ||
2368 | redirty_page_for_writepage(wbc, page); | ||
2369 | unlock_page(page); | ||
2370 | return 0; | ||
2371 | } | ||
2372 | |||
2366 | /* The page dirty bit is cleared before writepage is called, which | 2373 | /* The page dirty bit is cleared before writepage is called, which |
2367 | * means we have to tell create_empty_buffers to make dirty buffers | 2374 | * means we have to tell create_empty_buffers to make dirty buffers |
2368 | * The page really should be up to date at this point, so tossing | 2375 | * The page really should be up to date at this point, so tossing |
@@ -2743,6 +2750,7 @@ static int invalidatepage_can_drop(struct inode *inode, struct buffer_head *bh) | |||
2743 | int ret = 1; | 2750 | int ret = 1; |
2744 | struct reiserfs_journal *j = SB_JOURNAL(inode->i_sb); | 2751 | struct reiserfs_journal *j = SB_JOURNAL(inode->i_sb); |
2745 | 2752 | ||
2753 | lock_buffer(bh); | ||
2746 | spin_lock(&j->j_dirty_buffers_lock); | 2754 | spin_lock(&j->j_dirty_buffers_lock); |
2747 | if (!buffer_mapped(bh)) { | 2755 | if (!buffer_mapped(bh)) { |
2748 | goto free_jh; | 2756 | goto free_jh; |
@@ -2758,7 +2766,7 @@ static int invalidatepage_can_drop(struct inode *inode, struct buffer_head *bh) | |||
2758 | if (buffer_journaled(bh) || buffer_journal_dirty(bh)) { | 2766 | if (buffer_journaled(bh) || buffer_journal_dirty(bh)) { |
2759 | ret = 0; | 2767 | ret = 0; |
2760 | } | 2768 | } |
2761 | } else if (buffer_dirty(bh) || buffer_locked(bh)) { | 2769 | } else if (buffer_dirty(bh)) { |
2762 | struct reiserfs_journal_list *jl; | 2770 | struct reiserfs_journal_list *jl; |
2763 | struct reiserfs_jh *jh = bh->b_private; | 2771 | struct reiserfs_jh *jh = bh->b_private; |
2764 | 2772 | ||
@@ -2784,6 +2792,7 @@ static int invalidatepage_can_drop(struct inode *inode, struct buffer_head *bh) | |||
2784 | reiserfs_free_jh(bh); | 2792 | reiserfs_free_jh(bh); |
2785 | } | 2793 | } |
2786 | spin_unlock(&j->j_dirty_buffers_lock); | 2794 | spin_unlock(&j->j_dirty_buffers_lock); |
2795 | unlock_buffer(bh); | ||
2787 | return ret; | 2796 | return ret; |
2788 | } | 2797 | } |
2789 | 2798 | ||