Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
f8d3473
fuse: hold DLM grants as a bitmap and drive every path from it
hbirth Sep 5, 2026
ce821f7
fuse: keep a folio writeback could not send
hbirth Sep 5, 2026
a5c4d26
fuse: keep the local size against an attribute reply already on the wire
hbirth Sep 5, 2026
96593ba
fuse: take the writeback grant with no folio held
hbirth Sep 5, 2026
7294049
fuse: do not record a grant past what a revoke could mark
hbirth Sep 5, 2026
4c10c53
fuse: bound the range a writeback pass defers
hbirth Sep 5, 2026
e06e933
fuse: pin a dlm grant from confirmation to dirty
hbirth Sep 5, 2026
7c652b3
fuse: fill a folio under a pinned read grant
hbirth Sep 5, 2026
69571af
fuse: fill a readahead window under a pinned read grant
hbirth Sep 5, 2026
2cc8e67
fuse: ask for the read grant before the folios are locked
hbirth Sep 5, 2026
889385b
fuse: stop asking for the readahead grant under the folio locks
hbirth Sep 5, 2026
001714a
fuse: ask for the read grant on a readahead advice
hbirth Sep 5, 2026
1abdc10
fuse: pin a streamed write across the request
hbirth Sep 5, 2026
f3fef2b
fuse: take no dlm lock for O_DIRECT
hbirth Sep 5, 2026
07f14d4
fuse: cover the readahead lookahead with the read grant
hbirth Sep 5, 2026
b7d1726
fuse: sample the attr version before the compound getattr
hbirth Sep 5, 2026
4b9596f
fuse: hold the size against any cached tail
hbirth Sep 5, 2026
9da7db7
fuse: crop the queued writepages against a high water mark
hbirth Sep 5, 2026
464fd18
fuse: invalidate the mapping through the writeback aware helper
hbirth Sep 5, 2026
7b93219
fuse: keep the data cache on a size change under dlm
hbirth Sep 5, 2026
ea9aefb
fuse: keep the cache when an attribute reply shrinks the size
hbirth Sep 5, 2026
34b3006
fuse: do not accept a short writeback write
hbirth Sep 5, 2026
8813569
fuse: compare the alignment bound in page indices
hbirth Sep 5, 2026
dce3226
fuse: read the write stream marks once
hbirth Sep 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 2 additions & 35 deletions fs/fuse/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -800,15 +800,7 @@ static int fuse_create_open(struct mnt_idmap *idmap, struct inode *dir,
get_fuse_inode(inode));
truncate_pagecache(inode, 0);
} else if (!(ff->open_flags & FOPEN_KEEP_CACHE)) {
/*
* Only when the drop really emptied the mapping, as
* in fuse_open(): a folio that survived still needs
* its record.
*/
if (fuse_open_drop_cache(inode) &&
fm->fc->dlm && fm->fc->writeback_cache)
fuse_dlm_ranges_dropped(get_fuse_inode(inode),
0, U64_MAX);
fuse_open_drop_cache(inode);
}
}
return err;
Expand Down Expand Up @@ -2213,6 +2205,7 @@ int fuse_do_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
i_size_write(inode, outarg.attr.size);

if (is_truncate) {
fuse_writeback_crop_truncated(inode, outarg.attr.size);
/* NOTE: this may release/reacquire fi->lock */
__fuse_release_nowrite(inode);
}
Expand All @@ -2235,32 +2228,6 @@ int fuse_do_setattr(struct mnt_idmap *idmap, struct dentry *dentry,

truncate_pagecache(inode, outarg.attr.size);
invalidate_inode_pages2(mapping);

/*
* The cache above the new size is gone, so the ranges
* describing it have nothing left to say. From the first
* whole page above it: the page holding the new end of the
* file survives the truncate, and so does its record.
*/
if (fc->dlm && fc->writeback_cache)
fuse_dlm_ranges_dropped(fi, PAGE_ALIGN(outarg.attr.size),
U64_MAX);

/*
* invalidate_inode_pages2() emptied the mapping below the new
* size too (laundering anything dirty first, so those bytes
* are on the server). A revoked range is kept only to make
* writeback take the grant again before sending the folios
* under it, so with those folios gone it describes nothing
* and would sit in the tree unfreed, keeping its neighbours
* from merging. Only when the drop really emptied it: a busy
* folio that survived still needs its record, and a fault
* populating after the check keeps its page visible to it.
*/
if (fc->dlm && fc->writeback_cache && outarg.attr.size &&
!filemap_range_has_page(mapping, 0, outarg.attr.size - 1))
fuse_dlm_ranges_dropped(fi, 0,
PAGE_ALIGN(outarg.attr.size) - 1);
}

clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
Expand Down
Loading
Loading