• J
    [PATCH] ext3: Fix unmapped buffers in transaction's lists · aaa4059b
    Jan Kara 提交于
    Fix the problem (BUG 4964) with unmapped buffers in transaction's
    t_sync_data list.  The problem is we need to call filesystem's own
    invalidatepage() from block_write_full_page().
    
    block_write_full_page() must call filesystem's invalidatepage().  Otherwise
    following nasty race can happen:
    
       proc 1                                        proc 2
       ------                                        ------
    - write some new data to 'offset'
      => bh gets to the transactions data list
                                                  - starts truncate
                                                    => i_size set to new size
    - mpage_writepages()
      - ext3_ordered_writepage() to 'offset'
        - block_write_full_page()
          - page->index > end_index+1
            - block_invalidatepage()
              - discard_buffer()
                - clear_buffer_mapped()
    
    - commit triggers and finds unmapped buffer - BOOM!
    Signed-off-by: NJan Kara <jack@suse.cz>
    Signed-off-by: NAndrew Morton <akpm@osdl.org>
    Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
    aaa4059b
buffer_head.h 9.5 KB