fuse: invalidation reverse calls
Add notification messages that allow the filesystem to invalidate VFS caches. Two notifications are added: 1) inode invalidation - invalidate cached attributes - invalidate a range of pages in the page cache (this is optional) 2) dentry invalidation - try to invalidate a subtree in the dentry cache Care must be taken while accessing the 'struct super_block' for the mount, as it can go away while an invalidation is in progress. To prevent this, introduce a rw-semaphore, that is taken for read during the invalidation and taken for write in the ->kill_sb callback. Cc: Csaba Henk <csaba@gluster.com> Cc: Anand Avati <avati@zresearch.com> Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
This commit is contained in:

committed by
Miklos Szeredi

parent
e0a43ddcc0
commit
3b463ae0c6
@@ -484,6 +484,12 @@ struct fuse_conn {
|
||||
|
||||
/** Called on final put */
|
||||
void (*release)(struct fuse_conn *);
|
||||
|
||||
/** Super block for this connection. */
|
||||
struct super_block *sb;
|
||||
|
||||
/** Read/write semaphore to hold when accessing sb. */
|
||||
struct rw_semaphore killsb;
|
||||
};
|
||||
|
||||
static inline struct fuse_conn *get_fuse_conn_super(struct super_block *sb)
|
||||
@@ -511,6 +517,11 @@ extern const struct file_operations fuse_dev_operations;
|
||||
|
||||
extern const struct dentry_operations fuse_dentry_operations;
|
||||
|
||||
/**
|
||||
* Inode to nodeid comparison.
|
||||
*/
|
||||
int fuse_inode_eq(struct inode *inode, void *_nodeidp);
|
||||
|
||||
/**
|
||||
* Get a filled in inode
|
||||
*/
|
||||
@@ -711,6 +722,19 @@ void fuse_release_nowrite(struct inode *inode);
|
||||
|
||||
u64 fuse_get_attr_version(struct fuse_conn *fc);
|
||||
|
||||
/**
|
||||
* File-system tells the kernel to invalidate cache for the given node id.
|
||||
*/
|
||||
int fuse_reverse_inval_inode(struct super_block *sb, u64 nodeid,
|
||||
loff_t offset, loff_t len);
|
||||
|
||||
/**
|
||||
* File-system tells the kernel to invalidate parent attributes and
|
||||
* the dentry matching parent/name.
|
||||
*/
|
||||
int fuse_reverse_inval_entry(struct super_block *sb, u64 parent_nodeid,
|
||||
struct qstr *name);
|
||||
|
||||
int fuse_do_open(struct fuse_conn *fc, u64 nodeid, struct file *file,
|
||||
bool isdir);
|
||||
ssize_t fuse_direct_io(struct file *file, const char __user *buf,
|
||||
|
Reference in New Issue
Block a user