Updated NFS client to reflect CacheFS Spilt
Subsystems (3)
PATCH 1/1 Updated NFS client to reflect CacheFS Spilt
Hey Trond,
Attached is a patch that changes all of the names from cachefs to fscache to reflect the recent CacheFS split. It also moves the nfs_invalidatepage(), nfs_releasepage(), and nfs_mkwrite() routines from file.c into read.c per your request....
Signed-off-by Steve Dickson <[email protected]>
include/linux/nfs_fs.h renamed from include/linux/nfs_fs.h.orig +5 -0
@@ -30,6 +30,7 @@#include <linux/nfs_xdr.h> #include <linux/rwsem.h> #include <linux/workqueue.h> +#include <linux/fscache.h> /* * Enable debugging support for nfs client.
@@ -189,6 +190,10 @@ struct nfs_inode {struct rw_semaphore rwsem;#endif /* CONFIG_NFS_V4*/ +#ifdef CONFIG_NFS_FSCACHE +struct fscache_cookie *fscache; +#endif +struct inode vfs_inode; };
include/linux/nfs_fs_sb.h renamed from include/linux/nfs_fs_sb.h.orig +5 -0
@@ -3,6 +3,7 @@#include <linux/list.h> #include <linux/backing-dev.h> +#include <linux/fscache.h> /* * NFS client parameters stored in the superblock.
@@ -46,6 +47,10 @@ struct nfs_server {that are supported on this filesystem */ #endif + +#ifdef CONFIG_NFS_FSCACHE +struct fscache_cookie *fscache;/* cache cookie */ +#endif };/* Server capabilities */
include/linux/nfs_mount.h renamed from include/linux/nfs_mount.h.orig +1 -0
@@ -60,6 +60,7 @@ struct nfs_mount_data {#define NFS_MOUNT_BROKEN_SUID 0x0400/* 4 */ #define NFS_MOUNT_STRICTLOCK 0x1000/* reserved for NFSv4 */ #define NFS_MOUNT_SECFLAVOUR 0x2000/* 5 */ +#define NFS_MOUNT_FSCACHE NFS_MOUNT_POSIX#define NFS_MOUNT_FLAGMASK 0xFFFF#endif
fs/nfs/file.c renamed from fs/nfs/file.c.orig +13 -0
@@ -27,9 +27,11 @@#include <linux/slab.h> #include <linux/pagemap.h> #include <linux/smp_lock.h> +#include <linux/buffer_head.h> #include <asm/uaccess.h> #include <asm/system.h> +#include "nfs-fscache.h" #include "delegation.h"
@@ -240,6 +242,11 @@ static int nfs_commit_write(struct filereturn status; } +/* +* since we use page->private for our own nefarious purposes when using fscache, we have to +* override extra address space ops to prevent fs/buffer.c from getting confused, even though we +* may not have asked its opinion +*/ struct address_space_operations nfs_file_aops = { .readpage = nfs_readpage, .readpages = nfs_readpages,
@@ -251,6 +258,12 @@ struct address_space_operations nfs_file#ifdef CONFIG_NFS_DIRECTIO .direct_IO = nfs_direct_IO,#endif +#ifdef CONFIG_NFS_FSCACHE + .sync_page = block_sync_page, + .releasepage = nfs_releasepage, + .invalidatepage = nfs_invalidatepage, + .page_mkwrite = nfs_mkwrite, +#endif };/*
fs/nfs/inode.c renamed from fs/nfs/inode.c.orig +108 -2
194 lines not on this page · raw message
fs/nfs/Makefile renamed from fs/nfs/Makefile.orig +1 -0
@@ -12,4 +12,5 @@ nfs-$(CONFIG_NFS_V4) += nfs4proc.o nfs4x delegation.o idmap.o \ callback.o callback_xdr.o callback_proc.o nfs-$(CONFIG_NFS_DIRECTIO) += direct.o +nfs-$(CONFIG_NFS_FSCACHE) += nfs-fscache.o nfs-objs := $(nfs-y)
fs/nfs/nfs-fscache.c new file +204 -0
204 lines not on this page · raw message
fs/nfs/nfs-fscache.h new file +31 -0
@@ -0,0 +1,31 @@ +/* nfs-fscache.h: NFS filesystem cache interface definitions +* +* Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. +* Written by David Howells ([email protected]) +* +* 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. +*/ + +#ifndef _NFS_FSCACHE_H +#define _NFS_FSCACHE_H + +#include <linux/fscache.h> + +#ifdef CONFIG_NFS_FSCACHE +#ifndef CONFIG_FSCACHE +#error "CONFIG_NFS_FSCACHE is defined but not CONFIG_FSCACHE" +#endif + +extern struct fscache_netfs nfs_cache_netfs; +extern struct fscache_index_def nfs_cache_server_index_def; +extern struct fscache_index_def nfs_cache_fh_index_def; + +extern int nfs_invalidatepage (struct page *,unsigned long ); +extern int nfs_releasepage (struct page *,int ); +extern int nfs_mkwrite (struct page *); + +#endif +#endif /* _NFS_FSCACHE_H */
fs/nfs/read.c renamed from fs/nfs/read.c.orig +190 -1
236 lines not on this page · raw message
fs/nfs/write.c renamed from fs/nfs/write.c.orig +37 -0
@@ -273,6 +273,38 @@ static int wb_priority(struct writeback_ }/* +* store an updated page in fscache +*/ +#ifdef CONFIG_NFS_FSCACHE +static void +nfs_writepage_to_fscache_complete (void *cookie_data,struct page *page,void *data,int error) +{ +/* really need to synchronise the end of writeback, probably using a page flag */ +} +static inline void +nfs_writepage_to_fscache (struct inode *inode,struct page *page) +{ +int ret; + +dprintk ("NFS: writepage_to_fscache (0x%p/0x%p/0x%p)\n" , +NFS_I (inode)->fscache, page, inode); + + ret =fscache_write_page (NFS_I (inode)->fscache, page, + nfs_writepage_to_fscache_complete,NULL ,GFP_KERNEL ); +if (ret !=0 ) { +dprintk ("NFS: fscache_write_page error %d\n" , ret); +fscache_uncache_page (NFS_I (inode)->fscache, page); + } +} +#else +static inline void +nfs_writepage_to_fscache (struct inode *inode,struct page *page) +{ +BUG (); +} +#endif + +/* * Write an mmapped page to the server. */ int nfs_writepage (struct page *page,struct writeback_control *wbc)
@@ -317,6 +349,10 @@ do_it: err = -EBADF ; goto out; } + +if (NFS_SERVER (inode)->flags &NFS_MOUNT_FSCACHE ) +nfs_writepage_to_fscache (inode, page); +lock_kernel ();if (!IS_SYNC (inode) && inode_referenced) { err =nfs_writepage_async (ctx, inode, page,0 , offset);
@@ -1322,6 +1358,7 @@ nfs_commit_done(struct rpc_task *task) (long long )NFS_FILEID (req->wb_context->dentry->d_inode), req->wb_bytes, (long long)req_offset(req)); +if (task->tk_status <0 ) { req->wb_context->error = task->tk_status;nfs_inode_remove_request (req);
fs/Kconfig renamed from fs/Kconfig.orig +7 -0
@@ -1493,6 +1493,13 @@ config NFS_V4 If unsure, say N. +config NFS_FSCACHE + bool "Provide NFS client caching support" + depends on NFS_FS && FSCACHE && EXPERIMENTAL + help + Say Y here if you want NFS data to be cached locally on disc through + the general filesystem cache manager + config NFS_DIRECTIO bool "Allow direct I/O on NFS files (EXPERIMENTAL)" depends on NFS_FS && EXPERIMENTAL