• Dave Kleikamp's avatar
    prevent cifs_writepages() from skipping unwritten pages · b066a48c
    Dave Kleikamp authored
    Fixes a data corruption under heavy stress in which pages could be left
    dirty after all open instances of a inode have been closed.
    
    In order to write contiguous pages whenever possible, cifs_writepages()
    asks pagevec_lookup_tag() for more pages than it may write at one time.
    Normally, it then resets index just past the last page written before calling
    pagevec_lookup_tag() again.
    
    If cifs_writepages() can't write the first page returned, it wasn't resetting
    index, and the next call to pagevec_lookup_tag() resulted in skipping all of
    the pages it previously returned, even though cifs_writepages() did nothing
    with them.  This can result in data loss when the file descriptor is about
    to be closed.
    
    This patch ensures that index gets set back to the next returned page so
    that none get skipped.
    Signed-off-by: default avatarDave Kleikamp <shaggy@linux.vnet.ibm.com>
    Acked-by: default avatarJeff Layton <jlayton@redhat.com>
    Cc: Shirish S Pargaonkar <shirishp@us.ibm.com>
    Signed-off-by: default avatarSteve French <sfrench@us.ibm.com>
    b066a48c
file.c 57 KB