31 May, 2019

1 commit

  • Based on 1 normalized pattern(s):

    this program is free software you can redistribute it and or modify
    it under the terms of the gnu general public license as published by
    the free software foundation either version 2 of the license or at
    your option any later version

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-or-later

    has been chosen to replace the boilerplate/reference in 3029 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Allison Randal
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190527070032.746973796@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     

07 May, 2019

2 commits

  • Implements the setting of ACLs in AFS by means of setting the
    afs.acl extended attribute on the file.

    Signed-off-by: Joe Gorse
    Signed-off-by: David Howells

    Joe Gorse
     
  • 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: David Howells

    David Howells
     

10 Apr, 2018

1 commit


13 Nov, 2017

3 commits

  • The current code assumes that volumes and servers are per-cell and are
    never shared, but this is not enforced, and, indeed, public cells do exist
    that are aliases of each other. Further, an organisation can, say, set up
    a public cell and a private cell with overlapping, but not identical, sets
    of servers. The difference is purely in the database attached to the VL
    servers.

    The current code will malfunction if it sees a server in two cells as it
    assumes global address -> server record mappings and that each server is in
    just one cell.

    Further, each server may have multiple addresses - and may have addresses
    of different families (IPv4 and IPv6, say).

    To this end, the following structural changes are made:

    (1) Server record management is overhauled:

    (a) Server records are made independent of cell. The namespace keeps
    track of them, volume records have lists of them and each vnode
    has a server on which its callback interest currently resides.

    (b) The cell record no longer keeps a list of servers known to be in
    that cell.

    (c) The server records are now kept in a flat list because there's no
    single address to sort on.

    (d) Server records are now keyed by their UUID within the namespace.

    (e) The addresses for a server are obtained with the VL.GetAddrsU
    rather than with VL.GetEntryByName, using the server's UUID as a
    parameter.

    (f) Cached server records are garbage collected after a period of
    non-use and are counted out of existence before purging is allowed
    to complete. This protects the work functions against rmmod.

    (g) The servers list is now in /proc/fs/afs/servers.

    (2) Volume record management is overhauled:

    (a) An RCU-replaceable server list is introduced. This tracks both
    servers and their coresponding callback interests.

    (b) The superblock is now keyed on cell record and numeric volume ID.

    (c) The volume record is now tied to the superblock which mounts it,
    and is activated when mounted and deactivated when unmounted.
    This makes it easier to handle the cache cookie without causing a
    double-use in fscache.

    (d) The volume record is loaded from the VLDB using VL.GetEntryByNameU
    to get the server UUID list.

    (e) The volume name is updated if it is seen to have changed when the
    volume is updated (the update is keyed on the volume ID).

    (3) The vlocation record is got rid of and VLDB records are no longer
    cached. Sufficient information is stored in the volume record, though
    an update to a volume record is now no longer shared between related
    volumes (volumes come in bundles of three: R/W, R/O and backup).

    and the following procedural changes are made:

    (1) The fileserver cursor introduced previously is now fleshed out and
    used to iterate over fileservers and their addresses.

    (2) Volume status is checked during iteration, and the server list is
    replaced if a change is detected.

    (3) Server status is checked during iteration, and the address list is
    replaced if a change is detected.

    (4) The abort code is saved into the address list cursor and -ECONNABORTED
    returned in afs_make_call() if a remote abort happened rather than
    translating the abort into an error message. This allows actions to
    be taken depending on the abort code more easily.

    (a) If a VMOVED abort is seen then this is handled by rechecking the
    volume and restarting the iteration.

    (b) If a VBUSY, VRESTARTING or VSALVAGING abort is seen then this is
    handled by sleeping for a short period and retrying and/or trying
    other servers that might serve that volume. A message is also
    displayed once until the condition has cleared.

    (c) If a VOFFLINE abort is seen, then this is handled as VBUSY for the
    moment.

    (d) If a VNOVOL abort is seen, the volume is rechecked in the VLDB to
    see if it has been deleted; if not, the fileserver is probably
    indicating that the volume couldn't be attached and needs
    salvaging.

    (e) If statfs() sees one of these aborts, it does not sleep, but
    rather returns an error, so as not to block the umount program.

    (5) The fileserver iteration functions in vnode.c are now merged into
    their callers and more heavily macroised around the cursor. vnode.c
    is removed.

    (6) Operations on a particular vnode are serialised on that vnode because
    the server will lock that vnode whilst it operates on it, so a second
    op sent will just have to wait.

    (7) Fileservers are probed with FS.GetCapabilities before being used.
    This is where service upgrade will be done.

    (8) A callback interest on a fileserver is set up before an FS operation
    is performed and passed through to afs_make_call() so that it can be
    set on the vnode if the operation returns a callback. The callback
    interest is passed through to afs_iget() also so that it can be set
    there too.

    In general, record updating is done on an as-needed basis when we try to
    access servers, volumes or vnodes rather than offloading it to work items
    and special threads.

    Notes:

    (1) Pre AFS-3.4 servers are no longer supported, though this can be added
    back if necessary (AFS-3.4 was released in 1998).

    (2) VBUSY is retried forever for the moment at intervals of 1s.

    (3) /proc/fs/afs//servers no longer exists.

    Signed-off-by: David Howells

    David Howells
     
  • Overhaul the AFS callback handling by the following means:

    (1) Don't give up callback promises on vnodes that we are no longer using,
    rather let them just expire on the server or let the server break
    them. This is actually more efficient for the server as the callback
    lookup is expensive if there are lots of extant callbacks.

    (2) Only give up the callback promises we have from a server when the
    server record is destroyed. Then we can just give up *all* the
    callback promises on it in one go.

    (3) Servers can end up being shared between cells if cells are aliased, so
    don't add all the vnodes being backed by a particular server into a
    big FID-indexed tree on that server as there may be duplicates.

    Instead have each volume instance (~= superblock) register an interest
    in a server as it starts to make use of it and use this to allow the
    processor for callbacks from the server to find the superblock and
    thence the inode corresponding to the FID being broken by means of
    ilookup_nowait().

    (4) Rather than iterating over the entire callback list when a mass-break
    comes in from the server, maintain a counter of mass-breaks in
    afs_server (cb_seq) and make afs_validate() check it against the copy
    in afs_vnode.

    It would be nice not to have to take a read_lock whilst doing this,
    but that's tricky without using RCU.

    (5) Save a ref on the fileserver we're using for a call in the afs_call
    struct so that we can access its cb_s_break during call decoding.

    (6) Write-lock around callback and status storage in a vnode and read-lock
    around getattr so that we don't see the status mid-update.

    This has the following consequences:

    (1) Data invalidation isn't seen until someone calls afs_validate() on a
    vnode. Unfortunately, we need to use a key to query the server, but
    getting one from a background thread is tricky without caching loads
    of keys all over the place.

    (2) Mass invalidation isn't seen until someone calls afs_validate().

    (3) Callback breaking is going to hit the inode_hash_lock quite a bit.
    Could this be replaced with rcu_read_lock() since inodes are destroyed
    under RCU conditions.

    Signed-off-by: David Howells

    David Howells
     
  • Add some protocol definitions, including max field lengths, flag defs, an
    XDR-encoded UUID def, more VL operation IDs and more fileserver abort
    codes.

    Signed-off-by: David Howells

    David Howells
     

