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