Commit 88a4d7bd authored by Dave Wysochanski's avatar Dave Wysochanski Committed by Anna Schumaker

NFS: Configure support for netfs when NFS fscache is configured

As first steps for support of the netfs library when NFS_FSCACHE is
configured, add NETFS_SUPPORT to Kconfig and add the required netfs_inode
into struct nfs_inode.

Using netfs requires we move the VFS inode structure to be stored
inside struct netfs_inode, along with the fscache_cookie.
Thus, if NFS_FSCACHE is configured, place netfs_inode inside an
anonymous union so the vfs_inode memory is the same and we do
not need to modify other non-fscache areas of NFS.
In addition, inside the NFS fscache code, use the new helpers,
netfs_inode() and netfs_i_cookie() helpers, and remove our own
helper, nfs_i_fscache().

Later patches will convert NFS fscache to fully use netfs.
Signed-off-by: default avatarDave Wysochanski <dwysocha@redhat.com>
Tested-by: default avatarDaire Byrne <daire@dneg.com>
Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
parent 01c3a400
...@@ -170,6 +170,7 @@ config ROOT_NFS ...@@ -170,6 +170,7 @@ config ROOT_NFS
config NFS_FSCACHE config NFS_FSCACHE
bool "Provide NFS client caching support" bool "Provide NFS client caching support"
depends on NFS_FS=m && FSCACHE || NFS_FS=y && FSCACHE=y depends on NFS_FS=m && FSCACHE || NFS_FS=y && FSCACHE=y
select NETFS_SUPPORT
help help
Say Y here if you want NFS data to be cached locally on disc through Say Y here if you want NFS data to be cached locally on disc through
the general filesystem cache manager the general filesystem cache manager
......
...@@ -163,13 +163,14 @@ void nfs_fscache_init_inode(struct inode *inode) ...@@ -163,13 +163,14 @@ void nfs_fscache_init_inode(struct inode *inode)
struct nfs_server *nfss = NFS_SERVER(inode); struct nfs_server *nfss = NFS_SERVER(inode);
struct nfs_inode *nfsi = NFS_I(inode); struct nfs_inode *nfsi = NFS_I(inode);
nfsi->fscache = NULL; netfs_inode(inode)->cache = NULL;
if (!(nfss->fscache && S_ISREG(inode->i_mode))) if (!(nfss->fscache && S_ISREG(inode->i_mode)))
return; return;
nfs_fscache_update_auxdata(&auxdata, inode); nfs_fscache_update_auxdata(&auxdata, inode);
nfsi->fscache = fscache_acquire_cookie(NFS_SB(inode->i_sb)->fscache, netfs_inode(inode)->cache = fscache_acquire_cookie(
nfss->fscache,
0, 0,
nfsi->fh.data, /* index_key */ nfsi->fh.data, /* index_key */
nfsi->fh.size, nfsi->fh.size,
...@@ -183,11 +184,8 @@ void nfs_fscache_init_inode(struct inode *inode) ...@@ -183,11 +184,8 @@ void nfs_fscache_init_inode(struct inode *inode)
*/ */
void nfs_fscache_clear_inode(struct inode *inode) void nfs_fscache_clear_inode(struct inode *inode)
{ {
struct nfs_inode *nfsi = NFS_I(inode); fscache_relinquish_cookie(netfs_i_cookie(netfs_inode(inode)), false);
struct fscache_cookie *cookie = nfs_i_fscache(inode); netfs_inode(inode)->cache = NULL;
fscache_relinquish_cookie(cookie, false);
nfsi->fscache = NULL;
} }
/* /*
...@@ -212,7 +210,7 @@ void nfs_fscache_clear_inode(struct inode *inode) ...@@ -212,7 +210,7 @@ void nfs_fscache_clear_inode(struct inode *inode)
void nfs_fscache_open_file(struct inode *inode, struct file *filp) void nfs_fscache_open_file(struct inode *inode, struct file *filp)
{ {
struct nfs_fscache_inode_auxdata auxdata; struct nfs_fscache_inode_auxdata auxdata;
struct fscache_cookie *cookie = nfs_i_fscache(inode); struct fscache_cookie *cookie = netfs_i_cookie(netfs_inode(inode));
bool open_for_write = inode_is_open_for_write(inode); bool open_for_write = inode_is_open_for_write(inode);
if (!fscache_cookie_valid(cookie)) if (!fscache_cookie_valid(cookie))
...@@ -230,7 +228,7 @@ EXPORT_SYMBOL_GPL(nfs_fscache_open_file); ...@@ -230,7 +228,7 @@ EXPORT_SYMBOL_GPL(nfs_fscache_open_file);
void nfs_fscache_release_file(struct inode *inode, struct file *filp) void nfs_fscache_release_file(struct inode *inode, struct file *filp)
{ {
struct nfs_fscache_inode_auxdata auxdata; struct nfs_fscache_inode_auxdata auxdata;
struct fscache_cookie *cookie = nfs_i_fscache(inode); struct fscache_cookie *cookie = netfs_i_cookie(netfs_inode(inode));
loff_t i_size = i_size_read(inode); loff_t i_size = i_size_read(inode);
nfs_fscache_update_auxdata(&auxdata, inode); nfs_fscache_update_auxdata(&auxdata, inode);
...@@ -243,7 +241,7 @@ void nfs_fscache_release_file(struct inode *inode, struct file *filp) ...@@ -243,7 +241,7 @@ void nfs_fscache_release_file(struct inode *inode, struct file *filp)
static int fscache_fallback_read_page(struct inode *inode, struct page *page) static int fscache_fallback_read_page(struct inode *inode, struct page *page)
{ {
struct netfs_cache_resources cres; struct netfs_cache_resources cres;
struct fscache_cookie *cookie = nfs_i_fscache(inode); struct fscache_cookie *cookie = netfs_i_cookie(&NFS_I(inode)->netfs);
struct iov_iter iter; struct iov_iter iter;
struct bio_vec bvec; struct bio_vec bvec;
int ret; int ret;
...@@ -269,7 +267,7 @@ static int fscache_fallback_write_page(struct inode *inode, struct page *page, ...@@ -269,7 +267,7 @@ static int fscache_fallback_write_page(struct inode *inode, struct page *page,
bool no_space_allocated_yet) bool no_space_allocated_yet)
{ {
struct netfs_cache_resources cres; struct netfs_cache_resources cres;
struct fscache_cookie *cookie = nfs_i_fscache(inode); struct fscache_cookie *cookie = netfs_i_cookie(&NFS_I(inode)->netfs);
struct iov_iter iter; struct iov_iter iter;
struct bio_vec bvec; struct bio_vec bvec;
loff_t start = page_offset(page); loff_t start = page_offset(page);
......
...@@ -54,7 +54,7 @@ static inline bool nfs_fscache_release_folio(struct folio *folio, gfp_t gfp) ...@@ -54,7 +54,7 @@ static inline bool nfs_fscache_release_folio(struct folio *folio, gfp_t gfp)
if (current_is_kswapd() || !(gfp & __GFP_FS)) if (current_is_kswapd() || !(gfp & __GFP_FS))
return false; return false;
folio_wait_fscache(folio); folio_wait_fscache(folio);
fscache_note_page_release(nfs_i_fscache(folio->mapping->host)); fscache_note_page_release(netfs_i_cookie(&NFS_I(folio->mapping->host)->netfs));
nfs_inc_fscache_stats(folio->mapping->host, nfs_inc_fscache_stats(folio->mapping->host,
NFSIOS_FSCACHE_PAGES_UNCACHED); NFSIOS_FSCACHE_PAGES_UNCACHED);
} }
...@@ -66,7 +66,7 @@ static inline bool nfs_fscache_release_folio(struct folio *folio, gfp_t gfp) ...@@ -66,7 +66,7 @@ static inline bool nfs_fscache_release_folio(struct folio *folio, gfp_t gfp)
*/ */
static inline int nfs_fscache_read_page(struct inode *inode, struct page *page) static inline int nfs_fscache_read_page(struct inode *inode, struct page *page)
{ {
if (nfs_i_fscache(inode)) if (netfs_inode(inode)->cache)
return __nfs_fscache_read_page(inode, page); return __nfs_fscache_read_page(inode, page);
return -ENOBUFS; return -ENOBUFS;
} }
...@@ -78,7 +78,7 @@ static inline int nfs_fscache_read_page(struct inode *inode, struct page *page) ...@@ -78,7 +78,7 @@ static inline int nfs_fscache_read_page(struct inode *inode, struct page *page)
static inline void nfs_fscache_write_page(struct inode *inode, static inline void nfs_fscache_write_page(struct inode *inode,
struct page *page) struct page *page)
{ {
if (nfs_i_fscache(inode)) if (netfs_inode(inode)->cache)
__nfs_fscache_write_page(inode, page); __nfs_fscache_write_page(inode, page);
} }
...@@ -101,13 +101,10 @@ static inline void nfs_fscache_update_auxdata(struct nfs_fscache_inode_auxdata * ...@@ -101,13 +101,10 @@ static inline void nfs_fscache_update_auxdata(struct nfs_fscache_inode_auxdata *
static inline void nfs_fscache_invalidate(struct inode *inode, int flags) static inline void nfs_fscache_invalidate(struct inode *inode, int flags)
{ {
struct nfs_fscache_inode_auxdata auxdata; struct nfs_fscache_inode_auxdata auxdata;
struct nfs_inode *nfsi = NFS_I(inode); struct fscache_cookie *cookie = netfs_i_cookie(&NFS_I(inode)->netfs);
if (nfsi->fscache) { nfs_fscache_update_auxdata(&auxdata, inode);
nfs_fscache_update_auxdata(&auxdata, inode); fscache_invalidate(cookie, &auxdata, i_size_read(inode), flags);
fscache_invalidate(nfsi->fscache, &auxdata,
i_size_read(inode), flags);
}
} }
/* /*
......
...@@ -31,6 +31,10 @@ ...@@ -31,6 +31,10 @@
#include <linux/sunrpc/auth.h> #include <linux/sunrpc/auth.h>
#include <linux/sunrpc/clnt.h> #include <linux/sunrpc/clnt.h>
#ifdef CONFIG_NFS_FSCACHE
#include <linux/netfs.h>
#endif
#include <linux/nfs.h> #include <linux/nfs.h>
#include <linux/nfs2.h> #include <linux/nfs2.h>
#include <linux/nfs3.h> #include <linux/nfs3.h>
...@@ -204,14 +208,15 @@ struct nfs_inode { ...@@ -204,14 +208,15 @@ struct nfs_inode {
/* how many bytes have been written/read and how many bytes queued up */ /* how many bytes have been written/read and how many bytes queued up */
__u64 write_io; __u64 write_io;
__u64 read_io; __u64 read_io;
#ifdef CONFIG_NFS_FSCACHE
struct fscache_cookie *fscache;
#endif
struct inode vfs_inode;
#ifdef CONFIG_NFS_V4_2 #ifdef CONFIG_NFS_V4_2
struct nfs4_xattr_cache *xattr_cache; struct nfs4_xattr_cache *xattr_cache;
#endif #endif
union {
struct inode vfs_inode;
#ifdef CONFIG_NFS_FSCACHE
struct netfs_inode netfs; /* netfs context and VFS inode */
#endif
};
}; };
struct nfs4_copy_state { struct nfs4_copy_state {
...@@ -329,15 +334,6 @@ static inline int NFS_STALE(const struct inode *inode) ...@@ -329,15 +334,6 @@ static inline int NFS_STALE(const struct inode *inode)
return test_bit(NFS_INO_STALE, &NFS_I(inode)->flags); return test_bit(NFS_INO_STALE, &NFS_I(inode)->flags);
} }
static inline struct fscache_cookie *nfs_i_fscache(struct inode *inode)
{
#ifdef CONFIG_NFS_FSCACHE
return NFS_I(inode)->fscache;
#else
return NULL;
#endif
}
static inline __u64 NFS_FILEID(const struct inode *inode) static inline __u64 NFS_FILEID(const struct inode *inode)
{ {
return NFS_I(inode)->fileid; return NFS_I(inode)->fileid;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment