1. 16 5月, 2019 10 次提交
    • D
      rxrpc: Allow the kernel to mark a call as being non-interruptible · b960a34b
      David Howells 提交于
      Allow kernel services using AF_RXRPC to indicate that a call should be
      non-interruptible.  This allows kafs to make things like lock-extension and
      writeback data storage calls non-interruptible.
      
      If this is set, signals will be ignored for operations on that call where
      possible - such as waiting to get a call channel on an rxrpc connection.
      
      It doesn't prevent UDP sendmsg from being interrupted, but that will be
      handled by packet retransmission.
      
      rxrpc_kernel_recv_data() isn't affected by this since that never waits,
      preferring instead to return -EAGAIN and leave the waiting to the caller.
      
      Userspace initiated calls can't be set to be uninterruptible at this time.
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      b960a34b
    • D
      afs: Fix error propagation from server record check/update · 0ab4c959
      David Howells 提交于
      afs_check/update_server_record() should be setting fc->error rather than
      fc->ac.error as they're called from within the cursor iteration function.
      
      afs_fs_cursor::error is where the error code of the attempt to call the
      operation on multiple servers is integrated and is the final result,
      whereas afs_addr_cursor::error is used to hold the error from individual
      iterations of the call loop.  (Note there's also an afs_vl_cursor which
      also wraps afs_addr_cursor for accessing VL servers rather than file
      servers).
      
      Fix this by setting fc->error in the afs_check/update_server_record() so
      that any error incurred whilst talking to the VL server correctly
      propagates to the final result.
      
      This results in:
      
      	kAFS: Unexpected error from FS.StoreData -512
      
      being seen, even though the store-data op is non-interruptible.  The error
      is actually coming from the server record update getting interrupted.
      
      Fixes: d2ddc776 ("afs: Overhaul volume and server record caching and fileserver rotation")
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      0ab4c959
    • D
      afs: Fix the maximum lifespan of VL and probe calls · 94f699c9
      David Howells 提交于
      If an older AFS server doesn't support an operation, it may accept the call
      and then sit on it forever, happily responding to pings that make kafs
      think that the call is still alive.
      
      Fix this by setting the maximum lifespan of Volume Location service calls
      in particular and probe calls in general so that they don't run on
      endlessly if they're not supported.
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      94f699c9
    • D
      afs: Fix "kAFS: AFS vnode with undefined type 0" · 51eba999
      David Howells 提交于
      Under some circumstances afs_select_fileserver() can return without setting
      an error in fc->error.  The problem is in the no_more_servers segment where
      the accumulated errors from attempts to contact various servers are
      integrated into an afs_error-type variable 'e'.  The resultant error code
      is, however, then abandoned.
      
      Fix this by getting the error out of e.error and putting it in 'error' so
      that the next part will store it into fc->error.
      
      Not doing this causes a report like the following:
      
          kAFS: AFS vnode with undefined type 0
          kAFS: A=0 m=0 s=0 v=0
          kAFS: vnode 20000025:1:1
      
      because the code following the server selection loop then sees what it
      thinks is a successful invocation because fc.error is 0.  However, it can't
      apply the status record because it's all zeros.
      
      The report is followed on the first instance with a trace looking something
      like:
      
           dump_stack+0x67/0x8e
           afs_inode_init_from_status.isra.2+0x21b/0x487
           afs_fetch_status+0x119/0x1df
           afs_iget+0x130/0x295
           afs_get_tree+0x31d/0x595
           vfs_get_tree+0x1f/0xe8
           fc_mount+0xe/0x36
           afs_d_automount+0x328/0x3c3
           follow_managed+0x109/0x20a
           lookup_fast+0x3bf/0x3f8
           do_last+0xc3/0x6a4
           path_openat+0x1af/0x236
           do_filp_open+0x51/0xae
           ? _raw_spin_unlock+0x24/0x2d
           ? __alloc_fd+0x1a5/0x1b7
           do_sys_open+0x13b/0x1e8
           do_syscall_64+0x7d/0x1b3
           entry_SYSCALL_64_after_hwframe+0x49/0xbe
      
      Fixes: 4584ae96 ("afs: Fix missing net error handling")
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      51eba999
    • D
      afs: Fix cell DNS lookup · d5c32c89
      David Howells 提交于
      Currently, once configured, AFS cells are looked up in the DNS at regular
      intervals - which is a waste of resources if those cells aren't being
      used.  It also leads to a problem where cells preloaded, but not
      configured, before the network is brought up end up effectively statically
      configured with no VL servers and are unable to get any.
      
      Fix this by not doing the DNS lookup until the first time a cell is
      touched.  It is waited for if we don't have any cached records yet,
      otherwise the DNS lookup to maintain the record is done in the background.
      
      This has the downside that the first time you touch a cell, you now have to
      wait for the upcall to do the required DNS lookups rather than them already
      being cached.
      
      Further, the record is not replaced if the old record has at least one
      server in it and the new record doesn't have any.
      
      Fixes: 0a5143f2 ("afs: Implement VL server rotation")
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      d5c32c89
    • D
      dns_resolver: Allow used keys to be invalidated · d0660f0b
      David Howells 提交于
      Allow used DNS resolver keys to be invalidated after use if the caller is
      doing its own caching of the results.  This reduces the amount of resources
      required.
      
      Fix AFS to invalidate DNS results to kill off permanent failure records
      that get lodged in the resolver keyring and prevent future lookups from
      happening.
      
      Fixes: 0a5143f2 ("afs: Implement VL server rotation")
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      d0660f0b
    • D
      afs: Fix afs_cell records to always have a VL server list record · ca1cbbdc
      David Howells 提交于
      Fix it such that afs_cell records always have a VL server list record
      attached, even if it's a dummy one, so that various checks can be removed.
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      ca1cbbdc
    • D
      afs: Fix missing lock when replacing VL server list · 6b8812fc
      David Howells 提交于
      When afs_update_cell() replaces the cell->vl_servers list, it uses RCU
      protocol so that proc is protected, but doesn't take ->vl_servers_lock to
      protect afs_start_vl_iteration() (which does actually take a shared lock).
      
      Fix this by making afs_update_cell() take an exclusive lock when replacing
      ->vl_servers.
      
      Fixes: 0a5143f2 ("afs: Implement VL server rotation")
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      6b8812fc
    • D
      afs: Fix afs_xattr_get_yfs() to not try freeing an error value · 773e0c40
      David Howells 提交于
      afs_xattr_get_yfs() tries to free yacl, which may hold an error value (say
      if yfs_fs_fetch_opaque_acl() failed and returned an error).
      
      Fix this by allocating yacl up front (since it's a fixed-length struct,
      unlike afs_acl) and passing it in to the RPC function.  This also allows
      the flags to be placed in the object rather than passing them through to
      the RPC function.
      
      Fixes: ae46578b ("afs: Get YFS ACLs and information through xattrs")
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      773e0c40
    • D
      afs: Fix incorrect error handling in afs_xattr_get_acl() · cc1dd5c8
      David Howells 提交于
      Fix incorrect error handling in afs_xattr_get_acl() where there appears to
      be a redundant assignment before return, but in fact the return should be a
      goto to the error handling at the end of the function.
      
      Fixes: 260f082b ("afs: Get an AFS3 ACL as an xattr")
      Addresses-Coverity: ("Unused Value")
      Reported-by: NColin Ian King <colin.king@canonical.com>
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      cc: Joe Perches <joe@perches.com>
      cc1dd5c8
  2. 15 5月, 2019 1 次提交
    • D
      afs: Fix key leak in afs_release() and afs_evict_inode() · a1b879ee
      David Howells 提交于
      Fix afs_release() to go through the cleanup part of the function if
      FMODE_WRITE is set rather than exiting through vfs_fsync() (which skips the
      cleanup).  The cleanup involves discarding the refs on the key used for
      file ops and the writeback key record.
      
      Also fix afs_evict_inode() to clean up any left over wb keys attached to
      the inode/vnode when it is removed.
      
      Fixes: 5a813276 ("afs: Do better accretion of small writes on newly created content")
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      a1b879ee
  3. 07 5月, 2019 8 次提交
    • D
      afs: Implement YFS ACL setting · f5e45463
      David Howells 提交于
      Implement the setting of YFS ACLs in AFS through the interface of setting
      the afs.yfs.acl extended attribute on the file.
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      f5e45463
    • D
      afs: Get YFS ACLs and information through xattrs · ae46578b
      David Howells 提交于
      The YFS/AuriStor variant of AFS provides more capable ACLs and provides
      per-volume ACLs and per-file ACLs as well as per-directory ACLs.  It also
      provides some extra information that can be retrieved through four ACLs:
      
       (1) afs.yfs.acl
      
           The YFS file ACL (not the same format as afs.acl).
      
       (2) afs.yfs.vol_acl
      
           The YFS volume ACL.
      
       (3) afs.yfs.acl_inherited
      
           "1" if a file's ACL is inherited from its parent directory, "0"
           otherwise.
      
       (4) afs.yfs.acl_num_cleaned
      
           The number of of ACEs removed from the ACL by the server because the
           PT entries were removed from the PTS database (ie. the subject is no
           longer known).
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      ae46578b
    • J
      afs: implement acl setting · b10494af
      Joe Gorse 提交于
      Implements the setting of ACLs in AFS by means of setting the
      afs.acl extended attribute on the file.
      Signed-off-by: NJoe Gorse <jhgorse@gmail.com>
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      b10494af
    • D
      afs: Get an AFS3 ACL as an xattr · 260f082b
      David Howells 提交于
      Implement an xattr on AFS files called "afs.acl" that retrieves a file's
      ACL.  It returns the raw AFS3 ACL from the result of calling FS.FetchACL,
      leaving any interpretation to userspace.
      
      Note that whilst YFS servers will respond to FS.FetchACL, this will render
      a more-advanced YFS ACL down.  Use "afs.yfs.acl" instead for that.
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      260f082b
    • D
      afs: Fix getting the afs.fid xattr · a2f611a3
      David Howells 提交于
      The AFS3 FID is three 32-bit unsigned numbers and is represented as three
      up-to-8-hex-digit numbers separated by colons to the afs.fid xattr.
      However, with the advent of support for YFS, the FID is now a 64-bit volume
      number, a 96-bit vnode/inode number and a 32-bit uniquifier (as before).
      Whilst the sprintf in afs_xattr_get_fid() has been partially updated (it
      currently ignores the upper 32 bits of the 96-bit vnode number), the size
      of the stack-based buffer has not been increased to match, thereby allowing
      stack corruption to occur.
      
      Fix this by increasing the buffer size appropriately and conditionally
      including the upper part of the vnode number if it is non-zero.  The latter
      requires the lower part to be zero-padded if the upper part is non-zero.
      
      Fixes: 3b6492df ("afs: Increase to 64-bit volume ID and 96-bit vnode ID for YFS")
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      a2f611a3
    • D
      afs: Fix the afs.cell and afs.volume xattr handlers · c73aa410
      David Howells 提交于
      Fix the ->get handlers for the afs.cell and afs.volume xattrs to pass the
      source data size to memcpy() rather than target buffer size.
      
      Overcopying the source data occasionally causes the kernel to oops.
      
      Fixes: d3e3b7ea ("afs: Add metadata xattrs")
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      c73aa410
    • M
      afs: Calculate i_blocks based on file size · c0abbb57
      Marc Dionne 提交于
      While it's not possible to give an accurate number for the blocks
      used on the server, populate i_blocks based on the file size so
      that 'du' can give a reasonable estimate.
      
      The value is rounded up to 1K granularity, for consistency with
      what other AFS clients report, and the servers' 1K usage quota
      unit.  Note that the value calculated by 'du' at the root of a
      volume can still be slightly lower than the quota usage on the
      server, as 0-length files are charged 1 quota block, but are
      reported as occupying 0 blocks.  Again, this is consistent with
      other AFS clients.
      Signed-off-by: NMarc Dionne <marc.dionne@auristor.com>
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      c0abbb57
    • D
      afs: Log more information for "kAFS: AFS vnode with undefined type\n" · b134d687
      David Howells 提交于
      Log more information when "kAFS: AFS vnode with undefined type\n" is
      displayed due to a vnode record being retrieved from the server that
      appears to have a duff file type (usually 0).  This prints more information
      to try and help pin down the problem.
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      b134d687
  4. 02 5月, 2019 1 次提交
    • A
      afs: switch to use of ->free_inode() · 51b9fe48
      Al Viro 提交于
      debugging printks left in ->destroy_inode() and so's the
      update of inode count; we could take the latter to RCU-delayed
      part (would take only moving the check on module exit past
      rcu_barrier() there), but debugging output ought to either
      stay where it is or go into ->evict_inode()
      Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
      51b9fe48
  5. 25 4月, 2019 11 次提交
    • D
      afs: Provide mount-time configurable byte-range file locking emulation · 6c6c1d63
      David Howells 提交于
      Provide byte-range file locking emulation that can be configured at mount
      time to one of four modes:
      
       (1) flock=local.  Locking is done locally only and no reference is made to
           the server.
      
       (2) flock=openafs.  Byte-range locking is done locally only; whole-file
           locking is done with reference to the server.  Whole-file locks cannot
           be upgraded unless the client holds an exclusive lock.
      
       (3) flock=strict.  Byte-range and whole-file locking both require a
           sufficient whole-file lock on the server.
      
       (4) flock=write.  As strict, but the client always gets an exclusive
           whole-file lock on the server.
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      6c6c1d63
    • D
      afs: Add more tracepoints · 80548b03
      David Howells 提交于
      Add four more tracepoints:
      
       (1) afs_make_fs_call1 - Split from afs_make_fs_call but takes a filename
           to log also.
      
       (2) afs_make_fs_call2 - Like the above but takes two filenames to log.
      
       (3) afs_lookup - Log the result of doing a successful lookup, including a
           negative result (fid 0:0).
      
       (4) afs_get_tree - Log the set up of a volume for mounting.
      
      It also extends the name buffer on the afs_edit_dir tracepoint to 24 chars
      and puts quotes around the filename in the text representation.
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      80548b03
    • D
      afs: Implement sillyrename for unlink and rename · 79ddbfa5
      David Howells 提交于
      Implement sillyrename for AFS unlink and rename, using the NFS variant
      implementation as a basis.
      
      Note that the asynchronous file locking extender/releaser has to be
      notified with a state change to stop it complaining if there's a race
      between that and the actual file deletion.
      
      A tracepoint, afs_silly_rename, is also added to note the silly rename and
      the cleanup.  The afs_edit_dir tracepoint is given some extra reason
      indicators and the afs_flock_ev tracepoint is given a silly-delete file
      lock cancellation indicator.
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      79ddbfa5
    • D
      afs: Add directory reload tracepoint · 99987c56
      David Howells 提交于
      Add a tracepoint (afs_reload_dir) to indicate when a directory is being
      reloaded.
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      99987c56
    • D
      afs: Handle lock rpc ops failing on a file that got deleted · cdfb26b4
      David Howells 提交于
      Holding a file lock on an AFS file does not prevent it from being deleted
      on the server, so we need to handle an error resulting from that when we
      try setting, extending or releasing a lock.
      
      Fix this by adding a "deleted" lock state and cancelling the lock extension
      process for that file and aborting all waiters for the lock.
      
      Fixes: 0fafdc9f ("afs: Fix file locking")
      Reported-by: NJonathan Billings <jsbillin@umich.edu>
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      cdfb26b4
    • D
      afs: Improve dir check failure reports · 445b1028
      David Howells 提交于
      Improve the content of directory check failure reports from:
      
      	kAFS: afs_dir_check_page(6d57): bad magic 1/2 is 0000
      
      to dump more information about the individual blocks in a directory page.
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      445b1028
    • D
      afs: Add file locking tracepoints · d4696601
      David Howells 提交于
      Add two tracepoints for monitoring AFS file locking.  Firstly, add one that
      follows the operational part:
      
          echo 1 >/sys/kernel/debug/tracing/events/afs/afs_flock_op/enable
      
      And add a second that more follows the event-driven part:
      
          echo 1 >/sys/kernel/debug/tracing/events/afs/afs_flock_ev/enable
      
      Individual file_lock structs seen by afs are tagged with debugging IDs that
      are displayed in the trace log to make it easier to see what's going on,
      especially as setting the first lock always seems to involve copying the
      file_lock twice.
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      d4696601
    • D
      afs: Further fix file locking · 4be5975a
      David Howells 提交于
      Further fix the file locking in the afs filesystem client in a number of
      ways, including:
      
       (1) Don't submit the operation to obtain a lock from the server in a work
           queue context, but rather do it in the process context of whoever
           issued the requesting system call.
      
       (2) The owner of the file_lock struct at the front of the pending_locks
           queue now owns right to talk to the server.
      
       (3) Write locks can be instantly granted if they don't overlap with any
           other locks *and* we have a write lock on the server.
      
       (4) In the event of an authentication/permission error, all other matching
           pending locks requests are also immediately aborted.
      
       (5) Properly use VFS core locks_lock_file_wait() to distribute the server
           lock amongst local client locks, including waiting for the lock to
           become available.
      
      Test with:
      
      	sqlite3 /afs/.../scratch/billings.sqlite <<EOF
      	CREATE TABLE hosts (
      	    hostname varchar(80),
      	    shorthost varchar(80),
      	    room varchar(30),
      	    building varchar(30),
      	    PRIMARY KEY(shorthost)
      	    );
      	EOF
      
      With the version of sqlite3 that I have, this should fail consistently with
      EAGAIN, whether or not the program is straced (which introduces some delays
      between lock syscalls).
      
      Fixes: 0fafdc9f ("afs: Fix file locking")
      Reported-by: NJonathan Billings <jsbillin@umich.edu>
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      4be5975a
    • D
      afs: Fix AFS file locking to allow fine grained locks · 68ce801f
      David Howells 提交于
      Fix AFS file locking to allow fine grained locks as some applications, such
      as firefox, won't work if they can't take such locks on certain state files
      - thereby preventing the use of kAFS to distribute a home directory.
      
      Note that this cannot be made completely functional as the protocol only
      has provision for whole-file locks, so there exists the possibility of a
      process deadlocking itself by getting a partial read-lock on a file first
      and then trying to get a non-overlapping write-lock - but we got the
      server's read lock with the first lock, so we're now stuck.
      
      OpenAFS solves this by just granting any partial-range lock directly
      without consulting the server - and hoping there's no remote collision.  I
      want to implement that in a separate patch and it requires a bit more
      thought.
      
      Fixes: 8d6c554126b8 ("AFS: implement file locking")
      Reported-by: NJonathan Billings <jsbillings@jsbillings.org>
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      68ce801f
    • D
      afs: Calculate lock extend timer from set/extend reply reception · a690f60a
      David Howells 提交于
      Record the timestamp on the first reply DATA packet received in response to
      a set- or extend-lock operation, then use this to calculate the time
      remaining till the lock expires rather than using whatever time the
      requesting process wakes up and finishes processing the operation as a
      base.
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      a690f60a
    • D
      afs: Split wait from afs_make_call() · 0b9bf381
      David Howells 提交于
      Split the call to afs_wait_for_call_to_complete() from afs_make_call() to
      make it easier to handle asynchronous calls and to make it easier to
      convert a synchronous call to an asynchronous one in future, for instance
      when someone tries to interrupt an operation by pressing Ctrl-C.
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      0b9bf381
  6. 13 4月, 2019 7 次提交
    • D
      afs: Fix in-progess ops to ignore server-level callback invalidation · eeba1e9c
      David Howells 提交于
      The in-kernel afs filesystem client counts the number of server-level
      callback invalidation events (CB.InitCallBackState* RPC operations) that it
      receives from the server.  This is stored in cb_s_break in various
      structures, including afs_server and afs_vnode.
      
      If an inode is examined by afs_validate(), say, the afs_server copy is
      compared, along with other break counters, to those in afs_vnode, and if
      one or more of the counters do not match, it is considered that the
      server's callback promise is broken.  At points where this happens,
      AFS_VNODE_CB_PROMISED is cleared to indicate that the status must be
      refetched from the server.
      
      afs_validate() issues an FS.FetchStatus operation to get updated metadata -
      and based on the updated data_version may invalidate the pagecache too.
      
      However, the break counters are also used to determine whether to note a
      new callback in the vnode (which would set the AFS_VNODE_CB_PROMISED flag)
      and whether to cache the permit data included in the YFSFetchStatus record
      by the server.
      
      
      The problem comes when the server sends us a CB.InitCallBackState op.  The
      first such instance doesn't cause cb_s_break to be incremented, but rather
      causes AFS_SERVER_FL_NEW to be cleared - but thereafter, say some hours
      after last use and all the volumes have been automatically unmounted and
      the server has forgotten about the client[*], this *will* likely cause an
      increment.
      
       [*] There are other circumstances too, such as the server restarting or
           needing to make space in its callback table.
      
      Note that the server won't send us a CB.InitCallBackState op until we talk
      to it again.
      
      So what happens is:
      
       (1) A mount for a new volume is attempted, a inode is created for the root
           vnode and vnode->cb_s_break and AFS_VNODE_CB_PROMISED aren't set
           immediately, as we don't have a nominated server to talk to yet - and
           we may iterate through a few to find one.
      
       (2) Before the operation happens, afs_fetch_status(), say, notes in the
           cursor (fc.cb_break) the break counter sum from the vnode, volume and
           server counters, but the server->cb_s_break is currently 0.
      
       (3) We send FS.FetchStatus to the server.  The server sends us back
           CB.InitCallBackState.  We increment server->cb_s_break.
      
       (4) Our FS.FetchStatus completes.  The reply includes a callback record.
      
       (5) xdr_decode_AFSCallBack()/xdr_decode_YFSCallBack() check to see whether
           the callback promise was broken by checking the break counter sum from
           step (2) against the current sum.
      
           This fails because of step (3), so we don't set the callback record
           and, importantly, don't set AFS_VNODE_CB_PROMISED on the vnode.
      
      This does not preclude the syscall from progressing, and we don't loop here
      rechecking the status, but rather assume it's good enough for one round
      only and will need to be rechecked next time.
      
       (6) afs_validate() it triggered on the vnode, probably called from
           d_revalidate() checking the parent directory.
      
       (7) afs_validate() notes that AFS_VNODE_CB_PROMISED isn't set, so doesn't
           update vnode->cb_s_break and assumes the vnode to be invalid.
      
       (8) afs_validate() needs to calls afs_fetch_status().  Go back to step (2)
           and repeat, every time the vnode is validated.
      
      This primarily affects volume root dir vnodes.  Everything subsequent to
      those inherit an already incremented cb_s_break upon mounting.
      
      
      The issue is that we assume that the callback record and the cached permit
      information in a reply from the server can't be trusted after getting a
      server break - but this is wrong since the server makes sure things are
      done in the right order, holding up our ops if necessary[*].
      
       [*] There is an extremely unlikely scenario where a reply from before the
           CB.InitCallBackState could get its delivery deferred till after - at
           which point we think we have a promise when we don't.  This, however,
           requires unlucky mass packet loss to one call.
      
      AFS_SERVER_FL_NEW tries to paper over the cracks for the initial mount from
      a server we've never contacted before, but this should be unnecessary.
      It's also further insulated from the problem on an initial mount by
      querying the server first with FS.GetCapabilities, which triggers the
      CB.InitCallBackState.
      
      
      Fix this by
      
       (1) Remove AFS_SERVER_FL_NEW.
      
       (2) In afs_calc_vnode_cb_break(), don't include cb_s_break in the
           calculation.
      
       (3) In afs_cb_is_broken(), don't include cb_s_break in the check.
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      eeba1e9c
    • M
      afs: Unlock pages for __pagevec_release() · 21bd68f1
      Marc Dionne 提交于
      __pagevec_release() complains loudly if any page in the vector is still
      locked.  The pages need to be locked for generic_error_remove_page(), but
      that function doesn't actually unlock them.
      
      Unlock the pages afterwards.
      Signed-off-by: NMarc Dionne <marc.dionne@auristor.com>
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      Tested-by: NJonathan Billings <jsbillin@umich.edu>
      21bd68f1
    • D
      afs: Differentiate abort due to unmarshalling from other errors · 8022c4b9
      David Howells 提交于
      Differentiate an abort due to an unmarshalling error from an abort due to
      other errors, such as ENETUNREACH.  It doesn't make sense to set abort code
      RXGEN_*_UNMARSHAL in such a case, so use RX_USER_ABORT instead.
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      8022c4b9
    • A
      afs: Avoid section confusion in CM_NAME · d2abfa86
      Andi Kleen 提交于
      __tracepoint_str cannot be const because the tracepoint_str
      section is not read-only. Remove the stray const.
      
      Cc: dhowells@redhat.com
      Cc: viro@zeniv.linux.org.uk
      Signed-off-by: NAndi Kleen <ak@linux.intel.com>
      d2abfa86
    • A
      afs: avoid deprecated get_seconds() · ba25b81e
      Arnd Bergmann 提交于
      get_seconds() has a limited range on 32-bit architectures and is
      deprecated because of that. While AFS uses the same limits for
      its inode timestamps on the wire protocol, let's just use the
      simpler current_time() as we do for other file systems.
      
      This will still zero out the 'tv_nsec' field of the timestamps
      internally.
      Signed-off-by: NArnd Bergmann <arnd@arndb.de>
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      ba25b81e
    • M
      afs: Check for rxrpc call completion in wait loop · f7f1dd31
      Marc Dionne 提交于
      Check the state of the rxrpc call backing an afs call in each iteration of
      the call wait loop in case the rxrpc call has already been terminated at
      the rxrpc layer.
      
      Interrupt the wait loop and mark the afs call as complete if the rxrpc
      layer call is complete.
      
      There were cases where rxrpc errors were not passed up to afs, which could
      result in this loop waiting forever for an afs call to transition to
      AFS_CALL_COMPLETE while the rx call was already complete.
      Signed-off-by: NMarc Dionne <marc.dionne@auristor.com>
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      f7f1dd31
    • M
      rxrpc: Make rxrpc_kernel_check_life() indicate if call completed · 4611da30
      Marc Dionne 提交于
      Make rxrpc_kernel_check_life() pass back the life counter through the
      argument list and return true if the call has not yet completed.
      Suggested-by: NMarc Dionne <marc.dionne@auristor.com>
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      4611da30
  7. 09 4月, 2019 1 次提交
    • G
      afs: Mark expected switch fall-throughs · e690c9e3
      Gustavo A. R. Silva 提交于
      In preparation to enabling -Wimplicit-fallthrough, mark switch cases
      where we are expecting to fall through.
      
      Notice that in many cases I placed a /* Fall through */ comment
      at the bottom of the case, which what GCC is expecting to find.
      
      In other cases I had to tweak a bit the format of the comments.
      
      This patch suppresses ALL missing-break-in-switch false positives
      in fs/afs
      
      Addresses-Coverity-ID: 115042 ("Missing break in switch")
      Addresses-Coverity-ID: 115043 ("Missing break in switch")
      Addresses-Coverity-ID: 115045 ("Missing break in switch")
      Addresses-Coverity-ID: 1357430 ("Missing break in switch")
      Addresses-Coverity-ID: 115047 ("Missing break in switch")
      Addresses-Coverity-ID: 115050 ("Missing break in switch")
      Addresses-Coverity-ID: 115051 ("Missing break in switch")
      Addresses-Coverity-ID: 1467806 ("Missing break in switch")
      Addresses-Coverity-ID: 1467807 ("Missing break in switch")
      Addresses-Coverity-ID: 1467811 ("Missing break in switch")
      Addresses-Coverity-ID: 115041 ("Missing break in switch")
      Reviewed-by: NKees Cook <keescook@chromium.org>
      Signed-off-by: NGustavo A. R. Silva <gustavo@embeddedor.com>
      e690c9e3
  8. 28 3月, 2019 1 次提交
    • D
      afs: Fix StoreData op marshalling · 8c7ae38d
      David Howells 提交于
      The marshalling of AFS.StoreData, AFS.StoreData64 and YFS.StoreData64 calls
      generated by ->setattr() ops for the purpose of expanding a file is
      incorrect due to older documentation incorrectly describing the way the RPC
      'FileLength' parameter is meant to work.
      
      The older documentation says that this is the length the file is meant to
      end up at the end of the operation; however, it was never implemented this
      way in any of the servers, but rather the file is truncated down to this
      before the write operation is effected, and never expanded to it (and,
      indeed, it was renamed to 'TruncPos' in 2014).
      
      Fix this by setting the position parameter to the new file length and doing
      a zero-lengh write there.
      
      The bug causes Xwayland to SIGBUS due to unexpected non-expansion of a file
      it then mmaps.  This can be tested by giving the following test program a
      filename in an AFS directory:
      
      	#include <stdio.h>
      	#include <stdlib.h>
      	#include <unistd.h>
      	#include <fcntl.h>
      	#include <sys/mman.h>
      	int main(int argc, char *argv[])
      	{
      		char *p;
      		int fd;
      		if (argc != 2) {
      			fprintf(stderr,
      				"Format: test-trunc-mmap <file>\n");
      			exit(2);
      		}
      		fd = open(argv[1], O_RDWR | O_CREAT | O_TRUNC);
      		if (fd < 0) {
      			perror(argv[1]);
      			exit(1);
      		}
      		if (ftruncate(fd, 0x140008) == -1) {
      			perror("ftruncate");
      			exit(1);
      		}
      		p = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
      			 MAP_SHARED, fd, 0);
      		if (p == MAP_FAILED) {
      			perror("mmap");
      			exit(1);
      		}
      		p[0] = 'a';
      		if (munmap(p, 4096) < 0) {
      			perror("munmap");
      			exit(1);
      		}
      		if (close(fd) < 0) {
      			perror("close");
      			exit(1);
      		}
      		exit(0);
      	}
      
      Fixes: 31143d5d ("AFS: implement basic file write support")
      Reported-by: NJonathan Billings <jsbillin@umich.edu>
      Tested-by: NJonathan Billings <jsbillin@umich.edu>
      Signed-off-by: NDavid Howells <dhowells@redhat.com>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      8c7ae38d