linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] fat: Relax checks for sector size and media type
@ 2018-09-02 13:19 Pali Rohár
  2018-09-03  7:17 ` OGAWA Hirofumi
  0 siblings, 1 reply; 8+ messages in thread
From: Pali Rohár @ 2018-09-02 13:19 UTC (permalink / raw)
  To: OGAWA Hirofumi; +Cc: linux-kernel, linux-fsdevel

Windows fastfat.sys driver accepts also media types 0x00 and 0x01 and
sector sizes 128 and 256 bytes. Linux mkfs.fat can format disk also to
larger FAT sector sizes then 4096 bytes, therefore relax also upper limit
restriction.

Signed-off-by: Pali Rohár <pali.rohar@gmail.com>

---
Source code of Windows 10 Anniversary Update fastfat.sys driver is now
available on github.

Check for valid media types in fastfat.sys is there:
https://github.com/Microsoft/Windows-driver-samples/blob/96eb96dfb613e4c745db6bd1f53a92fe7e2290fc/filesys/fastfat/fsctrl.c#L2601-L2611

And check for valid sector size is there:
https://github.com/Microsoft/Windows-driver-samples/blob/96eb96dfb613e4c745db6bd1f53a92fe7e2290fc/filesys/fastfat/fsctrl.c#L2542-L2547
---
 fs/fat/inode.c           | 4 +---
 include/linux/msdos_fs.h | 2 +-
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/fs/fat/inode.c b/fs/fat/inode.c
index d6b81e31..f2556f71 100644
--- a/fs/fat/inode.c
+++ b/fs/fat/inode.c
@@ -1506,9 +1506,7 @@ static int fat_read_bpb(struct super_block *sb, struct fat_boot_sector *b,
 		goto out;
 	}
 
-	if (!is_power_of_2(bpb->fat_sector_size)
-	    || (bpb->fat_sector_size < 512)
-	    || (bpb->fat_sector_size > 4096)) {
+	if (!is_power_of_2(bpb->fat_sector_size)) {
 		if (!silent)
 			fat_msg(sb, KERN_ERR, "bogus logical sector size %u",
 			       (unsigned)bpb->fat_sector_size);
diff --git a/include/linux/msdos_fs.h b/include/linux/msdos_fs.h
index b7a5d4c7..e5b3f613 100644
--- a/include/linux/msdos_fs.h
+++ b/include/linux/msdos_fs.h
@@ -7,6 +7,6 @@
 /* media of boot sector */
 static inline int fat_valid_media(u8 media)
 {
-	return 0xf8 <= media || media == 0xf0;
+	return 0xf8 <= media || media == 0xf0 || media == 0x00 || media == 0x01;
 }
 #endif /* !_LINUX_MSDOS_FS_H */
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] fat: Relax checks for sector size and media type
  2018-09-02 13:19 [PATCH] fat: Relax checks for sector size and media type Pali Rohár
@ 2018-09-03  7:17 ` OGAWA Hirofumi
  2018-09-03  7:40   ` Pali Rohár
  0 siblings, 1 reply; 8+ messages in thread
From: OGAWA Hirofumi @ 2018-09-03  7:17 UTC (permalink / raw)
  To: Pali Rohár; +Cc: linux-kernel, linux-fsdevel

Pali Roh�r <pali.rohar@gmail.com> writes:

> Windows fastfat.sys driver accepts also media types 0x00 and 0x01 and
> sector sizes 128 and 256 bytes. Linux mkfs.fat can format disk also to
> larger FAT sector sizes then 4096 bytes, therefore relax also upper limit
> restriction.

> -	if (!is_power_of_2(bpb->fat_sector_size)
> -	    || (bpb->fat_sector_size < 512)
> -	    || (bpb->fat_sector_size > 4096)) {
> +	if (!is_power_of_2(bpb->fat_sector_size)) {

Just relaxing validation doesn't work. The block layer doesn't support
smaller than 512, and lager than PAGE_SIZE.  (And in specification, fat
doesn't support lager than 4096.)

>  static inline int fat_valid_media(u8 media)
>  {
> -	return 0xf8 <= media || media == 0xf0;
> +	return 0xf8 <= media || media == 0xf0 || media == 0x00 || media == 0x01;
>  }
>  #endif /* !_LINUX_MSDOS_FS_H */

This is ok though, this would be for ancient floppy media.

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

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] fat: Relax checks for sector size and media type
  2018-09-03  7:17 ` OGAWA Hirofumi
@ 2018-09-03  7:40   ` Pali Rohár
  2018-09-03  8:01     ` OGAWA Hirofumi
  0 siblings, 1 reply; 8+ messages in thread
From: Pali Rohár @ 2018-09-03  7:40 UTC (permalink / raw)
  To: OGAWA Hirofumi; +Cc: linux-kernel, linux-fsdevel

