FAILED: patch "[PATCH] zonefs: Always invalidate last cached page on append write" failed to apply to 5.10-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.10-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.10.y
git checkout FETCH_HEAD
git cherry-pick -x c1976bd8f23016d8706973908f2bb0ac0d852a8f
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2023040358-blade-preheated-5a2d@gregkh' --subject-prefix 'PATCH 5.10.y' HEAD^..
Possible dependencies:
c1976bd8f230 ("zonefs: Always invalidate last cached page on append write") 4008e2a0b01a ("zonefs: Reorganize code")a608da3bd730 ("zonefs: Detect append writes at invalid locations")8745889a7fd0 ("Merge tag 'iomap-6.0-merge-2' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From c1976bd8f23016d8706973908f2bb0ac0d852a8f Mon Sep 17 00:00:00 2001
From: Damien Le Moal <[email protected]>
Date: Wed, 29 Mar 2023 13:16:01 +0900
Subject: [PATCH] zonefs: Always invalidate last cached page on append write
When a direct append write is executed, the append offset may correspond to the last page of a sequential file inode which might have been cached already by buffered reads, page faults with mmap-read or non-direct readahead. To ensure that the on-disk and cached data is consistant for such last cached page, make sure to always invalidate it in zonefs_file_dio_append(). If the invalidation fails, return -EBUSY to userspace to differentiate from IO errors.
This invalidation will always be a no-op when the FS block size (device zone write granularity) is equal to the page size (e.g. 4K).
fs/zonefs/file.c +14 -0
@@ -382,6 +382,7 @@ static ssize_t zonefs_file_dio_append(struct kiocb *iocb, struct iov_iter *from)struct zonefs_zone *z =zonefs_inode_zone (inode);struct block_device *bdev = inode->i_sb->s_bdev;unsigned int max =bdev_max_zone_append_sectors (bdev); +pgoff_t start, end;struct bio *bio;ssize_t size =0 ;int nr_pages;
@@ -390,6 +391,19 @@ static ssize_t zonefs_file_dio_append(struct kiocb *iocb, struct iov_iter *from) max =ALIGN_DOWN (max <<SECTOR_SHIFT , inode->i_sb->s_blocksize);iov_iter_truncate (from, max); +/* +* If the inode block size (zone write granularity) is smaller than the +* page size, we may be appending data belonging to the last page of the +* inode straddling inode->i_size, with that page already cached due to +* a buffered read or readahead. So make sure to invalidate that page. +* This will always be a no-op for the case where the block size is +* equal to the page size. +*/ + start = iocb->ki_pos >>PAGE_SHIFT ; + end = (iocb->ki_pos +iov_iter_count (from) -1 ) >>PAGE_SHIFT ; +if (invalidate_inode_pages2_range (inode->i_mapping, start, end)) +return -EBUSY ; + nr_pages =iov_iter_npages (from,BIO_MAX_VECS );if (!nr_pages)return 0 ;