• David Howells's avatar
    afs: Fix interruption of operations · 811f04ba
    David Howells authored
    The afs filesystem driver allows unstarted operations to be cancelled by
    signal, but most of these can easily be restarted (mkdir for example).  The
    primary culprits for reproducing this are those applications that use
    SIGALRM to display a progress counter.
    
    File lock-extension operation is marked uninterruptible as we have a
    limited time in which to do it, and the release op is marked
    uninterruptible also as if we fail to unlock a file, we'll have to wait 20
    mins before anyone can lock it again.
    
    The store operation logs a warning if it gets interruption, e.g.:
    
    	kAFS: Unexpected error from FS.StoreData -4
    
    because it's run from the background - but it can also be run from
    fdatasync()-type things.  However, store options aren't marked
    interruptible at the moment.
    
    Fix this in the following ways:
    
     (1) Mark store operations as uninterruptible.  It might make sense to
         relax this for certain situations, but I'm not sure how to make sure
         that background store ops aren't affected by signals to foreground
         processes that happen to trigger them.
    
     (2) In afs_get_io_locks(), where we're getting the serialisation lock for
         talking to the fileserver, return ERESTARTSYS rather than EINTR
         because a lot of the operations (e.g. mkdir) are restartable if we
         haven't yet started sending the op to the server.
    
    Fixes: e49c7b2f ("afs: Build an abstraction around an "operation" concept")
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    811f04ba
write.c 21.6 KB