From: "Pankaj Raghav (Samsung)" <kernel@pankajraghav.com>
To: David Howells <dhowells@redhat.com>
Cc: brauner@kernel.org, akpm@linux-foundation.org,
chandan.babu@oracle.com, linux-fsdevel@vger.kernel.org,
djwong@kernel.org, hare@suse.de, gost.dev@samsung.com,
linux-xfs@vger.kernel.org, hch@lst.de, david@fromorbit.com,
Zi Yan <ziy@nvidia.com>,
yang@os.amperecomputing.com, linux-kernel@vger.kernel.org,
linux-mm@kvack.org, willy@infradead.org, john.g.garry@oracle.com,
cl@os.amperecomputing.com, p.raghav@samsung.com,
mcgrof@kernel.org, ryan.roberts@arm.com
Subject: Re: [PATCH v12 00/10] enable bs > ps in XFS
Date: Mon, 19 Aug 2024 16:39:38 +0000 [thread overview]
Message-ID: <20240819163938.qtsloyko67cqrmb6@quentin> (raw)
In-Reply-To: <3402933.1724068015@warthog.procyon.org.uk>
> ---
> /* Distillation of the generic/393 xfstest */
> #include <stdio.h>
> #include <stdlib.h>
> #include <unistd.h>
> #include <fcntl.h>
>
> #define ERR(x, y) do { if ((long)(x) == -1) { perror(y); exit(1); } } while(0)
>
> static const char xxx[40] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
> static const char yyy[40] = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy";
> static const char dropfile[] = "/proc/sys/vm/drop_caches";
> static const char droptype[] = "3";
> static const char file[] = "/xfstest.test/wubble";
>
> int main(int argc, char *argv[])
> {
> int fd, drop;
>
> /* Fill in the second 8K block of the file... */
> fd = open(file, O_CREAT|O_TRUNC|O_WRONLY, 0666);
> ERR(fd, "open");
> ERR(ftruncate(fd, 0), "pre-trunc $file");
> ERR(pwrite(fd, yyy, sizeof(yyy), 0x2000), "write-2000");
> ERR(close(fd), "close");
>
> /* ... and drop the pagecache so that we get a streaming
> * write, attaching some private data to the folio.
> */
> drop = open(dropfile, O_WRONLY);
> ERR(drop, dropfile);
> ERR(write(drop, droptype, sizeof(droptype) - 1), "write-drop");
> ERR(close(drop), "close-drop");
>
> fd = open(file, O_WRONLY, 0666);
> ERR(fd, "reopen");
> /* Make a streaming write on the first 8K block (needs O_WRONLY). */
> ERR(pwrite(fd, xxx, sizeof(xxx), 0), "write-0");
> /* Now use truncate to shrink and reexpand. */
> ERR(ftruncate(fd, 4), "trunc-4");
> ERR(ftruncate(fd, 4096), "trunc-4096");
> ERR(close(fd), "close-2");
> exit(0);
> }
I tried this code on XFS, and it is working as expected (I am getting
xxxx).
[nix-shell:~/xfstests]# hexdump -C /media/test/wubble
00000000 78 78 78 78 00 00 00 00 00 00 00 00 00 00 00 00 |xxxx............|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00001000
I did some tracing as well and here are the results.
$ trace-cmd record -e xfs_file_fsync -e xfs_file_buffered_write -e xfs_setattr -e xfs_zero_eof -F -c ./a.out
[nix-shell:~/xfstests]# trace-cmd report
cpus=4
a.out-3872 [003] 84120.161472: xfs_setattr: dev 259:0 ino 0x103 iflags 0x0
a.out-3872 [003] 84120.172109: xfs_setattr: dev 259:0 ino 0x103 iflags 0x20
a.out-3872 [003] 84120.172151: xfs_zero_eof: dev 259:0 ino 0x103 isize 0x0 disize 0x0 pos 0x0 bytecount 0x2000 // First truncate
a.out-3872 [003] 84120.172156: xfs_file_buffered_write: dev 259:0 ino 0x103 disize 0x0 pos 0x2000 bytecount 0x28
a.out-3872 [003] 84120.185423: xfs_file_buffered_write: dev 259:0 ino 0x103 disize 0x2028 pos 0x0 bytecount 0x28
a.out-3872 [003] 84120.185477: xfs_setattr: dev 259:0 ino 0x103 iflags 0x0
a.out-3872 [003] 84120.186493: xfs_setattr: dev 259:0 ino 0x103 iflags 0x20
a.out-3872 [003] 84120.186495: xfs_zero_eof: dev 259:0 ino 0x103 isize 0x4 disize 0x4 pos 0x4 bytecount 0xffc // Third truncate
First and third truncate result in calling xfs_zero_eof as we are
increasing the size of the file.
When we do the second ftruncate(fd, 4), we call into iomap_truncate_page() with
offset 0:
int
iomap_truncate_page(struct inode *inode, loff_t pos, bool *did_zero,
const struct iomap_ops *ops)
{
unsigned int blocksize = i_blocksize(inode);
unsigned int off = pos & (blocksize - 1);
/* Block boundary? Nothing to do */
if (!off)
return 0;
return iomap_zero_range(inode, pos, blocksize - off, did_zero, ops);
}
As you can see, we take into account the blocksize (which is set as
minorder during inode init) and make sure the sub-block zeroing is done
correctly.
Also if you see iomap_invalidate_folio(), we don't remove the folio
private data until the whole folio is invalidated.
I doubt we are doing anything wrong from the page cache layer with these
patches.
All we do with minorder support is to make sure we always allocate folios
in the page cache that are at least min order in size and aligned to the
min order (PATCH 2 and 3) and we maintain this even we do a split (PATCH
4).
I hope this helps!
--
Pankaj
next prev parent reply other threads:[~2024-08-19 16:39 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-15 9:08 Pankaj Raghav (Samsung)
2024-08-15 9:08 ` [PATCH v12 01/10] fs: Allow fine-grained control of folio sizes Pankaj Raghav (Samsung)
2024-08-15 9:08 ` [PATCH v12 02/10] filemap: allocate mapping_min_order folios in the page cache Pankaj Raghav (Samsung)
2024-08-15 9:08 ` [PATCH v12 03/10] readahead: allocate folios with mapping_min_order in readahead Pankaj Raghav (Samsung)
2024-08-15 9:08 ` [PATCH v12 04/10] mm: split a folio in minimum folio order chunks Pankaj Raghav (Samsung)
2024-08-15 9:08 ` [PATCH v12 05/10] filemap: cap PTE range to be created to allowed zero fill in folio_map_range() Pankaj Raghav (Samsung)
2024-08-15 9:08 ` [PATCH v12 06/10] iomap: fix iomap_dio_zero() for fs bs > system page size Pankaj Raghav (Samsung)
2024-08-15 9:08 ` [PATCH v12 07/10] xfs: use kvmalloc for xattr buffers Pankaj Raghav (Samsung)
2024-08-15 9:08 ` [PATCH v12 08/10] xfs: expose block size in stat Pankaj Raghav (Samsung)
2024-08-15 9:08 ` [PATCH v12 09/10] xfs: make the calculation generic in xfs_sb_validate_fsb_count() Pankaj Raghav (Samsung)
2024-08-15 9:08 ` [PATCH v12 10/10] xfs: enable block size larger than page size support Pankaj Raghav (Samsung)
2024-08-16 19:31 ` [PATCH v12 00/10] enable bs > ps in XFS David Howells
2024-08-18 16:51 ` Pankaj Raghav (Samsung)
2024-08-18 20:16 ` David Howells
2024-08-19 7:24 ` Hannes Reinecke
2024-08-19 7:37 ` Pankaj Raghav (Samsung)
2024-08-19 12:25 ` David Howells
2024-08-19 11:46 ` David Howells
2024-08-19 12:48 ` Hannes Reinecke
2024-08-19 14:08 ` David Howells
2024-08-19 16:39 ` Pankaj Raghav (Samsung) [this message]
2024-08-19 18:40 ` David Howells
2024-08-20 9:17 ` Pankaj Raghav (Samsung)
2024-08-19 11:59 ` David Howells
2024-08-20 23:24 ` David Howells
2024-08-21 7:16 ` Pankaj Raghav (Samsung)
2024-08-19 15:17 ` David Howells
2024-08-19 16:51 ` David Howells
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240819163938.qtsloyko67cqrmb6@quentin \
--to=kernel@pankajraghav.com \
--cc=akpm@linux-foundation.org \
--cc=brauner@kernel.org \
--cc=chandan.babu@oracle.com \
--cc=cl@os.amperecomputing.com \
--cc=david@fromorbit.com \
--cc=dhowells@redhat.com \
--cc=djwong@kernel.org \
--cc=gost.dev@samsung.com \
--cc=hare@suse.de \
--cc=hch@lst.de \
--cc=john.g.garry@oracle.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-xfs@vger.kernel.org \
--cc=mcgrof@kernel.org \
--cc=p.raghav@samsung.com \
--cc=ryan.roberts@arm.com \
--cc=willy@infradead.org \
--cc=yang@os.amperecomputing.com \
--cc=ziy@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox