02 May, 2020

1 commit

  • commit c4bfda16d1b40d1c5941c61b5aa336bdd2d9904a upstream.

    When an operation is meant to be done uninterruptibly (such as
    FS.StoreData), we should not be allowing volume and server record checking
    to be interrupted.

    Fixes: d2ddc776a458 ("afs: Overhaul volume and server record caching and fileserver rotation")
    Signed-off-by: David Howells
    Signed-off-by: Greg Kroah-Hartman

    David Howells
     

02 Sep, 2019

1 commit

  • fs/afs/volume.c:15:26: warning:
    afs_voltypes defined but not used [-Wunused-const-variable=]

    It is not used since commit d2ddc776a458 ("afs: Overhaul
    volume and server record caching and fileserver rotation")

    Reported-by: Hulk Robot
    Signed-off-by: YueHaibing
    Signed-off-by: David Howells

    YueHaibing
     

28 Jun, 2019

1 commit

  • Pull AFS fixes from David Howells:
    "The in-kernel AFS client has been undergoing testing on opendev.org on
    one of their mirror machines. They are using AFS to hold data that is
    then served via apache, and Ian Wienand had reported seeing oopses,
    spontaneous machine reboots and updates to volumes going missing. This
    patch series appears to have fixed the problem, very probably due to
    patch (2), but it's not 100% certain.

    (1) Fix the printing of the "vnode modified" warning to exclude checks
    on files for which we don't have a callback promise from the
    server (and so don't expect the server to tell us when it
    changes).

    Without this, for every file or directory for which we still have
    an in-core inode that gets changed on the server, we may get a
    message logged when we next look at it. This can happen in bulk
    if, for instance, someone does "vos release" to update a R/O
    volume from a R/W volume and a whole set of files are all changed
    together.

    We only really want to log a message if the file changed and the
    server didn't tell us about it or we failed to track the state
    internally.

    (2) Fix accidental corruption of either afs_vlserver struct objects or
    the the following memory locations (which could hold anything).
    The issue is caused by a union that points to two different
    structs in struct afs_call (to save space in the struct). The call
    cleanup code assumes that it can simply call the cleanup for one
    of those structs if not NULL - when it might be actually pointing
    to the other struct.

    This means that every Volume Location RPC op is going to corrupt
    something.

    (3) Fix an uninitialised spinlock. This isn't too bad, it just causes
    a one-off warning if lockdep is enabled when "vos release" is
    called, but the spinlock still behaves correctly.

    (4) Fix the setting of i_block in the inode. This causes du, for
    example, to produce incorrect results, but otherwise should not be
    dangerous to the kernel"

    * tag 'afs-fixes-20190620' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs:
    afs: Fix setting of i_blocks
    afs: Fix uninitialised spinlock afs_volume::cb_break_lock
    afs: Fix vlserver record corruption
    afs: Fix over zealous "vnode modified" warnings

    Linus Torvalds
     

20 Jun, 2019

1 commit

  • Fix the cb_break_lock spinlock in afs_volume struct by initialising it when
    the volume record is allocated.

    Also rename the lock to cb_v_break_lock to distinguish it from the lock of
    the same name in the afs_server struct.

    Without this, the following trace may be observed when a volume-break
    callback is received:

    INFO: trying to register non-static key.
    the code is fine but needs lockdep annotation.
    turning off the locking correctness validator.
    CPU: 2 PID: 50 Comm: kworker/2:1 Not tainted 5.2.0-rc1-fscache+ #3045
    Hardware name: ASUS All Series/H97-PLUS, BIOS 2306 10/09/2014
    Workqueue: afs SRXAFSCB_CallBack
    Call Trace:
    dump_stack+0x67/0x8e
    register_lock_class+0x23b/0x421
    ? check_usage_forwards+0x13c/0x13c
    __lock_acquire+0x89/0xf73
    lock_acquire+0x13b/0x166
    ? afs_break_callbacks+0x1b2/0x3dd
    _raw_write_lock+0x2c/0x36
    ? afs_break_callbacks+0x1b2/0x3dd
    afs_break_callbacks+0x1b2/0x3dd
    ? trace_event_raw_event_afs_server+0x61/0xac
    SRXAFSCB_CallBack+0x11f/0x16c
    process_one_work+0x2c5/0x4ee
    ? worker_thread+0x234/0x2ac
    worker_thread+0x1d8/0x2ac
    ? cancel_delayed_work_sync+0xf/0xf
    kthread+0x11f/0x127
    ? kthread_park+0x76/0x76
    ret_from_fork+0x24/0x30

    Fixes: 68251f0a6818 ("afs: Fix whole-volume callback handling")
    Signed-off-by: David Howells

    David Howells
     

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
     

28 Feb, 2019

1 commit

  • Add fs_context support to the AFS filesystem, converting the parameter
    parsing to store options there.

    This will form the basis for namespace propagation over mountpoints within
    the AFS model, thereby allowing AFS to be used in containers more easily.

    Signed-off-by: David Howells
    Signed-off-by: Al Viro

    David Howells
     

24 Oct, 2018

4 commits

  • Send probes to all the unprobed fileservers in a fileserver list on all
    addresses simultaneously in an attempt to find out the fastest route whilst
    not getting stuck for 20s on any server or address that we don't get a
    reply from.

    This alleviates the problem whereby attempting to access a new server can
    take a long time because the rotation algorithm ends up rotating through
    all servers and addresses until it finds one that responds.

    Signed-off-by: David Howells

    David Howells
     
  • Eliminate the address pointer from the address list cursor as it's
    redundant (ac->addrs[ac->index] can be used to find the same address) and
    address lists must be replaced rather than being rearranged, so is of
    limited value.

    Signed-off-by: David Howells

    David Howells
     
  • Increase the sizes of the volume ID to 64 bits and the vnode ID (inode
    number equivalent) to 96 bits to allow the support of YFS.

    This requires the iget comparator to check the vnode->fid rather than i_ino
    and i_generation as i_ino is not sufficiently capacious. It also requires
    this data to be placed into the vnode cache key for fscache.

    For the moment, just discard the top 32 bits of the vnode ID when returning
    it though stat.

    Signed-off-by: David Howells

    David Howells
     
  • Track VL servers as independent entities rather than lumping all their
    addresses together into one set and implement server-level rotation by:

    (1) Add the concept of a VL server list, where each server has its own
    separate address list. This code is similar to the FS server list.

    (2) Use the DNS resolver to retrieve a set of servers and their associated
    addresses, ports, preference and weight ratings.

    (3) In the case of a legacy DNS resolver or an address list given directly
    through /proc/net/afs/cells, create a list containing just a dummy
    server record and attach all the addresses to that.

    (4) Implement a simple rotation policy, for the moment ignoring the
    priorities and weights assigned to the servers.

    (5) Show the address list through /proc/net/afs//vlservers. This
    also displays the source and status of the data as indicated by the
    upcall.

    Signed-off-by: David Howells

    David Howells
     

06 Apr, 2018

1 commit

  • Pass the object size in to fscache_acquire_cookie() and
    fscache_write_page() rather than the netfs providing a callback by which it
    can be received. This makes it easier to update the size of the object
    when a new page is written that extends the object.

    The current object size is also passed by fscache to the check_aux
    function, obviating the need to store it in the aux data.

    Signed-off-by: David Howells
    Acked-by: Anna Schumaker
    Tested-by: Steve Dickson

    David Howells
     

04 Apr, 2018

1 commit

  • Attach copies of the index key and auxiliary data to the fscache cookie so
    that:

    (1) The callbacks to the netfs for this stuff can be eliminated. This
    can simplify things in the cache as the information is still
    available, even after the cache has relinquished the cookie.

    (2) Simplifies the locking requirements of accessing the information as we
    don't have to worry about the netfs object going away on us.

    (3) The cache can do lazy updating of the coherency information on disk.
    As long as the cache is flushed before reboot/poweroff, there's no
    need to update the coherency info on disk every time it changes.

    (4) Cookies can be hashed or put in a tree as the index key is easily
    available. This allows:

    (a) Checks for duplicate cookies can be made at the top fscache layer
    rather than down in the bowels of the cache backend.

    (b) Caching can be added to a netfs object that has a cookie if the
    cache is brought online after the netfs object is allocated.

    A certain amount of space is made in the cookie for inline copies of the
    data, but if it won't fit there, extra memory will be allocated for it.

    The downside of this is that live cache operation requires more memory.

    Signed-off-by: David Howells
    Acked-by: Anna Schumaker
    Tested-by: Steve Dickson

    David Howells
     

06 Feb, 2018

2 commits

  • Fix server list handling in the following ways:

    (1) In afs_alloc_volume(), remove duplicate server list build code. This
    was already done by afs_alloc_server_list() which afs_alloc_volume()
    previously called. This just results in twice as many VL RPCs.

    (2) In afs_deliver_vl_get_entry_by_name_u(), use the number of server
    records indicated by ->nServers in the UVLDB record returned by the
    VL.GetEntryByNameU RPC call rather than scanning all NMAXNSERVERS
    slots. Unused slots may contain garbage.

    (3) In afs_alloc_server_list(), don't stop converting a UVLDB record into
    a server list just because we can't look up one of the servers. Just
    skip that server and go on to the next. If we can't look up any of
    the servers then we'll fail at the end.

    Without this patch, an attempt to view the umich.edu root cell using
    something like "ls /afs/umich.edu" on a dynamic root (future patch) mount
    or an autocell mount will result in ENOMEDIUM. The failure is due to kafs
    not stopping after nServers'worth of records have been read, but then
    trying to access a server with a garbage UUID and getting an error, which
    aborts the server list build.

    Fixes: d2ddc776a458 ("afs: Overhaul volume and server record caching and fileserver rotation")
    Reported-by: Jonathan Billings
    Signed-off-by: David Howells
    cc: stable@vger.kernel.org

    David Howells
     
  • afs_alloc_volume() needs to release the cell ref it obtained in the case of
    an error. Fix this by adding an afs_put_cell() call into the error path.

    This can triggered when a lookup for a cell in a dynamic root or an
    autocell mount returns an error whilst trying to look up the server (such
    as ENOMEDIUM). This results in an assertion failure oops when the module
    is unloaded due to outstanding refs on a cell record.

    Fixes: d2ddc776a458 ("afs: Overhaul volume and server record caching and fileserver rotation")
    Signed-off-by: David Howells
    cc: stable@vger.kernel.org

    David Howells
     

13 Nov, 2017

9 commits

  • YFS VL servers offer an upgraded Volume Location service that can return
    IPv6 addresses to fileservers and volume servers in addition to IPv4
    addresses using the YFSVL.GetEndpoints operation which we should use if
    it's available.

    To this end:

    (1) Make rxrpc_kernel_recv_data() return the call's current service ID so
    that the caller can detect service upgrade and see what the service
    was upgraded to.

    (2) When we see a VL server address we haven't seen before, send a
    VL.GetCapabilities operation to it with the service upgrade bit set.

    If we get an upgrade to the YFS VL service, change the service ID in
    the address list for that address to use the upgraded service and set
    a flag to note that this appears to be a YFS-compatible server.

    (3) If, when a server's addresses are being looked up, we note that we
    previously detected a YFS-compatible server, then send the
    YFSVL.GetEndpoints operation rather than VL.GetAddrsU.

    (4) Build a fileserver address list from the reply of YFSVL.GetEndpoints,
    including both IPv4 and IPv6 addresses. Volume server addresses are
    discarded.

    (5) The address list is sorted by address and port now, instead of just
    address. This allows multiple servers on the same host sitting on
    different ports.

    Signed-off-by: David Howells

    David Howells
     
  • 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
     
  • Move server rotation code into its own file.

    Signed-off-by: David Howells

    David Howells
     
  • Add an RCU replaceable address list structure to hold a list of server
    addresses. The list also holds the

    To this end:

    (1) A cell's VL server address list can be loaded directly via insmod or
    echo to /proc/fs/afs/cells or dynamically from a DNS query for AFSDB
    or SRV records.

    (2) Anyone wanting to use a cell's VL server address must wait until the
    cell record comes online and has tried to obtain some addresses.

    (3) An FS server's address list, for the moment, has a single entry that
    is the key to the server list. This will change in the future when a
    server is instead keyed on its UUID and the VL.GetAddrsU operation is
    used.

    (4) An 'address cursor' concept is introduced to handle iteration through
    the address list. This is passed to the afs_make_call() as, in the
    future, stuff (such as abort code) that doesn't outlast the call will
    be returned in it.

    In the future, we might want to annotate the list with information about
    how each address fares. We might then want to propagate such annotations
    over address list replacement.

    Whilst we're at it, we allow IPv6 addresses to be specified in
    colon-delimited lists by enclosing them in square brackets.

    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
     
  • Keep and pass sockaddr_rxrpc addresses around rather than keeping and
    passing in_addr addresses to allow for the use of IPv6 and non-standard
    port numbers in future.

    This also allows the port and service_id fields to be removed from the
    afs_call struct.

    Signed-off-by: David Howells

    David Howells
     
  • Update the cache index structure in the following ways:

    (1) Don't use the volume name followed by the volume type as levels in the
    cache index. Volumes can be renamed. Use the volume ID instead.

    (2) Don't store the VLDB data for a volume in the tree. If the volume
    database should be cached locally, then it should be done in a separate
    tree.

    (3) Expand the volume ID stored in the cache to 64 bits.

    (4) Expand the file/vnode ID stored in the cache to 96 bits.

    (5) Increment the cache structure version number to 1.

    Signed-off-by: David Howells

    David Howells
     
  • Push the network namespace pointer to more places in AFS, including the
    afs_server structure (which doesn't hold a ref on the netns).

    In particular, afs_put_cell() now takes requires a net ns parameter so that
    it can safely alter the netns after decrementing the cell usage count - the
    cell will be deallocated by a background thread after being cached for a
    period, which means that it's not safe to access it after reducing its
    usage count.

    Signed-off-by: David Howells

    David Howells
     
  • Lay the groundwork for supporting network namespaces (netns) to the AFS
    filesystem by moving various global features to a network-namespace struct
    (afs_net) and providing an instance of this as a temporary global variable
    that everything uses via accessor functions for the moment.

    The following changes have been made:

    (1) Store the netns in the superblock info. This will be obtained from
    the mounter's nsproxy on a manual mount and inherited from the parent
    superblock on an automount.

    (2) The cell list is made per-netns. It can be viewed through
    /proc/net/afs/cells and also be modified by writing commands to that
    file.

    (3) The local workstation cell is set per-ns in /proc/net/afs/rootcell.
    This is unset by default.

    (4) The 'rootcell' module parameter, which sets a cell and VL server list
    modifies the init net namespace, thereby allowing an AFS root fs to be
    theoretically used.

    (5) The volume location lists and the file lock manager are made
    per-netns.

    (6) The AF_RXRPC socket and associated I/O bits are made per-ns.

    The various workqueues remain global for the moment.

    Changes still to be made:

    (1) /proc/fs/afs/ should be moved to /proc/net/afs/ and a symlink emplaced
    from the old name.

    (2) A per-netns subsys needs to be registered for AFS into which it can
    store its per-netns data.

    (3) Rather than the AF_RXRPC socket being opened on module init, it needs
    to be opened on the creation of a superblock in that netns.

    (4) The socket needs to be closed when the last superblock using it is
    destroyed and all outstanding client calls on it have been completed.
    This prevents a reference loop on the namespace.

    (5) It is possible that several namespaces will want to use AFS, in which
    case each one will need its own UDP port. These can either be set
    through /proc/net/afs/cm_port or the kernel can pick one at random.
    The init_ns gets 7001 by default.

    Other issues that need resolving:

    (1) The DNS keyring needs net-namespacing.

    (2) Where do upcalls go (eg. DNS request-key upcall)?

    (3) Need something like open_socket_in_file_ns() syscall so that AFS
    command line tools attempting to operate on an AFS file/volume have
    their RPC calls go to the right place.

    Signed-off-by: David Howells

    David Howells
     

21 Apr, 2017

1 commit

  • Allocate struct backing_dev_info separately instead of embedding it
    inside the superblock. This unifies handling of bdi among users.

    CC: David Howells
    CC: linux-afs@lists.infradead.org
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Jan Kara
    Signed-off-by: Jens Axboe

    Jan Kara
     

07 Jan, 2017

1 commit


21 Jan, 2015

1 commit

  • Since "BDI: Provide backing device capability information [try #3]" the
    backing_dev_info structure also provides flags for the kind of mmap
    operation available in a nommu environment, which is entirely unrelated
    to it's original purpose.

    Introduce a new nommu-only file operation to provide this information to
    the nommu mmap code instead. Splitting this from the backing_dev_info
    structure allows to remove lots of backing_dev_info instance that aren't
    otherwise needed, and entirely gets rid of the concept of providing a
    backing_dev_info for a character device. It also removes the need for
    the mtd_inodefs filesystem.

    Signed-off-by: Christoph Hellwig
    Reviewed-by: Tejun Heo
    Acked-by: Brian Norris
    Signed-off-by: Jens Axboe

    Christoph Hellwig
     

28 Sep, 2013

1 commit

  • Provide the ability to enable and disable fscache cookies. A disabled cookie
    will reject or ignore further requests to:

    Acquire a child cookie
    Invalidate and update backing objects
    Check the consistency of a backing object
    Allocate storage for backing page
    Read backing pages
    Write to backing pages

    but still allows:

    Checks/waits on the completion of already in-progress objects
    Uncaching of pages
    Relinquishment of cookies

    Two new operations are provided:

    (1) Disable a cookie:

    void fscache_disable_cookie(struct fscache_cookie *cookie,
    bool invalidate);

    If the cookie is not already disabled, this locks the cookie against other
    dis/enablement ops, marks the cookie as being disabled, discards or
    invalidates any backing objects and waits for cessation of activity on any
    associated object.

    This is a wrapper around a chunk split out of fscache_relinquish_cookie(),
    but it reinitialises the cookie such that it can be reenabled.

    All possible failures are handled internally. The caller should consider
    calling fscache_uncache_all_inode_pages() afterwards to make sure all page
    markings are cleared up.

    (2) Enable a cookie:

    void fscache_enable_cookie(struct fscache_cookie *cookie,
    bool (*can_enable)(void *data),
    void *data)

    If the cookie is not already enabled, this locks the cookie against other
    dis/enablement ops, invokes can_enable() and, if the cookie is not an
    index cookie, will begin the procedure of acquiring backing objects.

    The optional can_enable() function is passed the data argument and returns
    a ruling as to whether or not enablement should actually be permitted to
    begin.

    All possible failures are handled internally. The cookie will only be
    marked as enabled if provisional backing objects are allocated.

    A later patch will introduce these to NFS. Cookie enablement during nfs_open()
    is then contingent on i_writecount <dhowells@redhat.com

    David Howells
     

22 Apr, 2010

1 commit


03 Apr, 2009

1 commit

  • The attached patch makes the kAFS filesystem in fs/afs/ use FS-Cache, and
    through it any attached caches. The kAFS filesystem will use caching
    automatically if it's available.

    Signed-off-by: David Howells
    Acked-by: Steve Dickson
    Acked-by: Trond Myklebust
    Acked-by: Al Viro
    Tested-by: Daire Byrne

    David Howells
     

22 May, 2007

1 commit

  • First thing mm.h does is including sched.h solely for can_do_mlock() inline
    function which has "current" dereference inside. By dealing with can_do_mlock()
    mm.h can be detached from sched.h which is good. See below, why.

    This patch
    a) removes unconditional inclusion of sched.h from mm.h
    b) makes can_do_mlock() normal function in mm/mlock.c
    c) exports can_do_mlock() to not break compilation
    d) adds sched.h inclusions back to files that were getting it indirectly.
    e) adds less bloated headers to some files (asm/signal.h, jiffies.h) that were
    getting them indirectly

    Net result is:
    a) mm.h users would get less code to open, read, preprocess, parse, ... if
    they don't need sched.h
    b) sched.h stops being dependency for significant number of files:
    on x86_64 allmodconfig touching sched.h results in recompile of 4083 files,
    after patch it's only 3744 (-8.3%).

    Cross-compile tested on

    all arm defconfigs, all mips defconfigs, all powerpc defconfigs,
    alpha alpha-up
    arm
    i386 i386-up i386-defconfig i386-allnoconfig
    ia64 ia64-up
    m68k
    mips
    parisc parisc-up
    powerpc powerpc-up
    s390 s390-up
    sparc sparc-up
    sparc64 sparc64-up
    um-x86_64
    x86_64 x86_64-up x86_64-defconfig x86_64-allnoconfig

    as well as my two usual configs.

    Signed-off-by: Alexey Dobriyan
    Signed-off-by: Linus Torvalds

    Alexey Dobriyan
     

27 Apr, 2007

4 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
     
  • Add security support to the AFS filesystem. Kerberos IV tickets are added as
    RxRPC keys are added to the session keyring with the klog program. open() and
    other VFS operations then find this ticket with request_key() and either use
    it immediately (eg: mkdir, unlink) or attach it to a file descriptor (open).

    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
     
  • Clean up the AFS sources.

    Also remove references to AFS keys. RxRPC keys are used instead.

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

    David Howells
     

27 Sep, 2006

1 commit


17 Apr, 2005

1 commit

  • Initial git repository build. I'm not bothering with the full history,
    even though we have it. We can create a separate "historical" git
    archive of that later if we want to, and in the meantime it's about
    3.2GB when imported into git - space that would just make the early
    git days unnecessarily complicated, when we don't have a lot of good
    infrastructure for it.

    Let it rip!

    Linus Torvalds