Message ID | 20230203005503.141557-1-ebiggers@kernel.org (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | ext4: fix cgroup writeback accounting with fs-layer encryption | expand |
On Thu, Feb 02, 2023 at 04:55:03PM -0800, Eric Biggers wrote: > From: Eric Biggers <ebiggers@google.com> > > When writing a page from an encrypted file that is using > filesystem-layer encryption (not inline encryption), ext4 encrypts the > pagecache page into a bounce page, then writes the bounce page. > > It also passes the bounce page to wbc_account_cgroup_owner(). That's > incorrect, because the bounce page is a newly allocated temporary page > that doesn't have the memory cgroup of the original pagecache page. > This makes wbc_account_cgroup_owner() not account the I/O to the owner > of the pagecache page as it should. > > Fix this by always passing the pagecache page to > wbc_account_cgroup_owner(). > > Fixes: 001e4a8775f6 ("ext4: implement cgroup writeback support") > Cc: stable@vger.kernel.org > Reported-by: Matthew Wilcox (Oracle) <willy@infradead.org> > Signed-off-by: Eric Biggers <ebiggers@google.com> Acked-by: Tejun Heo <tj@kernel.org> Thanks.
On Fri, Feb 03, 2023 at 08:19:35AM -1000, Tejun Heo wrote: > On Thu, Feb 02, 2023 at 04:55:03PM -0800, Eric Biggers wrote: > > From: Eric Biggers <ebiggers@google.com> > > > > When writing a page from an encrypted file that is using > > filesystem-layer encryption (not inline encryption), ext4 encrypts the > > pagecache page into a bounce page, then writes the bounce page. > > > > It also passes the bounce page to wbc_account_cgroup_owner(). That's > > incorrect, because the bounce page is a newly allocated temporary page > > that doesn't have the memory cgroup of the original pagecache page. > > This makes wbc_account_cgroup_owner() not account the I/O to the owner > > of the pagecache page as it should. > > > > Fix this by always passing the pagecache page to > > wbc_account_cgroup_owner(). > > > > Fixes: 001e4a8775f6 ("ext4: implement cgroup writeback support") > > Cc: stable@vger.kernel.org > > Reported-by: Matthew Wilcox (Oracle) <willy@infradead.org> > > Signed-off-by: Eric Biggers <ebiggers@google.com> > > Acked-by: Tejun Heo <tj@kernel.org> > > Thanks. This patch hasn't been applied yet. Ted, I was hoping you would take it through the ext4 tree. Can you do so when you have a chance? - Eric
On Thu, 2 Feb 2023 16:55:03 -0800, Eric Biggers wrote: > From: Eric Biggers <ebiggers@google.com> > > When writing a page from an encrypted file that is using > filesystem-layer encryption (not inline encryption), ext4 encrypts the > pagecache page into a bounce page, then writes the bounce page. > > It also passes the bounce page to wbc_account_cgroup_owner(). That's > incorrect, because the bounce page is a newly allocated temporary page > that doesn't have the memory cgroup of the original pagecache page. > This makes wbc_account_cgroup_owner() not account the I/O to the owner > of the pagecache page as it should. > > [...] Applied, thanks! [1/1] ext4: fix cgroup writeback accounting with fs-layer encryption commit: ffec85d53d0f39ee4680a2cf0795255e000e1feb Best regards,
diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c index beaec6d81074a..1e4db96a04e63 100644 --- a/fs/ext4/page-io.c +++ b/fs/ext4/page-io.c @@ -409,7 +409,8 @@ static void io_submit_init_bio(struct ext4_io_submit *io, static void io_submit_add_bh(struct ext4_io_submit *io, struct inode *inode, - struct page *page, + struct page *pagecache_page, + struct page *bounce_page, struct buffer_head *bh) { int ret; @@ -421,10 +422,11 @@ static void io_submit_add_bh(struct ext4_io_submit *io, } if (io->io_bio == NULL) io_submit_init_bio(io, bh); - ret = bio_add_page(io->io_bio, page, bh->b_size, bh_offset(bh)); + ret = bio_add_page(io->io_bio, bounce_page ?: pagecache_page, + bh->b_size, bh_offset(bh)); if (ret != bh->b_size) goto submit_and_retry; - wbc_account_cgroup_owner(io->io_wbc, page, bh->b_size); + wbc_account_cgroup_owner(io->io_wbc, pagecache_page, bh->b_size); io->io_next_block++; } @@ -561,8 +563,7 @@ int ext4_bio_write_page(struct ext4_io_submit *io, do { if (!buffer_async_write(bh)) continue; - io_submit_add_bh(io, inode, - bounce_page ? bounce_page : page, bh); + io_submit_add_bh(io, inode, page, bounce_page, bh); } while ((bh = bh->b_this_page) != head); unlock: unlock_page(page);