NFS using FScache for 2.6.9-rc4-mm1 kernel
Subsystems (3)
PATCH 1/1 NFS using FScache for 2.6.9-rc4-mm1 kernel
Here is the 2.6.9-rc4-mm1 patch that will enable NFS to use FScache (formally know as CacheFS). Notable changes:
1) Moved some code around into different source files per Trond's request.
2) Found and fixed some problems in the filehandle matching code.
3) Added NFS4 support, which was really no big deal since all that was needed was to move some code around and fix some compile errors.
4) Added the NFS_MOUNT_FSCACHE and NFS4_MOUNT_FSCACHE
mounting options. This means a fscache enabled mount command will be need to enable NFS to used the fscache. For now, the util-linux patch, source rpm and binary rpm can be found at:
http://people.redhat.com/steved/fscache/util-linux/
Unless there is some objection, I would like to propose this patch to be included Andrew Morton's -mm tree, since the code (seems to be) becoming fairly solid.
SteveD.
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 0x3000#define NFS_MOUNT_FLAGMASK 0xFFFF#endif
include/linux/nfs4_mount.h renamed from include/linux/nfs4_mount.h.orig +1 -0
@@ -65,6 +65,7 @@ struct nfs4_mount_data {#define NFS4_MOUNT_NOCTO 0x0010/* 1 */ #define NFS4_MOUNT_NOAC 0x0020/* 1 */ #define NFS4_MOUNT_STRICTLOCK 0x1000/* 1 */ +#define NFS4_MOUNT_FSCACHE 0x2000/* 1 */ #define NFS4_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 +109 -1
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 +191 -0
191 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
--
Linux-cachefs mailing list
[email protected]
http://www.redhat.com/mailman/listinfo/linux-cachefs
PATCH 1/1 NFS using FScache for 2.6.9-rc4-mm1 kernel (Update)
Quoted 12 lines · Steve Dickson
Here is the 2.6.9-rc4-mm1 patch that will enable NFS to use FScache (formally know as CacheFS). Notable changes:
1) Moved some code around into different source files per Trond's request.
2) Found and fixed some problems in the filehandle matching code.
3) Added NFS4 support, which was really no big deal since all that was needed was to move some code around and fix some compile errors.
Quoted 7 lines
4) Added the
NFS_MOUNT_FSCACHEandNFS4_MOUNT_FSCACHEmounting options. This means a fscache enabled mount command will be need to enable NFS to used the fscache. For now, the
util-linux
patch, source rpm and binary rpm can be found at:
http://people.redhat.com/steved/fscache/util-linux/
Here is an updated to the above patch that removes a majority all of the #ifdef CONFIG_NFS_FSCACHE which definitely cleans things up nicely....
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 0x3000#define NFS_MOUNT_FLAGMASK 0xFFFF#endif
include/linux/nfs4_mount.h renamed from include/linux/nfs4_mount.h.orig +1 -0
@@ -65,6 +65,7 @@ struct nfs4_mount_data {#define NFS4_MOUNT_NOCTO 0x0010/* 1 */ #define NFS4_MOUNT_NOAC 0x0020/* 1 */ #define NFS4_MOUNT_STRICTLOCK 0x1000/* 1 */ +#define NFS4_MOUNT_FSCACHE 0x2000/* 1 */ #define NFS4_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 +43 -1
128 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 +191 -0
191 lines not on this page · raw message
fs/nfs/nfs-fscache.h new file +145 -0
145 lines not on this page · raw message
fs/nfs/read.c renamed from fs/nfs/read.c.orig +191 -1
237 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
--
Linux-cachefs mailing list
[email protected]
http://www.redhat.com/mailman/listinfo/linux-cachefs