On Tue, May 28, 2024 at 10:03:15PM +0100, Matthew Wilcox (Oracle) wrote: > Page cache indices are in units of PAGE_SIZE, not in units of > the folio size. Revert the change in nfs_grow_file(), and > pass the inode to nfs_folio_length() so it can be reimplemented > in terms of folio_mkwrite_check_truncate() which handles this > correctly. I had to apply the incremental patch below to make the change compile. With that it causes a new xfstests failure in generic/127 that I haven't looked into yet. The mm-level bugs I've seen even with baseline Linus' tree also happened more often than in my previous tests, but that might just be coincidence. diff --git a/fs/nfs/nfstrace.h b/fs/nfs/nfstrace.h index 1e710654af1173..0a5d5fa9513735 100644 --- a/fs/nfs/nfstrace.h +++ b/fs/nfs/nfstrace.h @@ -938,7 +938,7 @@ TRACE_EVENT(nfs_sillyrename_unlink, DECLARE_EVENT_CLASS(nfs_folio_event, TP_PROTO( - const struct inode *inode, + struct inode *inode, struct folio *folio ), @@ -954,14 +954,14 @@ DECLARE_EVENT_CLASS(nfs_folio_event, ), TP_fast_assign( - const struct nfs_inode *nfsi = NFS_I(inode); + struct nfs_inode *nfsi = NFS_I(inode); __entry->dev = inode->i_sb->s_dev; __entry->fileid = nfsi->fileid; __entry->fhandle = nfs_fhandle_hash(&nfsi->fh); __entry->version = inode_peek_iversion_raw(inode); __entry->offset = folio_file_pos(folio); - __entry->count = nfs_folio_length(folio); + __entry->count = nfs_folio_length(folio, inode); ), TP_printk( @@ -977,14 +977,14 @@ DECLARE_EVENT_CLASS(nfs_folio_event, #define DEFINE_NFS_FOLIO_EVENT(name) \ DEFINE_EVENT(nfs_folio_event, name, \ TP_PROTO( \ - const struct inode *inode, \ + struct inode *inode, \ struct folio *folio \ ), \ TP_ARGS(inode, folio)) DECLARE_EVENT_CLASS(nfs_folio_event_done, TP_PROTO( - const struct inode *inode, + struct inode *inode, struct folio *folio, int ret ), @@ -1002,14 +1002,14 @@ DECLARE_EVENT_CLASS(nfs_folio_event_done, ), TP_fast_assign( - const struct nfs_inode *nfsi = NFS_I(inode); + struct nfs_inode *nfsi = NFS_I(inode); __entry->dev = inode->i_sb->s_dev; __entry->fileid = nfsi->fileid; __entry->fhandle = nfs_fhandle_hash(&nfsi->fh); __entry->version = inode_peek_iversion_raw(inode); __entry->offset = folio_file_pos(folio); - __entry->count = nfs_folio_length(folio); + __entry->count = nfs_folio_length(folio, inode); __entry->ret = ret; ), @@ -1026,7 +1026,7 @@ DECLARE_EVENT_CLASS(nfs_folio_event_done, #define DEFINE_NFS_FOLIO_EVENT_DONE(name) \ DEFINE_EVENT(nfs_folio_event_done, name, \ TP_PROTO( \ - const struct inode *inode, \ + struct inode *inode, \ struct folio *folio, \ int ret \ ), \