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}
 310
 311/*
 312 * Replace a per-inode cookie due to revalidation detecting a file having
 313 * changed on the server.
 314 */
 315void nfs_fscache_reset_inode_cookie(struct inode *inode)
 316{
 317        struct nfs_inode *nfsi = NFS_I(inode);
 318        struct nfs_server *nfss = NFS_SERVER(inode);
 319        NFS_IFDEBUG(struct fscache_cookie *old = nfsi->fscache);
 320
 321        nfs_fscache_inode_lock(inode);
 322        if (nfsi->fscache) {
 323                /* retire the current fscache cache and get a new one */
 324                fscache_relinquish_cookie(nfsi->fscache, 1);
 325
 326                nfsi->fscache = fscache_acquire_cookie(
 327                        nfss->nfs_client->fscache,
 328                        &nfs_fscache_inode_object_def,
 329                        nfsi);
 330
 331                dfprintk(FSCACHE,
 332                         "NFS: revalidation new cookie (0x%p/0x%p/0x%p/0x%p)\n",
 333                         nfss, nfsi, old, nfsi->fscache);
 334        }
 335        nfs_fscache_inode_unlock(inode);
 336}
 337
 338/*
 339 * Release the caching state associated with a page, if the page isn't busy
 340 * interacting with the cache.
 341 * - Returns true (can release page) or false (page busy).
 342 */
 343int nfs_fscache_release_page(struct page *page, gfp_t gfp)
 344{
 345        if (PageFsCache(page)) {
 346                struct nfs_inode *nfsi = NFS_I(page->mapping->host);
 347                struct fscache_cookie *cookie = nfsi->fscache;
 348
 349                BUG_ON(!cookie);
 350                dfprintk(FSCACHE, "NFS: fscache releasepage (0x%p/0x%p/0x%p)\n",
 351                         cookie, page, nfsi);
 352
 353                if (!fscache_maybe_release_page(cookie, page, gfp))
 354                        return 0;
 355
 356                nfs_add_fscache_stats(page->mapping->host,
 357                                      NFSIOS_FSCACHE_PAGES_UNCACHED, 1);
 358        }
 359
 360        return 1;
 361}
 362
 363/*
 364 * Release the caching state associated with a page if undergoing complete page
 365 * invalidation.
 366 */
 367void __nfs_fscache_invalidate_page(struct page *page, struct inode *inode)
 368{
 369        struct nfs_inode *nfsi = NFS_I(inode);
 370        struct fscache_cookie *cookie = nfsi->fscache;
 371
 372        BUG_ON(!cookie);
 373
 374        dfprintk(FSCACHE, "NFS: fscache invalidatepage (0x%p/0x%p/0x%p)\n",
 375                 cookie, page, nfsi);
 376
 377        fscache_wait_on_page_write(cookie, page);
 378
 379        BUG_ON(!PageLocked(page));
 380        fscache_uncache_page(cookie, page);
 381        nfs_add_fscache_stats(page->mapping->host,
 382                              NFSIOS_FSCACHE_PAGES_UNCACHED, 1);
 383}
 384
 385/*
 386 * Handle completion of a page being read from the cache.
 387 * - Called in process (keventd) context.
 388 */
 389static void nfs_readpage_from_fscache_complete(struct page *page,
 390                                               void *context,
 391                                               int error)
 392{
 393        dfprintk(FSCACHE,
 394                 "NFS: readpage_from_fscache_complete (0x%p/0x%p/%d)\n",
 395                 page, context, error);
 396
 397        /* if the read completes with an error, we just unlock the page and let
 398         * the VM reissue the readpage */
 399        if (!error) {
 400                SetPageUptodate(page);
 401                unlock_page(page);
 402        } else {
 403                error = nfs_readpage_async(context, page->mapping->host, page);
 404                if (error)
 405                        unlock_page(page);
 406        }
 407}
 408
 409/*
 410 * Retrieve a page from fscache
 411 */
 412int __nfs_readpage_from_fscache(struct nfs_open_context *ctx,
 413                                struct inode *inode, struct page *page)
 414{
 415        int ret;
 416
 417        dfprintk(FSCACHE,
 418                 "NFS: readpage_from_fscache(fsc:%p/p:%p(i:%lx f:%lx)/0x%p)\n",
 419                 NFS_I(inode)->fscache, page, page->index, page->flags, inode);
 420
 421        ret = fscache_read_or_alloc_page(NFS_I(inode)->fscache,
 422                                         page,
 423                                         nfs_readpage_from_fscache_complete,
 424                                         ctx,
 425                                         GFP_KERNEL);
 426
 427        switch (ret) {
 428        case 0: /* read BIO submitted (page in fscache) */
 429                dfprintk(FSCACHE,
 430                         "NFS:    readpage_from_fscache: BIO submitted\n");
 431                nfs_add_fscache_stats(inode, NFSIOS_FSCACHE_PAGES_READ_OK, 1);
 432                return ret;
 433
 434        case -ENOBUFS: /* inode not in cache */
 435        case -ENODATA: /* page not in cache */
 436                nfs_add_fscache_stats(inode, NFSIOS_FSCACHE_PAGES_READ_FAIL, 1);
 437                dfprintk(FSCACHE,
 438                         "NFS:    readpage_from_fscache %d\n", ret);
 439                return 1;
 440
 441        default:
 442                dfprintk(FSCACHE, "NFS:    readpage_from_fscache %d\n", ret);
 443                nfs_add_fscache_stats(inode, NFSIOS_FSCACHE_PAGES_READ_FAIL, 1);
 444        }
 445        return ret;
 446}
 447
 448/*
 449 * Retrieve a set of pages from fscache
 450 */
 451int __nfs_readpages_from_fscache(struct nfs_open_context *ctx,
 452                                 struct inode *inode,
 453                                 struct address_space *mapping,
 454                                 struct list_head *pages,
 455                                 unsigned *nr_pages)
 456{
 457        unsigned npages = *nr_pages;
 458        int ret;
 459
 460        dfprintk(FSCACHE, "NFS: nfs_getpages_from_fscache (0x%p/%u/0x%p)\n",
 461                 NFS_I(inode)->fscache, npages, inode);
 462
 463        ret = fscache_read_or_alloc_pages(NFS_I(inode)->fscache,
 464                                          mapping, pages, nr_pages,
 465                                          nfs_readpage_from_fscache_complete,
 466                                          ctx,
 467                                          mapping_gfp_mask(mapping));
 468        if (*nr_pages < npages)
 469                nfs_add_fscache_stats(inode, NFSIOS_FSCACHE_PAGES_READ_OK,
 470                                      npages);
 471        if (*nr_pages > 0)
 472                nfs_add_fscache_stats(inode, NFSIOS_FSCACHE_PAGES_READ_FAIL,
 473                                      *nr_pages);
 474
 475        switch (ret) {
 476        case 0: /* read submitted to the cache for all pages */
 477                BUG_ON(!list_empty(pages));
 478                BUG_ON(*nr_pages != 0);
 479                dfprintk(FSCACHE,
 480                         "NFS: nfs_getpages_from_fscache: submitted\n");
 481
 482                return ret;
 483
 484        case -ENOBUFS: /* some pages aren't cached and can't be */
 485        case -ENODATA: /* some pages aren't cached */
 486                dfprintk(FSCACHE,
 487                         "NFS: nfs_getpages_from_fscache: no page: %d\n", ret);
 488                return 1;
 489
 490        default:
 491                dfprintk(FSCACHE,
 492                         "NFS: nfs_getpages_from_fscache: ret  %d\n", ret);
 493        }
 494
 495        return ret;
 496}
 497
 498/*
 499 * Store a newly fetched page in fscache
 500 * - PG_fscache must be set on the page
 501 */
 502void __nfs_readpage_to_fscache(struct inode *inode, struct page *page, int sync)
 503{
 504        int ret;
 505
 506        dfprintk(FSCACHE,
 507                 "NFS: readpage_to_fscache(fsc:%p/p:%p(i:%lx f:%lx)/%d)\n",
 508                 NFS_I(inode)->fscache, page, page->index, page->flags, sync);
 509
 510        ret = fscache_write_page(NFS_I(inode)->fscache, page, GFP_KERNEL);
 511        dfprintk(FSCACHE,
 512                 "NFS:     readpage_to_fscache: p:%p(i:%lu f:%lx) ret %d\n",
 513                 page, page->index, page->flags, ret);
 514
 515        if (ret != 0) {
 516                fscache_uncache_page(NFS_I(inode)->fscache, page);
 517                nfs_add_fscache_stats(inode,
 518                                      NFSIOS_FSCACHE_PAGES_WRITTEN_FAIL, 1);
 519                nfs_add_fscache_stats(inode, NFSIOS_FSCACHE_PAGES_UNCACHED, 1);
 520        } else {
 521                nfs_add_fscache_stats(inode,
 522                                      NFSIOS_FSCACHE_PAGES_WRITTEN_OK, 1);
 523        }
 524}
 525
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.