Skip to content

Commit c3cb6f9

Browse files
lostjeffleMiklos Szeredi
authored andcommitted
fuse: mark inode DONT_CACHE when per inode DAX hint changes
When the per inode DAX hint changes while the file is still *opened*, it is quite complicated and maybe fragile to dynamically change the DAX state. Hence mark the inode and corresponding dentries as DONE_CACHE once the per inode DAX hint changes, so that the inode instance will be evicted and freed as soon as possible once the file is closed and the last reference to the inode is put. And then when the file gets reopened next time, the new instantiated inode will reflect the new DAX state. In summary, when the per inode DAX hint changes for an *opened* file, the DAX state of the file won't be updated until this file is closed and reopened later. Signed-off-by: Jeffle Xu <[email protected]> Reviewed-by: Vivek Goyal <[email protected]> Signed-off-by: Miklos Szeredi <[email protected]>
1 parent 2ee019f commit c3cb6f9

File tree

3 files changed

+13
-0
lines changed

3 files changed

+13
-0
lines changed

fs/fuse/dax.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1361,6 +1361,15 @@ void fuse_dax_inode_init(struct inode *inode, unsigned int flags)
13611361
inode->i_data.a_ops = &fuse_dax_file_aops;
13621362
}
13631363

1364+
void fuse_dax_dontcache(struct inode *inode, unsigned int flags)
1365+
{
1366+
struct fuse_conn *fc = get_fuse_conn(inode);
1367+
1368+
if (fuse_is_inode_dax_mode(fc->dax_mode) &&
1369+
((bool) IS_DAX(inode) != (bool) (flags & FUSE_ATTR_DAX)))
1370+
d_mark_dontcache(inode);
1371+
}
1372+
13641373
bool fuse_dax_check_alignment(struct fuse_conn *fc, unsigned int map_alignment)
13651374
{
13661375
if (fc->dax && (map_alignment > FUSE_DAX_SHIFT)) {

fs/fuse/fuse_i.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1296,6 +1296,7 @@ void fuse_dax_conn_free(struct fuse_conn *fc);
12961296
bool fuse_dax_inode_alloc(struct super_block *sb, struct fuse_inode *fi);
12971297
void fuse_dax_inode_init(struct inode *inode, unsigned int flags);
12981298
void fuse_dax_inode_cleanup(struct inode *inode);
1299+
void fuse_dax_dontcache(struct inode *inode, unsigned int flags);
12991300
bool fuse_dax_check_alignment(struct fuse_conn *fc, unsigned int map_alignment);
13001301
void fuse_dax_cancel_work(struct fuse_conn *fc);
13011302

fs/fuse/inode.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,9 @@ void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr,
301301
if (inval)
302302
invalidate_inode_pages2(inode->i_mapping);
303303
}
304+
305+
if (IS_ENABLED(CONFIG_FUSE_DAX))
306+
fuse_dax_dontcache(inode, attr->flags);
304307
}
305308

306309
static void fuse_init_inode(struct inode *inode, struct fuse_attr *attr)

0 commit comments

Comments
 (0)