17 Jul, 2007

1 commit


11 May, 2007

2 commits

  • Implement the statfs() op for AFS.

    Signed-off-by: David Howells
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    David Howells
     
  • AFS write support fixes:

    (1) Support large files using the 64-bit file access operations if available
    on the server.

    (2) Use kmap_atomic() rather than kmap() in afs_prepare_page().

    (3) Don't do stuff in afs_writepage() that's done by the caller.

    [akpm@linux-foundation.org: fix right shift count >= width of type]
    Signed-off-by: David Howells
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    David Howells
     

10 May, 2007

1 commit

  • Implement support for writing to regular AFS files, including:

    (1) write

    (2) truncate

    (3) fsync, fdatasync

    (4) chmod, chown, chgrp, utime.

    AFS writeback attempts to batch writes into as chunks as large as it can manage
    up to the point that it writes back 65535 pages in one chunk or it meets a
    locked page.

    Furthermore, if a page has been written to using a particular key, then should
    another write to that page use some other key, the first write will be flushed
    before the second is allowed to take place. If the first write fails due to a
    security error, then the page will be scrapped and reread before the second
    write takes place.

    If a page is dirty and the callback on it is broken by the server, then the
    dirty data is not discarded (same behaviour as NFS).

    Shared-writable mappings are not supported by this patch.

    [akpm@linux-foundation.org: fix a bunch of warnings]
    Signed-off-by: David Howells
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    David Howells
     

27 Apr, 2007

2 commits

  • Add support for the create, link, symlink, unlink, mkdir, rmdir and
    rename VFS operations to the in-kernel AFS filesystem.

    Also:

    (1) Fix dentry and inode revalidation. d_revalidate should only look at
    state of the dentry. Revalidation of the contents of an inode pointed to
    by a dentry is now separate.

    (2) Fix afs_lookup() to hash negative dentries as well as positive ones.

    Signed-off-by: David Howells
    Signed-off-by: David S. Miller

    David Howells
     
  • Make the in-kernel AFS filesystem use AF_RXRPC instead of the old RxRPC code.

    Signed-off-by: David Howells
    Signed-off-by: David S. Miller

    David Howells