• Ed Cashin's avatar
    aoe: adjust ref of head for compound page tails · fb32975d
    Ed Cashin authored
    Fix a BUG which can trigger when direct-IO is used with AOE.
    
    As discussed previously, the fact that some users of the block layer
    provide bios that point to pages with a zero _count means that it is not
    OK for the network layer to do a put_page on the skb frags during an
    skb_linearize, so the aoe driver gets a reference to pages in bios and
    puts the reference before ending the bio.  And because it cannot use
    get_page on a page with a zero _count, it manipulates the value
    directly.
    
    It is not OK to increment the _count of a compound page tail, though,
    since the VM layer will VM_BUG_ON a non-zero _count.  Block users that
    do direct I/O can result in the aoe driver seeing compound page tails in
    bios.  In that case, the same logic works as long as the head of the
    compound page is used instead of the tails.  This patch handles compound
    pages and does not BUG.
    
    It relies on the block layer user leaving the relationship between the
    page tail and its head alone for the duration between the submission of
    the bio and its completion, whether successful or not.
    Signed-off-by: default avatarEd Cashin <ecashin@coraid.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    fb32975d
aoecmd.c 37.2 KB