2016-04-21 13:16:34

by Anssi Hannula

[permalink] [raw]
Subject: fat: changed filesystem dirty bit behavior

Hi all!

Starting with commit b88a105802e9aeb [1] ("fat: mark fs as dirty on
mount and clean on umount") FAT(32) filesystems are now marked as
"dirty" on mount and clean on unmount.

The commit message says that this is similar to Win 7 behavior - "Win 7,
set dirty flag on first write and remove it on umount".
However, I have been unable to coerce my Windows 7 system to set this
flag on a FAT32 filesystem, when tested both with portable (USB) and
fixed disks. Have they maybe changed this with an update, or does
someone else still see this bit set on Win7 or later?

This change is a bit problematic on a legacy embedded application I'm
working on, as the user interface doesn't have any separate
eject/unmount button for a USB stick - it relies on the user not
unplugging the stick while a data transfer is in progress.
So, when the system is upgraded to a modern vanilla kernel version, this
bit is set when the USB stick is unplugged, causing Windows to always
prompt whether to scan and fix the drive, which is annoying/confusing
for users.

Would a patch to add a filesystem option to restore the previous (and
seemingly Win7) behavior be accepted?

Or is this a case where the application is just considered to be broken?
(as setting the dirty bit seems technically correct, even if Windows
doesn't do it)

Or anything else I'm missing?

For reference, on FAT32 this is bit 0 of byte 0x41 (61) of the first sector.

[1]
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=b88a105802e9aeb6e234e8106659f5d1271081bb

--
Anssi Hannula / Bitwise Oy


2016-04-21 13:25:31

by Austin S Hemmelgarn

[permalink] [raw]
Subject: Re: fat: changed filesystem dirty bit behavior

On 2016-04-21 09:09, Anssi Hannula wrote:
> Hi all!
>
> Starting with commit b88a105802e9aeb [1] ("fat: mark fs as dirty on
> mount and clean on umount") FAT(32) filesystems are now marked as
> "dirty" on mount and clean on unmount.
>
> The commit message says that this is similar to Win 7 behavior - "Win 7,
> set dirty flag on first write and remove it on umount".
> However, I have been unable to coerce my Windows 7 system to set this
> flag on a FAT32 filesystem, when tested both with portable (USB) and
> fixed disks. Have they maybe changed this with an update, or does
> someone else still see this bit set on Win7 or later?
>
> This change is a bit problematic on a legacy embedded application I'm
> working on, as the user interface doesn't have any separate
> eject/unmount button for a USB stick - it relies on the user not
> unplugging the stick while a data transfer is in progress.
> So, when the system is upgraded to a modern vanilla kernel version, this
> bit is set when the USB stick is unplugged, causing Windows to always
> prompt whether to scan and fix the drive, which is annoying/confusing
> for users.
>
> Would a patch to add a filesystem option to restore the previous (and
> seemingly Win7) behavior be accepted?
>
> Or is this a case where the application is just considered to be broken?
> (as setting the dirty bit seems technically correct, even if Windows
> doesn't do it)
>
> Or anything else I'm missing?
Based on some recent testing I did on Windows 10, and assuming it has
similar behavior to the current Windows 7 behavior (which isn't a far
stretch, they actually back-ported a lot of the lower level stuff that
they reasonably can), it appears to set the dirty bit only when
something is actually written to on the disk, which makes some sense,
because the filesystem really isn't dirty until we've written something
to it.