• David Howells's avatar
    afs: Fix error handling with lookup via FS.InlineBulkStatus · 17ba6f0b
    David Howells authored
    When afs does a lookup, it tries to use FS.InlineBulkStatus to preemptively
    look up a bunch of files in the parent directory and cache this locally, on
    the basis that we might want to look at them too (for example if someone
    does an ls on a directory, they may want want to then stat every file
    listed).
    
    FS.InlineBulkStatus can be considered a compound op with the normal abort
    code applying to the compound as a whole.  Each status fetch within the
    compound is then given its own individual abort code - but assuming no
    error that prevents the bulk fetch from returning the compound result will
    be 0, even if all the constituent status fetches failed.
    
    At the conclusion of afs_do_lookup(), we should use the abort code from the
    appropriate status to determine the error to return, if any - but instead
    it is assumed that we were successful if the op as a whole succeeded and we
    return an incompletely initialised inode, resulting in ENOENT, no matter
    the actual reason.  In the particular instance reported, a vnode with no
    permission granted to be accessed is being given a UAEACCES abort code
    which should be reported as EACCES, but is instead being reported as
    ENOENT.
    
    Fix this by abandoning the inode (which will be cleaned up with the op) if
    file[1] has an abort code indicated and turn that abort code into an error
    instead.
    
    Whilst we're at it, add a tracepoint so that the abort codes of the
    individual subrequests of FS.InlineBulkStatus can be logged.  At the moment
    only the container abort code can be 0.
    
    Fixes: e49c7b2f ("afs: Build an abstraction around an "operation" concept")
    Reported-by: default avatarJeffrey Altman <jaltman@auristor.com>
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    Reviewed-by: default avatarMarc Dionne <marc.dionne@auristor.com>
    cc: linux-afs@lists.infradead.org
    17ba6f0b
afs.h 50.2 KB