mirror of
https://github.com/armbian/linux-cix.git
synced 2026-01-06 12:30:45 -08:00
Add a netfs_i_context struct that should be included in the network
filesystem's own inode struct wrapper, directly after the VFS's inode
struct, e.g.:
struct my_inode {
struct {
/* These must be contiguous */
struct inode vfs_inode;
struct netfs_i_context netfs_ctx;
};
};
The netfs_i_context struct so far contains a single field for the network
filesystem to use - the cache cookie:
struct netfs_i_context {
...
struct fscache_cookie *cache;
};
Three functions are provided to help with this:
(1) void netfs_i_context_init(struct inode *inode,
const struct netfs_request_ops *ops);
Initialise the netfs context and set the operations.
(2) struct netfs_i_context *netfs_i_context(struct inode *inode);
Find the netfs context from the VFS inode.
(3) struct inode *netfs_inode(struct netfs_i_context *ctx);
Find the VFS inode from the netfs context.
Changes
=======
ver #4)
- Fix netfs_is_cache_enabled() to check cookie->cache_priv to see if a
cache is present[3].
- Fix netfs_skip_folio_read() to zero out all of the page, not just some
of it[3].
ver #3)
- Split out the bit to move ceph cap-getting on readahead into
ceph_init_request()[1].
- Stick in a comment to the netfs inode structs indicating the contiguity
requirements[2].
ver #2)
- Adjust documentation to match.
- Use "#if IS_ENABLED()" in netfs_i_cookie(), not "#ifdef".
- Move the cap check from ceph_readahead() to ceph_init_request() to be
called from netfslib.
- Remove ceph_readahead() and use netfs_readahead() directly instead.
Signed-off-by: David Howells <dhowells@redhat.com>
Acked-by: Jeff Layton <jlayton@kernel.org>
cc: linux-cachefs@redhat.com
Link: https://lore.kernel.org/r/8af0d47f17d89c06bbf602496dd845f2b0bf25b3.camel@kernel.org/ [1]
Link: https://lore.kernel.org/r/beaf4f6a6c2575ed489adb14b257253c868f9a5c.camel@kernel.org/ [2]
Link: https://lore.kernel.org/r/3536452.1647421585@warthog.procyon.org.uk/ [3]
Link: https://lore.kernel.org/r/164622984545.3564931.15691742939278418580.stgit@warthog.procyon.org.uk/ # v1
Link: https://lore.kernel.org/r/164678213320.1200972.16807551936267647470.stgit@warthog.procyon.org.uk/ # v2
Link: https://lore.kernel.org/r/164692909854.2099075.9535537286264248057.stgit@warthog.procyon.org.uk/ # v3
Link: https://lore.kernel.org/r/306388.1647595110@warthog.procyon.org.uk/ # v4
148 lines
3.6 KiB
C
148 lines
3.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Ceph cache definitions.
|
|
*
|
|
* Copyright (C) 2013 by Adfin Solutions, Inc. All Rights Reserved.
|
|
* Written by Milosz Tanski (milosz@adfin.com)
|
|
*/
|
|
|
|
#ifndef _CEPH_CACHE_H
|
|
#define _CEPH_CACHE_H
|
|
|
|
#include <linux/netfs.h>
|
|
|
|
#ifdef CONFIG_CEPH_FSCACHE
|
|
#include <linux/fscache.h>
|
|
|
|
int ceph_fscache_register_fs(struct ceph_fs_client* fsc, struct fs_context *fc);
|
|
void ceph_fscache_unregister_fs(struct ceph_fs_client* fsc);
|
|
|
|
void ceph_fscache_register_inode_cookie(struct inode *inode);
|
|
void ceph_fscache_unregister_inode_cookie(struct ceph_inode_info* ci);
|
|
|
|
void ceph_fscache_use_cookie(struct inode *inode, bool will_modify);
|
|
void ceph_fscache_unuse_cookie(struct inode *inode, bool update);
|
|
|
|
void ceph_fscache_update(struct inode *inode);
|
|
void ceph_fscache_invalidate(struct inode *inode, bool dio_write);
|
|
|
|
static inline struct fscache_cookie *ceph_fscache_cookie(struct ceph_inode_info *ci)
|
|
{
|
|
return netfs_i_cookie(&ci->vfs_inode);
|
|
}
|
|
|
|
static inline void ceph_fscache_resize(struct inode *inode, loff_t to)
|
|
{
|
|
struct ceph_inode_info *ci = ceph_inode(inode);
|
|
struct fscache_cookie *cookie = ceph_fscache_cookie(ci);
|
|
|
|
if (cookie) {
|
|
ceph_fscache_use_cookie(inode, true);
|
|
fscache_resize_cookie(cookie, to);
|
|
ceph_fscache_unuse_cookie(inode, true);
|
|
}
|
|
}
|
|
|
|
static inline void ceph_fscache_unpin_writeback(struct inode *inode,
|
|
struct writeback_control *wbc)
|
|
{
|
|
fscache_unpin_writeback(wbc, ceph_fscache_cookie(ceph_inode(inode)));
|
|
}
|
|
|
|
static inline int ceph_fscache_set_page_dirty(struct page *page)
|
|
{
|
|
struct inode *inode = page->mapping->host;
|
|
struct ceph_inode_info *ci = ceph_inode(inode);
|
|
|
|
return fscache_set_page_dirty(page, ceph_fscache_cookie(ci));
|
|
}
|
|
|
|
static inline int ceph_begin_cache_operation(struct netfs_io_request *rreq)
|
|
{
|
|
struct fscache_cookie *cookie = ceph_fscache_cookie(ceph_inode(rreq->inode));
|
|
|
|
return fscache_begin_read_operation(&rreq->cache_resources, cookie);
|
|
}
|
|
|
|
static inline bool ceph_is_cache_enabled(struct inode *inode)
|
|
{
|
|
return fscache_cookie_enabled(ceph_fscache_cookie(ceph_inode(inode)));
|
|
}
|
|
|
|
static inline void ceph_fscache_note_page_release(struct inode *inode)
|
|
{
|
|
struct ceph_inode_info *ci = ceph_inode(inode);
|
|
|
|
fscache_note_page_release(ceph_fscache_cookie(ci));
|
|
}
|
|
#else /* CONFIG_CEPH_FSCACHE */
|
|
static inline int ceph_fscache_register_fs(struct ceph_fs_client* fsc,
|
|
struct fs_context *fc)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void ceph_fscache_unregister_fs(struct ceph_fs_client* fsc)
|
|
{
|
|
}
|
|
|
|
static inline void ceph_fscache_register_inode_cookie(struct inode *inode)
|
|
{
|
|
}
|
|
|
|
static inline void ceph_fscache_unregister_inode_cookie(struct ceph_inode_info* ci)
|
|
{
|
|
}
|
|
|
|
static inline void ceph_fscache_use_cookie(struct inode *inode, bool will_modify)
|
|
{
|
|
}
|
|
|
|
static inline void ceph_fscache_unuse_cookie(struct inode *inode, bool update)
|
|
{
|
|
}
|
|
|
|
static inline void ceph_fscache_update(struct inode *inode)
|
|
{
|
|
}
|
|
|
|
static inline void ceph_fscache_invalidate(struct inode *inode, bool dio_write)
|
|
{
|
|
}
|
|
|
|
static inline struct fscache_cookie *ceph_fscache_cookie(struct ceph_inode_info *ci)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static inline void ceph_fscache_resize(struct inode *inode, loff_t to)
|
|
{
|
|
}
|
|
|
|
static inline void ceph_fscache_unpin_writeback(struct inode *inode,
|
|
struct writeback_control *wbc)
|
|
{
|
|
}
|
|
|
|
static inline int ceph_fscache_set_page_dirty(struct page *page)
|
|
{
|
|
return __set_page_dirty_nobuffers(page);
|
|
}
|
|
|
|
static inline bool ceph_is_cache_enabled(struct inode *inode)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
static inline int ceph_begin_cache_operation(struct netfs_io_request *rreq)
|
|
{
|
|
return -ENOBUFS;
|
|
}
|
|
|
|
static inline void ceph_fscache_note_page_release(struct inode *inode)
|
|
{
|
|
}
|
|
#endif /* CONFIG_CEPH_FSCACHE */
|
|
|
|
#endif
|