mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
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: Dave Wysochanski <dwysocha@redhat.com> Tested-by: Daire Byrne <daire@dneg.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
committed by
Anna Schumaker
parent
01c3a40084
commit
88a4d7bdee
@@ -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)
|
|||||||
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)
|
|||||||
*/
|
*/
|
||||||
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)
|
|||||||
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);
|
|||||||
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)
|
|||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
*/
|
*/
|
||||||
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)
|
|||||||
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 *
|
|||||||
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 @@
|
|||||||
#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 {
|
|||||||
/* 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)
|
|||||||
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;
|
||||||
|
Reference in New Issue
Block a user