Patch "afs: Fix post-setattr file edit to do truncation correctly" has been added to the 6.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    afs: Fix post-setattr file edit to do truncation correctly

to the 6.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     afs-fix-post-setattr-file-edit-to-do-truncation-corr.patch
and it can be found in the queue-6.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit f506ef34786cfa942c58cba206b210b0457944b4
Author: David Howells <dhowells@xxxxxxxxxx>
Date:   Fri Aug 23 21:08:10 2024 +0100

    afs: Fix post-setattr file edit to do truncation correctly
    
    [ Upstream commit a74ee0e878e262c0276966528d72d4e887174410 ]
    
    At the end of an kAFS RPC operation, there is an "edit" phase (originally
    intended for post-directory modification ops to edit the local image) that
    the setattr VFS op uses to fix up the pagecache if the RPC that requested
    truncation of a file was successful.
    
    afs_setattr_edit_file() calls truncate_setsize() which sets i_size, expands
    the pagecache if needed and truncates the pagecache.  The first two of
    those, however, are redundant as they've already been done by
    afs_setattr_success() under the io_lock and the first is also done under
    the callback lock (cb_lock).
    
    Fix afs_setattr_edit_file() to call truncate_pagecache() instead (which is
    called by truncate_setsize(), thereby skipping the redundant parts.
    
    Fixes: 100ccd18bb41 ("netfs: Optimise away reads above the point at which there can be no data")
    Signed-off-by: David Howells <dhowells@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20240823200819.532106-3-dhowells@xxxxxxxxxx
    cc: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx>
    cc: Pankaj Raghav <p.raghav@xxxxxxxxxxx>
    cc: Jeff Layton <jlayton@xxxxxxxxxx>
    cc: Marc Dionne <marc.dionne@xxxxxxxxxxxx>
    cc: linux-afs@xxxxxxxxxxxxxxxxxxx
    cc: netfs@xxxxxxxxxxxxxxx
    cc: linux-mm@xxxxxxxxx
    cc: linux-fsdevel@xxxxxxxxxxxxxxx
    Signed-off-by: Christian Brauner <brauner@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/afs/inode.c b/fs/afs/inode.c
index 3acf5e0500728..a95e77670b494 100644
--- a/fs/afs/inode.c
+++ b/fs/afs/inode.c
@@ -695,13 +695,18 @@ static void afs_setattr_edit_file(struct afs_operation *op)
 {
 	struct afs_vnode_param *vp = &op->file[0];
 	struct afs_vnode *vnode = vp->vnode;
+	struct inode *inode = &vnode->netfs.inode;
 
 	if (op->setattr.attr->ia_valid & ATTR_SIZE) {
 		loff_t size = op->setattr.attr->ia_size;
-		loff_t i_size = op->setattr.old_i_size;
+		loff_t old = op->setattr.old_i_size;
+
+		/* Note: inode->i_size was updated by afs_apply_status() inside
+		 * the I/O and callback locks.
+		 */
 
-		if (size != i_size) {
-			truncate_setsize(&vnode->netfs.inode, size);
+		if (size != old) {
+			truncate_pagecache(inode, size);
 			netfs_resize_file(&vnode->netfs, size, true);
 			fscache_resize_cookie(afs_vnode_cache(vnode), size);
 		}




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux