• Xianting Tian's avatar
    mm/filemap.c: clear page error before actual read · ea44cd77
    Xianting Tian authored
    [ Upstream commit faffdfa0 ]
    
    Mount failure issue happens under the scenario: Application forked dozens
    of threads to mount the same number of cramfs images separately in docker,
    but several mounts failed with high probability.  Mount failed due to the
    checking result of the page(read from the superblock of loop dev) is not
    uptodate after wait_on_page_locked(page) returned in function cramfs_read:
    
       wait_on_page_locked(page);
       if (!PageUptodate(page)) {
          ...
       }
    
    The reason of the checking result of the page not uptodate: systemd-udevd
    read the loopX dev before mount, because the status of loopX is Lo_unbound
    at this time, so loop_make_request directly trigger the calling of io_end
    handler end_buffer_async_read, which called SetPageError(page).  So It
    caused the page can't be set to uptodate in function
    end_buffer_async_read:
    
       if(page_uptodate && !PageError(page)) {
          SetPageUptodate(page);
       }
    
    Then mount ...
    ea44cd77
filemap.c 77.8 KB