bcachefs: Fix i_sectors_leak in bch2_truncate_page
authorKent Overstreet <kent.overstreet@gmail.com>
Mon, 22 Nov 2021 17:47:20 +0000 (12:47 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:17 +0000 (17:09 -0400)
When bch2_truncate_page() discards dirty sectors in the page cache, we
need to account for that - we don't need to account for allocated
sectors because that'll be done by the bch2_fpunch() call when it
updates the btree.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
fs/bcachefs/fs-io.c

index dff6d754721237e6ec4267d9a3a2c5bf5c59becc..68e707fcf9cd9e0e3b74346dab8b1846ba9f298c 100644 (file)
@@ -2241,6 +2241,7 @@ static int __bch2_truncate_page(struct bch_inode_info *inode,
        unsigned end_offset = ((end - 1) & (PAGE_SIZE - 1)) + 1;
        unsigned i;
        struct page *page;
+       s64 i_sectors_delta = 0;
        int ret = 0;
 
        /* Page boundary? Nothing to do */
@@ -2292,9 +2293,13 @@ static int __bch2_truncate_page(struct bch_inode_info *inode,
             i < round_down(end_offset, block_bytes(c)) >> 9;
             i++) {
                s->s[i].nr_replicas     = 0;
+               if (s->s[i].state == SECTOR_DIRTY)
+                       i_sectors_delta--;
                s->s[i].state           = SECTOR_UNALLOCATED;
        }
 
+       i_sectors_acct(c, inode, NULL, i_sectors_delta);
+
        /*
         * Caller needs to know whether this page will be written out by
         * writeback - doing an i_size update if necessary - or whether it will