lkml.org 
[lkml]   [2009]   [Apr]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 39/41] NFS: Store pages from an NFS inode into a local cache [ver #48]
    Date
    Store pages from an NFS inode into the cache data storage object associated
    with that inode.

    Signed-off-by: David Howells <dhowells@redhat.com>
    Acked-by: Steve Dickson <steved@redhat.com>
    Acked-by: Trond Myklebust <Trond.Myklebust@netapp.com>
    Acked-by: Al Viro <viro@zeniv.linux.org.uk>
    Tested-by: Daire Byrne <Daire.Byrne@framestore.com>
    ---

    fs/nfs/fscache.c | 28 ++++++++++++++++++++++++++++
    fs/nfs/fscache.h | 16 ++++++++++++++++
    fs/nfs/read.c | 5 +++++
    3 files changed, 49 insertions(+), 0 deletions(-)


    diff --git a/fs/nfs/fscache.c b/fs/nfs/fscache.c
    index 3a30566..379be67 100644
    --- a/fs/nfs/fscache.c
    +++ b/fs/nfs/fscache.c
    @@ -493,3 +493,31 @@ int __nfs_readpages_from_fscache(struct nfs_open_context *ctx,

    return ret;
    }
    +
    +/*
    + * Store a newly fetched page in fscache
    + * - PG_fscache must be set on the page
    + */
    +void __nfs_readpage_to_fscache(struct inode *inode, struct page *page, int sync)
    +{
    + int ret;
    +
    + dfprintk(FSCACHE,
    + "NFS: readpage_to_fscache(fsc:%p/p:%p(i:%lx f:%lx)/%d)\n",
    + NFS_I(inode)->fscache, page, page->index, page->flags, sync);
    +
    + ret = fscache_write_page(NFS_I(inode)->fscache, page, GFP_KERNEL);
    + dfprintk(FSCACHE,
    + "NFS: readpage_to_fscache: p:%p(i:%lu f:%lx) ret %d\n",
    + page, page->index, page->flags, ret);
    +
    + if (ret != 0) {
    + fscache_uncache_page(NFS_I(inode)->fscache, page);
    + nfs_add_fscache_stats(inode,
    + NFSIOS_FSCACHE_PAGES_WRITTEN_FAIL, 1);
    + nfs_add_fscache_stats(inode, NFSIOS_FSCACHE_PAGES_UNCACHED, 1);
    + } else {
    + nfs_add_fscache_stats(inode,
    + NFSIOS_FSCACHE_PAGES_WRITTEN_OK, 1);
    + }
    +}
    diff --git a/fs/nfs/fscache.h b/fs/nfs/fscache.h
    index 099349c..1ec3ebb 100644
    --- a/fs/nfs/fscache.h
    +++ b/fs/nfs/fscache.h
    @@ -91,6 +91,7 @@ extern int __nfs_readpage_from_fscache(struct nfs_open_context *,
    extern int __nfs_readpages_from_fscache(struct nfs_open_context *,
    struct inode *, struct address_space *,
    struct list_head *, unsigned *);
    +extern void __nfs_readpage_to_fscache(struct inode *, struct page *, int);

    /*
    * wait for a page to complete writing to the cache
    @@ -140,6 +141,19 @@ static inline int nfs_readpages_from_fscache(struct nfs_open_context *ctx,
    return -ENOBUFS;
    }

    +/*
    + * Store a page newly fetched from the server in an inode data storage object
    + * in the cache.
    + */
    +static inline void nfs_readpage_to_fscache(struct inode *inode,
    + struct page *page,
    + int sync)
    +{
    + if (PageFsCache(page))
    + __nfs_readpage_to_fscache(inode, page, sync);
    +}
    +
    +
    #else /* CONFIG_NFS_FSCACHE */
    static inline int nfs_fscache_register(void) { return 0; }
    static inline void nfs_fscache_unregister(void) {}
    @@ -184,6 +198,8 @@ static inline int nfs_readpages_from_fscache(struct nfs_open_context *ctx,
    {
    return -ENOBUFS;
    }
    +static inline void nfs_readpage_to_fscache(struct inode *inode,
    + struct page *page, int sync) {}

    #endif /* CONFIG_NFS_FSCACHE */
    #endif /* _NFS_FSCACHE_H */
    diff --git a/fs/nfs/read.c b/fs/nfs/read.c
    index e18ba79..4ace3c5 100644
    --- a/fs/nfs/read.c
    +++ b/fs/nfs/read.c
    @@ -140,6 +140,11 @@ int nfs_readpage_async(struct nfs_open_context *ctx, struct inode *inode,

    static void nfs_readpage_release(struct nfs_page *req)
    {
    + struct inode *d_inode = req->wb_context->path.dentry->d_inode;
    +
    + if (PageUptodate(req->wb_page))
    + nfs_readpage_to_fscache(d_inode, req->wb_page, 0);
    +
    unlock_page(req->wb_page);

    dprintk("NFS: read done (%s/%Ld %d@%Ld)\n",


    \
     
     \ /
      Last update: 2009-04-03 18:17    [W:0.033 / U:61.048 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site