]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
fs/adfs: super: add support for E and E+ floppy image formats
authorRussell King <rmk+kernel@armlinux.org.uk>
Mon, 9 Dec 2019 11:11:33 +0000 (11:11 +0000)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 21 Jan 2020 01:12:42 +0000 (20:12 -0500)
Add support for ADFS E and E+ floppy image formats, which, unlike their
hard disk variants, do not have a filesystem boot block - they have a
single map zone, with the map fragment stored at sector 0.

Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/adfs/super.c

index 4c06b2d5a861f21d49be3210f7292bbd69271803..a3cc8ecb50da1aabb4bec64fb535d1ef4bd45f27 100644 (file)
@@ -347,6 +347,20 @@ static int adfs_validate_bblk(struct super_block *sb, struct buffer_head *bh,
        return 0;
 }
 
+static int adfs_validate_dr0(struct super_block *sb, struct buffer_head *bh,
+                             struct adfs_discrecord **drp)
+{
+       struct adfs_discrecord *dr;
+
+       /* Do some sanity checks on the ADFS disc record */
+       dr = (struct adfs_discrecord *)(bh->b_data + 4);
+       if (adfs_checkdiscrecord(dr) || dr->nzones_high || dr->nzones != 1)
+               return -EILSEQ;
+
+       *drp = dr;
+       return 0;
+}
+
 static int adfs_fill_super(struct super_block *sb, void *data, int silent)
 {
        struct adfs_discrecord *dr;
@@ -376,7 +390,9 @@ static int adfs_fill_super(struct super_block *sb, void *data, int silent)
                goto error;
 
        /* Try to probe the filesystem boot block */
-       ret = adfs_probe(sb, ADFS_DISCRECORD, silent, adfs_validate_bblk);
+       ret = adfs_probe(sb, ADFS_DISCRECORD, 1, adfs_validate_bblk);
+       if (ret == -EILSEQ)
+               ret = adfs_probe(sb, 0, silent, adfs_validate_dr0);
        if (ret == -EILSEQ) {
                if (!silent)
                        adfs_msg(sb, KERN_ERR,