All of lore.kernel.org
 help / color / mirror / Atom feed
From: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
To: Jan Kara <jack@suse.cz>
Cc: Christian Brauner <brauner@kernel.org>,
	 linux-fsdevel@vger.kernel.org,
	Josef Bacik <josef@toxicpanda.com>,
	 Chris Mason <mason@kernel.org>,
	linux-ext4@vger.kernel.org,
	 Andreas Dilger <adilger.kernel@dilger.ca>,
	Baokun Li <libaokun@linux.alibaba.com>,
	 Ojaswin Mujoo <ojaswin@linux.ibm.com>,
	 "Ritesh Harjani (IBM)" <ritesh.list@gmail.com>,
	Namjae Jeon <namjae.jeon@samsung.com>,
	 stable@vger.kernel.org
Subject: Re: [PATCH RFC 8/9] fat: sync the inode in fat_free_eofblocks()
Date: Thu, 05 Nov 2026 02:47:40 +0900	[thread overview]
Message-ID: <87v76co5dv.fsf@mail.parknet.co.jp> (raw)
In-Reply-To: <oilqmzo3vpddohxp46x3pjzf3wtoebahirtjqmt3izdw6ua5iq@ghdbk27wuf5f>

Jan Kara <jack@suse.cz> writes:

> On Thu 29-10-26 14:28:23, Christian Brauner wrote:
>> fat_evict_inode() calls fat_free_eofblocks() for a linked inode to give
>> back the clusters that were fallocated past the initialized size. For an
>> empty file that also resets the start cluster in the directory entry. It
>> truncates the clusters and writes the inode with:
>> 
>>   sync_inode_metadata(inode, inode_needs_sync(inode));
>> 
>> Unless the inode is IS_SYNC that is WB_SYNC_NONE writeback. It copies
>> the inode into the directory entry buffer, marks the buffer dirty and
>> sets I_METADATA_WRITEBACK. Then the inode goes away and with it the only
>> thing that would have told a later fsync() that the directory entry
>> still has to be written.
>> 
>> FAT doesn't have that problem. Its buffers are tracked on the FAT inode
>   ^^ exFAT??
>
>> and fat_file_fsync() writes them out on every fsync() of any file on the
>> filesystem.
>> 
>> So after the next fsync() the clusters are free on disk while the
>> directory entry of the empty file still points at them. If another file
>> reuses them and the machine crashes before the directory entry makes it
>> to disk, the two files share clusters. That's the corruption the comment
>> in fat_free_eofblocks() is about.
>
> Correct, but that does not violate anything AFAICT. fsync(2) promises data
> is reachable (which it is), not that the fs metadata is all
> consistent.
>
> For non-journaling filesystem you need fsck for such guarantee. And I know
> I'm a bit obtuse here but the change results in a synchronous buffer write
> on each eviction of inode that has preallocated blocks which will be a
> noticeable performance regression for some usecases. Probably Ogawa should
> decide whether this change is acceptable or whether we play fast and
> loose... Ogawa?

In my understand, the result of this change only affect to crash case
(FAT has no guarantee about it with non-sync mode). And this doesn't
lost data actually - lost some free blocks (maybe fsck would be
recoverable).

So my preference is no force sync.

Thanks.

