• Andrew Morton's avatar
    [PATCH] ramdisk: lock blockdev pages during "IO". · f8cc9647
    Andrew Morton authored
    There's a race: one CPU writes a 1k block into a ramdisk page which isn't in
    the blockdev pagecache yet.  It memsets the locked page to zeroes.
    
    While this is happening, another CPU comes in and tries to write a different
    1k block to the "disk".  But it doesn't lock the page so it races with the
    memset and can have its data scribbled over.
    
    Fix this up by locking the page even if it already existed in pagecache.
    
    Locking a pagecache page in a make_request_fn sounds deadlocky but it is not,
    because:
    
    a) ramdisk_writepage() does nothing but a set_bit(), and cannot recur onto
       the same page.
    
    b) Any higher-level code which holds a page lock is supposed to be
       allocating its memory with GFP_NOFS, and in 2.6 kernels that's equivalent
       to GFP_NOIO.
    
       (The distinction between GFP_NOIO and GFP_NOFS basically disappeared
       with the buffer_head LRU, although it was reused for writes to swap).
    f8cc9647
rd.c 12.7 KB