On Monday 03 September 2018 16:17:26 OGAWA Hirofumi wrote:
> Pali Rohár <pali.rohar@gmail.com> writes:
> 
> > Windows fastfat.sys driver accepts also media types 0x00 and 0x01 and
> > sector sizes 128 and 256 bytes. Linux mkfs.fat can format disk also to
> > larger FAT sector sizes then 4096 bytes, therefore relax also upper limit
> > restriction.
> 
> > -	if (!is_power_of_2(bpb->fat_sector_size)
> > -	    || (bpb->fat_sector_size < 512)
> > -	    || (bpb->fat_sector_size > 4096)) {
> > +	if (!is_power_of_2(bpb->fat_sector_size)) {
> 
> Just relaxing validation doesn't work. The block layer doesn't support
> smaller than 512, and lager than PAGE_SIZE.  (And in specification, fat
> doesn't support lager than 4096.)

Hi! I just sent this patch for discussion, with links to (now open
source) Windows implementation. I guess that Windows driver
implementation is more "authoritative" then Microsoft's own
specification. It is known that Windows implementation does not match
Microsoft specification.

I know at least 3 FAT specifications (MS EFI FAT, MS/SD card FAT,
ECMA-107) and you are right that Microsoft's one does not allow sector
sizes larger then 4096.

If there is limitation by block layer, then:

1) Why we do not check for PAGE_SIZE?

2) Is check in fat driver really needed (if block layer checks it)?

> >  static inline int fat_valid_media(u8 media)
> >  {
> > -	return 0xf8 <= media || media == 0xf0;
> > +	return 0xf8 <= media || media == 0xf0 || media == 0x00 || media == 0x01;
> >  }
> >  #endif /* !_LINUX_MSDOS_FS_H */
> 
> This is ok though, this would be for ancient floppy media.

Ok.

-- 
Pali Rohár
pali.rohar@gmail.com

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] fat: Relax checks for sector size and media type
  2018-09-03  7:40   ` Pali Rohár
@ 2018-09-03  8:01     ` OGAWA Hirofumi
  2018-09-03  8:04       ` Pali Rohár
  0 siblings, 1 reply; 8+ messages in thread
From: OGAWA Hirofumi @ 2018-09-03  8:01 UTC (permalink / raw)
  To: Pali Rohár; +Cc: linux-kernel, linux-fsdevel

Pali Roh�r <pali.rohar@gmail.com> writes:

>> Just relaxing validation doesn't work. The block layer doesn't support
>> smaller than 512, and lager than PAGE_SIZE.  (And in specification, fat
>> doesn't support lager than 4096.)
>
> Hi! I just sent this patch for discussion, with links to (now open
> source) Windows implementation. I guess that Windows driver
> implementation is more "authoritative" then Microsoft's own
> specification. It is known that Windows implementation does not match
> Microsoft specification.
>
> I know at least 3 FAT specifications (MS EFI FAT, MS/SD card FAT,
> ECMA-107) and you are right that Microsoft's one does not allow sector
> sizes larger then 4096.
>
> If there is limitation by block layer, then:
>
> 1) Why we do not check for PAGE_SIZE?

That source seems to check power_of_2(size) and 128 <= size <=
4096. Rather why do you want to support larger than 4096? Or I'm missing
something?

> 2) Is check in fat driver really needed (if block layer checks it)?

Yes, isolating block layer error and fat format error to be better error
report.
-- 
OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] fat: Relax checks for sector size and media type
  2018-09-03  8:01     ` OGAWA Hirofumi
@ 2018-09-03  8:04       ` Pali Rohár
  2018-09-03  8:19         ` OGAWA Hirofumi
  0 siblings, 1 reply; 8+ messages in thread
From: Pali Rohár @ 2018-09-03  8:04 UTC (permalink / raw)
  To: OGAWA Hirofumi; +Cc: linux-kernel, linux-fsdevel

On Monday 03 September 2018 17:01:03 OGAWA Hirofumi wrote:
> Pali Rohár <pali.rohar@gmail.com> writes:
> 
> >> Just relaxing validation doesn't work. The block layer doesn't support
> >> smaller than 512, and lager than PAGE_SIZE.  (And in specification, fat
> >> doesn't support lager than 4096.)
> >
> > Hi! I just sent this patch for discussion, with links to (now open
> > source) Windows implementation. I guess that Windows driver
> > implementation is more "authoritative" then Microsoft's own
> > specification. It is known that Windows implementation does not match
> > Microsoft specification.
> >
> > I know at least 3 FAT specifications (MS EFI FAT, MS/SD card FAT,
> > ECMA-107) and you are right that Microsoft's one does not allow sector
> > sizes larger then 4096.
> >
> > If there is limitation by block layer, then:
> >
> > 1) Why we do not check for PAGE_SIZE?
> 
> That source seems to check power_of_2(size) and 128 <= size <=
> 4096. Rather why do you want to support larger than 4096? Or I'm missing
> something?

I looked into (Linux) mkfs.fat and it supports formatting disk also with
sector size > 4096. Therefore I thought it may be good idea for ability
to mount and use it (on Linux).

I could check what other operating system would do with FAT sector size
larger then 4096.

> > 2) Is check in fat driver really needed (if block layer checks it)?
> 
> Yes, isolating block layer error and fat format error to be better error
> report.

Ok.

