linux/fs/nfs/fscache.c
<<
>>
Prefs
   1/* NFS filesystem cache interface
   2 *
   3 * Copyright (C) 2008 Red Hat, Inc. All Rights Reserved.
   4 * Written by David Howells (dhowells@redhat.com)
   5 *
   6 * This program is free software; you can redistribute it and/or
   7 * modify it under the terms of the GNU General Public Licence
   8 * as published by the Free Software Foundation; either version
   9 * 2 of the Licence, or (at your option) any later version.
  10 */
  11
  12#include <linux/init.h>
  13#include <linux/kernel.h>
  14#include <linux/sched.h>
  15#include <linux/mm.h>
  16#include <linux/nfs_fs.h>
  17#include <linux/nfs_fs_sb.h>
  18#include <linux/in6.h>
  19#include <linux/seq_file.h>
  20#include <linux/slab.h>
  21
  22#include "internal.h"
  23#include "iostat.h"
  24#include "fscache.h"
  25
  26#define NFSDBG_FACILITY         NFSDBG_FSCACHE
  27
  28static struct rb_root nfs_fscache_keys = RB_ROOT;
  29static DEFINE_SPINLOCK(nfs_fscache_keys_lock);
  30
  31/*
  32 * Get the per-client index cookie for an NFS client if the appropriate mount
  33 * flag was set
  34 * - We always try and get an index cookie for the client, but get filehandle
  35 *   cookies on a per-superblock basis, depending on the mount flags
  36 */
  37void nfs_fscache_get_client_cookie(struct nfs_client *clp)
  38{
  39        /* create a cache index for looking up filehandles */
  40        clp->fscache = fscache_acquire_cookie(nfs_fscache_netfs.primary_index,
  41                                              &nfs_fscache_server_index_def,
  42                                              clp);
  43        dfprintk(FSCACHE, "NFS: get client cookie (0x%p/0x%p)\n",
  44                 clp, clp->fscache);
  45}
  46
  47/*
  48 * Dispose of a per-client cookie
  49 */
  50void nfs_fscache_release_client_cookie(struct nfs_client *clp)
  51{
  52        dfprintk(FSCACHE, "NFS: releasing client cookie (0x%p/0x%p)\n",
  53                 clp, clp->fscache);
  54
  55        fscache_relinquish_cookie(clp->fscache, 0);
  56        clp->fscache = NULL;
  57}
  58
  59/*
  60 * Get the cache cookie for an NFS superblock.  We have to handle
  61 * uniquification here because the cache doesn't do it for us.
  62 *
  63 * The default uniquifier is just an empty string, but it may be overridden
  64 * either by the 'fsc=xxx' option to mount, or by inheriting it from the parent
  65 * superblock across an automount point of some nature.
  66 */
  67void nfs_fscache_get_super_cookie(struct super_block *sb, const char *uniq, int ulen)
  68{
  69        struct nfs_fscache_key *key, *xkey;
  70        struct nfs_server *nfss = NFS_SB(sb);
  71        struct rb_node **p, *parent;
  72        int diff;
  73
  74        if (!uniq) {
  75                uniq = "";
  76                ulen = 1;
  77        }
  78
  79        key = kzalloc(sizeof(*key) + ulen, GFP_KERNEL);
  80        if (!key)
  81                return;
  82
  83        key->nfs_client = nfss->nfs_client;
  84        key->key.super.s_flags = sb->s_flags & NFS_MS_MASK;
  85        key->key.nfs_server.flags = nfss->flags;
  86        key->key.nfs_server.rsize = nfss->rsize;
  87        key->key.nfs_server.wsize = nfss->wsize;
  88        key->key.nfs_server.acregmin = nfss->acregmin;
  89        key->key.nfs_server.acregmax = nfss->acregmax;
  90        key->key.nfs_server.acdirmin = nfss->acdirmin;
  91        key->key.nfs_server.acdirmax = nfss->acdirmax;
  92        key->key.nfs_server.fsid = nfss->fsid;
  93        key->key.rpc_auth.au_flavor = nfss->client->cl_auth->au_flavor;
  94
  95        key->key.uniq_len = ulen;
  96        memcpy(key->key.uniquifier, uniq, ulen);
  97
  98        spin_lock(&nfs_fscache_keys_lock);
  99        p = &nfs_fscache_keys.rb_node;
 100        parent = NULL;
 101        while (*p) {
 102                parent = *p;
 103                xkey = rb_entry(parent, struct nfs_fscache_key, node);
 104
 105                if (key->nfs_client < xkey->nfs_client)
 106                        goto go_left;
 107                if (key->nfs_client > xkey->nfs_client)
 108                        goto go_right;
 109
 110                diff = memcmp(&key->key, &xkey->key, sizeof(key->key));
 111                if (diff < 0)
 112                        goto go_left;
 113                if (diff > 0)
 114                        goto go_right;
 115
 116                if (key->key.uniq_len == 0)
 117                        goto non_unique;
 118                diff = memcmp(key->key.uniquifier,
 119                              xkey->key.uniquifier,
 120                              key->key.uniq_len);
 121                if (diff < 0)
 122                        goto go_left;
 123                if (diff > 0)
 124                        goto go_right;
 125                goto non_unique;
 126
 127        go_left:
 128                p = &(*p)->rb_left;
 129                continue;
 130        go_right:
 131                p = &(*p)->rb_right;
 132        }
 133
 134        rb_link_node(&key->node, parent, p);
 135        rb_insert_color(&key->node, &nfs_fscache_keys);
 136        spin_unlock(&nfs_fscache_keys_lock);
 137        nfss->fscache_key = key;
 138
 139        /* create a cache index for looking up filehandles */
 140        nfss->fscache = fscache_acquire_cookie(nfss->nfs_client->fscache,
 141                                               &nfs_fscache_super_index_def,
 142                                               nfss);
 143        dfprintk(FSCACHE, "NFS: get superblock cookie (0x%p/0x%p)\n",
 144                 nfss, nfss->fscache);
 145        return;
 146
 147non_unique:
 148        spin_unlock(&nfs_fscache_keys_lock);
 149        kfree(key);
 150        nfss->fscache_key = NULL;
 151        nfss->fscache = NULL;
 152        printk(KERN_WARNING "NFS:"
 153               " Cache request denied due to non-unique superblock keys\n");
 154}
 155
 156/*
 157 * release a per-superblock cookie
 158 */
 159void nfs_fscache_release_super_cookie(struct super_block *sb)
 160{
 161        struct nfs_server *nfss = NFS_SB(sb);
 162
 163        dfprintk(FSCACHE, "NFS: releasing superblock cookie (0x%p/0x%p)\n",
 164                 nfss, nfss->fscache);
 165
 166        fscache_relinquish_cookie(nfss->fscache, 0);
 167        nfss->fscache = NULL;
 168
 169        if (nfss->fscache_key) {
 170                spin_lock(&nfs_fscache_keys_lock);
 171                rb_erase(&nfss->fscache_key->node, &nfs_fscache_keys);
 172                spin_unlock(&nfs_fscache_keys_lock);
 173                kfree(nfss->fscache_key);
 174                nfss->fscache_key = NULL;
 175        }
 176}
 177
 178/*
 179 * Initialise the per-inode cache cookie pointer for an NFS inode.
 180 */
 181void nfs_fscache_init_inode_cookie(struct inode *inode)
 182{
 183        NFS_I(inode)->fscache = NULL;
 184        if (S_ISREG(inode->i_mode))
 185                set_bit(NFS_INO_FSCACHE, &NFS_I(inode)->flags);
 186}
 187
 188/*
 189 * Get the per-inode cache cookie for an NFS inode.
 190 */
 191static void nfs_fscache_enable_inode_cookie(struct inode *inode)
 192{
 193        struct super_block *sb = inode->i_sb;
 194        struct nfs_inode *nfsi = NFS_I(inode);
 195
 196        if (nfsi->fscache || !NFS_FSCACHE(inode))
 197                return;
 198
 199        if ((NFS_SB(sb)->options & NFS_OPTION_FSCACHE)) {
 200                nfsi->fscache = fscache_acquire_cookie(
 201                        NFS_SB(sb)->fscache,
 202                        &nfs_fscache_inode_object_def,
 203                        nfsi);
 204
 205                dfprintk(FSCACHE, "NFS: get FH cookie (0x%p/0x%p/0x%p)\n",
 206                         sb, nfsi, nfsi->fscache);
 207        }
 208}
 209
 210/*
 211 * Release a per-inode cookie.
 212 */
 213void nfs_fscache_release_inode_cookie(struct inode *inode)
 214{
 215        struct nfs_inode *nfsi = NFS_I(inode);
 216
 217        dfprintk(FSCACHE, "NFS: clear cookie (0x%p/0x%p)\n",
 218                 nfsi, nfsi->fscache);
 219
 220        fscache_relinquish_cookie(nfsi->fscache, 0);
 221        nfsi->fscache = NULL;
 222}
 223
 224/*
 225 * Retire a per-inode cookie, destroying the data attached to it.
 226 */
 227void nfs_fscache_zap_inode_cookie(struct inode *inode)
 228{
 229        struct nfs_inode *nfsi = NFS_I(inode);
 230
 231        dfprintk(FSCACHE, "NFS: zapping cookie (0x%p/0x%p)\n",
 232                 nfsi, nfsi->fscache);
 233
 234        fscache_relinquish_cookie(nfsi->fscache, 1);
 235        nfsi->fscache = NULL;
 236}
 237
 238/*
 239 * Turn off the cache with regard to a per-inode cookie if opened for writing,
 240 * invalidating all the pages in the page cache relating to the associated
 241 * inode to clear the per-page caching.
 242 */
 243static void nfs_fscache_disable_inode_cookie(struct inode *inode)
 244{
 245        clear_bit(NFS_INO_FSCACHE, &NFS_I(inode)->flags);
 246
 247        if (NFS_I(inode)->fscache) {
 248                dfprintk(FSCACHE,
 249                         "NFS: nfsi 0x%p turning cache off\n", NFS_I(inode));
 250
 251                /* Need to uncache any pages attached to this inode that
 252                 * fscache knows about before turning off the cache.
 253                 */
 254                fscache_uncache_all_inode_pages(NFS_I(inode)->fscache, inode);
 255                nfs_fscache_zap_inode_cookie(inode);
 256        }
 257}
 258
 259/*
 260 * wait_on_bit() sleep function for uninterruptible waiting
 261 */
 262static int nfs_fscache_wait_bit(void *flags)
 263{
 264        schedule();
 265        return 0;
 266}
 267
 268/*
 269 * Lock against someone else trying to also acquire or relinquish a cookie
 270 */
 271static inline void nfs_fscache_inode_lock(struct inode *inode)
 272{
 273        struct nfs_inode *nfsi = NFS_I(inode);
 274
 275        while (test_and_set_bit(NFS_INO_FSCACHE_LOCK, &nfsi->flags))
 276                wait_on_bit(&nfsi->flags, NFS_INO_FSCACHE_LOCK,
 277                            nfs_fscache_wait_bit, TASK_UNINTERRUPTIBLE);
 278}
 279
 280/*
 281 * Unlock cookie management lock
 282 */
 283static inline void nfs_fscache_inode_unlock(struct inode *inode)
 284{
 285        struct nfs_inode *nfsi = NFS_I(inode);
 286
 287        smp_mb__before_clear_bit();
 288        clear_bit(NFS_INO_FSCACHE_LOCK, &nfsi->flags);
 289        smp_mb__after_clear_bit();
 290        wake_up_bit(&nfsi->flags, NFS_INO_FSCACHE_LOCK);
 291}
 292
 293/*
 294 * Decide if we should enable or disable local caching for this inode.
 295 * - For now, with NFS, only regular files that are open read-only will be able
 296 *   to use the cache.
 297 * - May be invoked multiple times in parallel by parallel nfs_open() functions.
 298 */
 299void nfs_fscache_set_inode_cookie(struct inode *inode, struct file *filp)
 300{
 301        if (NFS_FSCACHE(inode)) {
 302                nfs_fscache_inode_lock(inode);
 303                if ((filp->f_flags & O_ACCMODE) != O_RDONLY)
 304                        nfs_fscache_disable_inode_cookie(inode);
 305                else
 306                        nfs_fscache_enable_inode_cookie(inode);
 307                nfs_fscache_inode_unlock(inode);
 308        }
 309}
 310EXPORT_SYMBOL_GPL(nfs_fscache_set_inode_cookie);
 311
 312/*
 313 * Replace a per-inode cookie due to revalidation detecting a file having
 314 * changed on the server.
 315 */
 316void nfs_fscache_reset_inode_cookie(struct inode *inode)
 317{
 318        struct nfs_inode *nfsi = NFS_I(inode);
 319        struct nfs_server *nfss = NFS_SERVER(inode);
 320        NFS_IFDEBUG(struct fscache_cookie *old = nfsi->fscache);
 321
 322        nfs_fscache_inode_lock(inode);
 323        if (nfsi->fscache) {
 324                /* retire the current fscache cache and get a new one */
 325                fscache_relinquish_cookie(nfsi->fscache, 1);
 326
 327                nfsi->fscache = fscache_acquire_cookie(
 328                        nfss->nfs_client->fscache,
 329                        &nfs_fscache_inode_object_def,
 330                        nfsi);
 331
 332                dfprintk(FSCACHE,
 333                         "NFS: revalidation new cookie (0x%p/0x%p/0x%p/0x%p)\n",
 334                         nfss, nfsi, old, nfsi->fscache);
 335        }
 336        nfs_fscache_inode_unlock(inode);
 337}
 338
 339/*
 340 * Release the caching state associated with a page, if the page isn't busy
 341 * interacting with the cache.
 342 * - Returns true (can release page) or false (page busy).
 343 */
 344int nfs_fscache_release_page(struct page *page, gfp_t gfp)
 345{
 346        if (PageFsCache(page)) {
 347                struct nfs_inode *nfsi = NFS_I(page->mapping->host);
 348                struct fscache_cookie *cookie = nfsi->fscache;
 349
 350                BUG_ON(!cookie);
 351                dfprintk(FSCACHE, "NFS: fscache releasepage (0x%p/0x%p/0x%p)\n",
 352                         cookie, page, nfsi);
 353
 354                if (!fscache_maybe_release_page(cookie, page, gfp))
 355                        return 0;
 356
 357                nfs_add_fscache_stats(page->mapping->host,
 358                                      NFSIOS_FSCACHE_PAGES_UNCACHED, 1);
 359        }
 360
 361        return 1;
 362}
 363
 364/*
 365 * Release the caching state associated with a page if undergoing complete page
 366 * invalidation.
 367 */
 368void __nfs_fscache_invalidate_page(struct page *page, struct inode *inode)
 369{
 370        struct nfs_inode *nfsi = NFS_I(inode);
 371        struct fscache_cookie *cookie = nfsi->fscache;
 372
 373        BUG_ON(!cookie);
 374
 375        dfprintk(FSCACHE, "NFS: fscache invalidatepage (0x%p/0x%p/0x%p)\n",
 376                 cookie, page, nfsi);
 377
 378        fscache_wait_on_page_write(cookie, page);
 379
 380        BUG_ON(!PageLocked(page));
 381        fscache_uncache_page(cookie, page);
 382        nfs_add_fscache_stats(page->mapping->host,
 383                              NFSIOS_FSCACHE_PAGES_UNCACHED, 1);
 384}
 385
 386/*
 387 * Handle completion of a page being read from the cache.
 388 * - Called in process (keventd) context.
 389 */
 390static void nfs_readpage_from_fscache_complete(struct page *page,
 391                                               void *context,
 392                                               int error)
 393{
 394        dfprintk(FSCACHE,
 395                 "NFS: readpage_from_fscache_complete (0x%p/0x%p/%d)\n",
 396                 page, context, error);
 397
 398        /* if the read completes with an error, we just unlock the page and let
 399         * the VM reissue the readpage */
 400        if (!error) {
 401                SetPageUptodate(page);
 402                unlock_page(page);
 403        } else {
 404                error = nfs_readpage_async(context, page->mapping->host, page);
 405                if (error)
 406                        unlock_page(page);
 407        }
 408}
 409
 410/*
 411 * Retrieve a page from fscache
 412 */
 413int __nfs_readpage_from_fscache(struct nfs_open_context *ctx,
 414                                struct inode *inode, struct page *page)
 415{
 416        int ret;
 417
 418        dfprintk(FSCACHE,
 419                 "NFS: readpage_from_fscache(fsc:%p/p:%p(i:%lx f:%lx)/0x%p)\n",
 420                 NFS_I(inode)->fscache, page, page->index, page->flags, inode);
 421
 422        ret = fscache_read_or_alloc_page(NFS_I(inode)->fscache,
 423                                         page,
 424                                         nfs_readpage_from_fscache_complete,
 425                                         ctx,
 426                                         GFP_KERNEL);
 427
 428        switch (ret) {
 429        case 0: /* read BIO submitted (page in fscache) */
 430                dfprintk(FSCACHE,
 431                         "NFS:    readpage_from_fscache: BIO submitted\n");
 432                nfs_add_fscache_stats(inode, NFSIOS_FSCACHE_PAGES_READ_OK, 1);
 433                return ret;
 434
 435        case -ENOBUFS: /* inode not in cache */
 436        case -ENODATA: /* page not in cache */
 437                nfs_add_fscache_stats(inode, NFSIOS_FSCACHE_PAGES_READ_FAIL, 1);
 438                dfprintk(FSCACHE,
 439                         "NFS:    readpage_from_fscache %d\n", ret);
 440                return 1;
 441
 442        default:
 443                dfprintk(FSCACHE, "NFS:    readpage_from_fscache %d\n", ret);
 444                nfs_add_fscache_stats(inode, NFSIOS_FSCACHE_PAGES_READ_FAIL, 1);
 445        }
 446        return ret;
 447}
 448
 449/*
 450 * Retrieve a set of pages from fscache
 451 */
 452int __nfs_readpages_from_fscache(struct nfs_open_context *ctx,
 453                                 struct inode *inode,
 454                                 struct address_space *mapping,
 455                                 struct list_head *pages,
 456                                 unsigned *nr_pages)
 457{
 458        unsigned npages = *nr_pages;
 459        int ret;
 460
 461        dfprintk(FSCACHE, "NFS: nfs_getpages_from_fscache (0x%p/%u/0x%p)\n",
 462                 NFS_I(inode)->fscache, npages, inode);
 463
 464        ret = fscache_read_or_alloc_pages(NFS_I(inode)->fscache,
 465                                          mapping, pages, nr_pages,
 466                                          nfs_readpage_from_fscache_complete,
 467                                          ctx,
 468                                          mapping_gfp_mask(mapping));
 469        if (*nr_pages < npages)
 470                nfs_add_fscache_stats(inode, NFSIOS_FSCACHE_PAGES_READ_OK,
 471                                      npages);
 472        if (*nr_pages > 0)
 473                nfs_add_fscache_stats(inode, NFSIOS_FSCACHE_PAGES_READ_FAIL,
 474                                      *nr_pages);
 475
 476        switch (ret) {
 477        case 0: /* read submitted to the cache for all pages */
 478                BUG_ON(!list_empty(pages));
 479                BUG_ON(*nr_pages != 0);
 480                dfprintk(FSCACHE,
 481                         "NFS: nfs_getpages_from_fscache: submitted\n");
 482
 483                return ret;
 484
 485        case -ENOBUFS: /* some pages aren't cached and can't be */
 486        case -ENODATA: /* some pages aren't cached */
 487                dfprintk(FSCACHE,
 488                         "NFS: nfs_getpages_from_fscache: no page: %d\n", ret);
 489                return 1;
 490
 491        default:
 492                dfprintk(FSCACHE,
 493                         "NFS: nfs_getpages_from_fscache: ret  %d\n", ret);
 494        }
 495
 496        return ret;
 497}
 498
 499/*
 500 * Store a newly fetched page in fscache
 501 * - PG_fscache must be set on the page
 502 */
 503void __nfs_readpage_to_fscache(struct inode *inode, struct page *page, int sync)
 504{
 505        int ret;
 506
 507        dfprintk(FSCACHE,
 508                 "NFS: readpage_to_fscache(fsc:%p/p:%p(i:%lx f:%lx)/%d)\n",
 509                 NFS_I(inode)->fscache, page, page->index, page->flags, sync);
 510
 511        ret = fscache_write_page(NFS_I(inode)->fscache, page, GFP_KERNEL);
 512        dfprintk(FSCACHE,
 513                 "NFS:     readpage_to_fscache: p:%p(i:%lu f:%lx) ret %d\n",
 514                 page, page->index, page->flags, ret);
 515
 516        if (ret != 0) {
 517                fscache_uncache_page(NFS_I(inode)->fscache, page);
 518                nfs_add_fscache_stats(inode,
 519                                      NFSIOS_FSCACHE_PAGES_WRITTEN_FAIL, 1);
 520                nfs_add_fscache_stats(inode, NFSIOS_FSCACHE_PAGES_UNCACHED, 1);
 521        } else {
 522                nfs_add_fscache_stats(inode,
 523                                      NFSIOS_FSCACHE_PAGES_WRITTEN_OK, 1);
 524        }
 525}
 526