>> So wait for the directory entry to reach the disk before the inode goes
>> away.
>> 
>> Reproducer. The image file shows what reached the disk. The flusher is
>> turned off so that it doesn't write the directory entry before fsck.fat
>> looks at the image:
>> 
>>   img=/tmp/fat.img
>>   truncate -s 64M $img
>>   mkfs.vfat $img > /dev/null
>>   dev=$(losetup -f --show $img)
>>   mount -t vfat $dev /mnt
>>   echo 0 > /proc/sys/vm/dirty_writeback_centisecs
>>   xfs_io -f -c 'falloc -k 0 1m' -c fsync /mnt/a
>>   echo 3 > /proc/sys/vm/drop_caches
>>   echo 3 > /proc/sys/vm/drop_caches
>>   xfs_io -c fsync /mnt/a
>>   fsck.fat -n $img | grep -A1 '^/a'
>>   umount /mnt
>>   losetup -d $dev
>> 
>> On v7.3-17318-g65ba8f34ec88 in a KASAN and lockdep vng guest this
>> prints:
>> 
>>   /a
>>     Contains a free cluster (3). Assuming EOF.
>> 
>> With this patch fsck.fat finds nothing wrong with /a.
>> 
>> The stable tag is narrower than the Fixes tag. Before v7.3
>> fat_free_eofblocks() called __fat_write_inode() directly and the fix
>> there is to pass 1 for wait.
>> 
>> Fixes: b13bb33eacb7 ("fat: add fat_fallocate operation")
>> Cc: stable@vger.kernel.org # v7.3
>> Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
>> ---
>>  fs/fat/inode.c | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>> 
>> diff --git a/fs/fat/inode.c b/fs/fat/inode.c
>> index d85c8fbdcca4..fc571ee2b174 100644
>> --- a/fs/fat/inode.c
>> +++ b/fs/fat/inode.c
>> @@ -675,7 +675,7 @@ static void fat_free_eofblocks(struct inode *inode)
>>  		 * any corruption on the next access to the cluster
>>  		 * chain for the file.
>>  		 */
>> -		err = sync_inode_metadata(inode, inode_needs_sync(inode));
>> +		err = sync_inode_metadata(inode, 1);
>>  		if (err) {
>>  			fat_msg(inode->i_sb, KERN_WARNING, "Failed to "
>>  					"update on disk inode for unused "
>> 
>> -- 
>> 2.53.0
>> 

-- 
OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>

  reply	other threads:[~2026-11-04 17:47 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-29 13:28 [PATCH RFC 0/9] fs: reclaim inodes with I_METADATA_WRITEBACK Christian Brauner
2026-10-29 13:28 ` [PATCH RFC 1/9] ext2: add ext2_inode_block() helper Christian Brauner
2026-10-29 13:31   ` sashiko-bot
2026-11-04 16:51   ` Jan Kara
2026-10-29 13:28 ` [PATCH RFC 2/9] ext2: don't read the inode block in ext2_sync_inode_metadata() Christian Brauner
2026-10-29 13:33   ` sashiko-bot
2026-11-04 16:53   ` Jan Kara
2026-10-29 13:28 ` [PATCH RFC 3/9] ext4: add ext4_inode_loc_block() helper Christian Brauner
2026-10-29 13:32   ` sashiko-bot
2026-11-04 17:07   ` Jan Kara
2026-11-05  9:37     ` Christian Brauner
2026-11-09 12:27       ` Jan Kara
2026-10-29 13:28 ` [PATCH RFC 4/9] ext4: don't read the inode block in ext4_sync_inode_metadata() Christian Brauner
2026-10-29 13:34   ` sashiko-bot
2026-10-29 13:28 ` [PATCH RFC 5/9] minix: add minix_inode_block() helper Christian Brauner
2026-10-29 13:34   ` sashiko-bot
2026-11-04 17:09   ` Jan Kara
2026-10-29 13:28 ` [PATCH RFC 6/9] minix: don't read the inode block in minix_sync_inode_metadata() Christian Brauner
2026-10-29 13:32   ` sashiko-bot
2026-11-04 17:09   ` Jan Kara
2026-10-29 13:28 ` [PATCH RFC 7/9] udf: don't allocate the inode block in udf_sync_inode_metadata() Christian Brauner
2026-10-29 13:35   ` sashiko-bot
2026-11-04 17:10   ` Jan Kara
2026-10-29 13:28 ` [PATCH RFC 8/9] fat: sync the inode in fat_free_eofblocks() Christian Brauner
2026-10-29 13:37   ` sashiko-bot
2026-11-04 17:27   ` Jan Kara
2026-11-04 17:47     ` OGAWA Hirofumi [this message]
2026-11-04 19:27       ` Jan Kara
2026-11-05  4:46         ` OGAWA Hirofumi
2026-10-29 13:28 ` [PATCH RFC 9/9] fs: don't strand I_METADATA_WRITEBACK inodes outside the LRU Christian Brauner
2026-10-29 13:46   ` sashiko-bot
2026-11-04 17:37   ` Jan Kara

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=87v76co5dv.fsf@mail.parknet.co.jp \
    --to=hirofumi@mail.parknet.co.jp \
    --cc=adilger.kernel@dilger.ca \
    --cc=brauner@kernel.org \
    --cc=jack@suse.cz \
    --cc=josef@toxicpanda.com \
    --cc=libaokun@linux.alibaba.com \
    --cc=linux-ext4@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=mason@kernel.org \
    --cc=namjae.jeon@samsung.com \
    --cc=ojaswin@linux.ibm.com \
    --cc=ritesh.list@gmail.com \
    --cc=stable@vger.kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.