-- 
Pali Rohár
pali.rohar@gmail.com

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] fat: Relax checks for sector size and media type
  2018-09-03  8:04       ` Pali Rohár
@ 2018-09-03  8:19         ` OGAWA Hirofumi
  2018-09-12 10:17           ` Pali Rohár
  0 siblings, 1 reply; 8+ messages in thread
From: OGAWA Hirofumi @ 2018-09-03  8:19 UTC (permalink / raw)
  To: Pali Rohár; +Cc: linux-kernel, linux-fsdevel

Pali Roh�r <pali.rohar@gmail.com> writes:

>> That source seems to check power_of_2(size) and 128 <= size <=
>> 4096. Rather why do you want to support larger than 4096? Or I'm missing
>> something?
>
> I looked into (Linux) mkfs.fat and it supports formatting disk also with
> sector size > 4096. Therefore I thought it may be good idea for ability
> to mount and use it (on Linux).
>
> I could check what other operating system would do with FAT sector size
> larger then 4096.

If there is real user to use that, I'm ok though (of course, need
serious tests). However, FAT would be for exchange data with other
devices, and there is "cluster per sector", and spec recommends sector
size == device sector size. So I suspect this format is not useful.

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

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] fat: Relax checks for sector size and media type
  2018-09-03  8:19         ` OGAWA Hirofumi
@ 2018-09-12 10:17           ` Pali Rohár
  2018-09-12 10:36             ` OGAWA Hirofumi
  0 siblings, 1 reply; 8+ messages in thread
From: Pali Rohár @ 2018-09-12 10:17 UTC (permalink / raw)
  To: OGAWA Hirofumi; +Cc: linux-kernel, linux-fsdevel

On Monday 03 September 2018 17:19:15 OGAWA Hirofumi wrote:
> Pali Rohár <pali.rohar@gmail.com> writes:
> 
> >> That source seems to check power_of_2(size) and 128 <= size <=
> >> 4096. Rather why do you want to support larger than 4096? Or I'm missing
> >> something?
> >
> > I looked into (Linux) mkfs.fat and it supports formatting disk also with
> > sector size > 4096. Therefore I thought it may be good idea for ability
> > to mount and use it (on Linux).
> >
> > I could check what other operating system would do with FAT sector size
> > larger then 4096.
> 
> If there is real user to use that, I'm ok though (of course, need
> serious tests). However, FAT would be for exchange data with other
> devices, and there is "cluster per sector", and spec recommends sector
> size == device sector size. So I suspect this format is not useful.

I looked into OpenBSD, FreeBSD and NetBSD source code and there is no
explicit upper limit for sector size. Just that sector size must be
power of two.

I have not did tests yet, but you are right that some testing should be
done.

As FAT operates with clusters and cluster size is defined by sector
size, then sectors per cluster and sector size defines cluster size. And
cluster size itself implies maximal size of FAT filesystem.

So increasing sector size could be useful to create larger FAT32
filesystems as current limit hit by sector size = 512 bytes.

What do you think, which operating systems should be tested?

-- 
Pali Rohár
pali.rohar@gmail.com

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] fat: Relax checks for sector size and media type
  2018-09-12 10:17           ` Pali Rohár
@ 2018-09-12 10:36             ` OGAWA Hirofumi
  0 siblings, 0 replies; 8+ messages in thread
From: OGAWA Hirofumi @ 2018-09-12 10:36 UTC (permalink / raw)
  To: Pali Rohár; +Cc: linux-kernel, linux-fsdevel

Pali Roh�r <pali.rohar@gmail.com> writes:

>> If there is real user to use that, I'm ok though (of course, need
>> serious tests). However, FAT would be for exchange data with other
>> devices, and there is "cluster per sector", and spec recommends sector
>> size == device sector size. So I suspect this format is not useful.
>
> I looked into OpenBSD, FreeBSD and NetBSD source code and there is no
> explicit upper limit for sector size. Just that sector size must be
> power of two.
>
> I have not did tests yet, but you are right that some testing should be
> done.
>
> As FAT operates with clusters and cluster size is defined by sector
> size, then sectors per cluster and sector size defines cluster size. And
> cluster size itself implies maximal size of FAT filesystem.
>
> So increasing sector size could be useful to create larger FAT32
> filesystems as current limit hit by sector size = 512 bytes.
>
> What do you think, which operating systems should be tested?

Again, I suspect those custom extension (can't read by some uefi or
windows) is not useful though.

Testing on kernel that has PAGE_SIZE >= 8192, and setting FAT
sector_size >= 8192.  After that, it would be safe to remove 4096
limitation.

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

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2018-09-12 15:40 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-09-02 13:19 [PATCH] fat: Relax checks for sector size and media type Pali Rohár
2018-09-03  7:17 ` OGAWA Hirofumi
2018-09-03  7:40   ` Pali Rohár
2018-09-03  8:01     ` OGAWA Hirofumi
2018-09-03  8:04       ` Pali Rohár
2018-09-03  8:19         ` OGAWA Hirofumi
2018-09-12 10:17           ` Pali Rohár
2018-09-12 10:36             ` OGAWA Hirofumi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).