Enable probing for filesystems with non 512 byte sectors, and fix up each
filesystem to correctly handle that.  Remove unused field from the fs type
structure listing acceptable sector sizes.
---
 NEWS                                 |  3 ++
 include/parted/filesys.in.h          |  1 -
 libparted/filesys.c                  |  5 ----
 libparted/fs/amiga/affs.c            | 22 ++------------
 libparted/fs/amiga/apfs.c            |  6 ++--
 libparted/fs/amiga/asfs.c            |  3 +-
 libparted/fs/ext2/interface.c        | 18 ++++-------
 libparted/fs/fat/bootsector.c        | 58 ++++--------------------------------
 libparted/fs/fat/bootsector.h        |  3 +-
 libparted/fs/fat/fat.c               | 12 ++++----
 libparted/fs/fat/fat.h               |  4 +--
 libparted/fs/hfs/hfs.c               |  7 -----
 libparted/fs/hfs/probe.c             | 13 ++++----
 libparted/fs/jfs/jfs.c               | 29 +++++++-----------
 libparted/fs/linux_swap/linux_swap.c | 41 +++++--------------------
 libparted/fs/nilfs2/nilfs2.c         | 36 ++++++++--------------
 libparted/fs/ntfs/ntfs.c             | 13 ++++----
 libparted/fs/r/fat/bootsector.c      | 32 +++++++++++---------
 libparted/fs/r/fat/bootsector.h      |  8 ++---
 libparted/fs/r/fat/fat.c             | 29 ++++++++++--------
 libparted/fs/r/fat/fat.h             |  4 +--
 libparted/fs/r/fat/resize.c          |  4 +--
 libparted/fs/r/fat/table.c           |  4 +--
 libparted/fs/reiserfs/reiserfs.c     | 23 ++++++--------
 libparted/fs/ufs/ufs.c               | 27 ++++++++---------
 libparted/fs/xfs/xfs.c               | 26 +++++++---------
 26 files changed, 149 insertions(+), 282 deletions(-)

diff --git a/NEWS b/NEWS
index 816fb57..bc948bd 100644
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,9 @@ GNU parted NEWS                                    -*- 
outline -*-
   boot partition type.
 
 ** Bug Fixes
+
+  Fix filesystem detection on non 512 byte sector sizes
+
   Fix several bugs with loop labels ( whole disk filesystems )
 
   Fix gpt to correctly handle non ASCII charcters in partition names
diff --git a/include/parted/filesys.in.h b/include/parted/filesys.in.h
index d9f626b..b42d7c9 100644
--- a/include/parted/filesys.in.h
+++ b/include/parted/filesys.in.h
@@ -46,7 +46,6 @@ struct _PedFileSystemOps {
 struct _PedFileSystemType {
        PedFileSystemType*      next;
        const char* const       name;           /**< name of the file system 
type */
-        const int*              block_sizes;
        PedFileSystemOps* const ops;
 };
 
diff --git a/libparted/filesys.c b/libparted/filesys.c
index 1870808..1bfe32d 100644
--- a/libparted/filesys.c
+++ b/libparted/filesys.c
@@ -198,11 +198,6 @@ ped_file_system_probe_specific (
        PED_ASSERT (fs_type->ops->probe != NULL);
        PED_ASSERT (geom != NULL);
 
-        /* Fail all fs-specific probe-related tests when sector size
-           is not the default.  */
-       if (geom->dev->sector_size != PED_SECTOR_SIZE_DEFAULT)
-               return 0;
-
        if (!ped_device_open (geom->dev))
                return 0;
        result = fs_type->ops->probe (geom);
diff --git a/libparted/fs/amiga/affs.c b/libparted/fs/amiga/affs.c
index 6b7624d..a97cc54 100644
--- a/libparted/fs/amiga/affs.c
+++ b/libparted/fs/amiga/affs.c
@@ -55,7 +55,8 @@ _generic_affs_probe (PedGeometry* geom, uint32_t kind)
 
        PED_ASSERT (geom != NULL);
        PED_ASSERT (geom->dev != NULL);
-
+       if (geom->dev->sector_size != 512)
+               return NULL;
        /* Finds the blocksize, prealloc and reserved values of the partition 
block */
        if (!(part = ped_malloc (PED_SECTOR_SIZE_DEFAULT*blocksize))) {
                ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
@@ -216,97 +217,78 @@ static PedFileSystemOps _amufs5_ops = {
        probe:          _amufs5_probe,
 };
 
-#define AFFS_BLOCK_SIZES        ((int[5]){512, 1024, 2048, 4096, 0})
-#define AMUFS_BLOCK_SIZES       ((int[2]){512, 0})
-
-
 PedFileSystemType _affs0_type = {
        next:            NULL,
        ops:             &_affs0_ops,
        name:            "affs0",
-       block_sizes:      AFFS_BLOCK_SIZES
 };
 PedFileSystemType _affs1_type = {
        next:            NULL,
        ops:             &_affs1_ops,
        name:            "affs1",
-       block_sizes:      AFFS_BLOCK_SIZES
 };
 PedFileSystemType _affs2_type = {
        next:            NULL,
        ops:             &_affs2_ops,
        name:            "affs2",
-       block_sizes:      AFFS_BLOCK_SIZES
 };
 PedFileSystemType _affs3_type = {
        next:            NULL,
        ops:             &_affs3_ops,
        name:            "affs3",
-       block_sizes:      AFFS_BLOCK_SIZES
 };
 PedFileSystemType _affs4_type = {
        next:            NULL,
        ops:             &_affs4_ops,
        name:            "affs4",
-       block_sizes:      AFFS_BLOCK_SIZES
 };
 PedFileSystemType _affs5_type = {
        next:            NULL,
        ops:             &_affs5_ops,
        name:            "affs5",
-       block_sizes:      AFFS_BLOCK_SIZES
 };
 PedFileSystemType _affs6_type = {
        next:            NULL,
        ops:             &_affs6_ops,
        name:            "affs6",
-       block_sizes:      AFFS_BLOCK_SIZES
 };
 PedFileSystemType _affs7_type = {
        next:            NULL,
        ops:             &_affs7_ops,
        name:            "affs7",
-       block_sizes:      AFFS_BLOCK_SIZES
 };
 PedFileSystemType _amufs_type = {
        next:            NULL,
        ops:             &_amufs_ops,
        name:            "amufs",
-       block_sizes:      AMUFS_BLOCK_SIZES
 };
 PedFileSystemType _amufs0_type = {
        next:            NULL,
        ops:             &_amufs0_ops,
        name:            "amufs0",
-       block_sizes:      AMUFS_BLOCK_SIZES
 };
 PedFileSystemType _amufs1_type = {
        next:            NULL,
        ops:             &_amufs1_ops,
        name:            "amufs1",
-       block_sizes:      AMUFS_BLOCK_SIZES
 };
 PedFileSystemType _amufs2_type = {
        next:            NULL,
        ops:             &_amufs2_ops,
        name:            "amufs2",
-       block_sizes:      AMUFS_BLOCK_SIZES
 };
 PedFileSystemType _amufs3_type = {
        next:            NULL,
        ops:             &_amufs3_ops,
        name:            "amufs3",
-       block_sizes:      AMUFS_BLOCK_SIZES
 };
 PedFileSystemType _amufs4_type = {
        next:            NULL,
        ops:             &_amufs4_ops,
        name:            "amufs4",
-       block_sizes:      AMUFS_BLOCK_SIZES
 };
 PedFileSystemType _amufs5_type = {
        next:            NULL,
        ops:             &_amufs5_ops,
        name:            "amufs5",
-       block_sizes:      AMUFS_BLOCK_SIZES
 };
diff --git a/libparted/fs/amiga/apfs.c b/libparted/fs/amiga/apfs.c
index 9f9e6e0..2d2cbe1 100644
--- a/libparted/fs/amiga/apfs.c
+++ b/libparted/fs/amiga/apfs.c
@@ -48,6 +48,8 @@ _generic_apfs_probe (PedGeometry* geom, uint32_t kind)
 
        PED_ASSERT (geom != NULL);
        PED_ASSERT (geom->dev != NULL);
+       if (geom->dev->sector_size != 512)
+               return NULL;
 
        /* Finds the blocksize and reserved values of the partition block */
        if (!(part = ped_malloc (PED_SECTOR_SIZE_DEFAULT*blocksize))) {
@@ -113,17 +115,13 @@ static PedFileSystemOps _apfs2_ops = {
        probe:          _apfs2_probe,
 };
 
-#define APFS_BLOCK_SIZES ((int[2]){512, 0})
-
 PedFileSystemType _apfs1_type = {
        next:            NULL,
        ops:             &_apfs1_ops,
        name:            "apfs1",
-       block_sizes:      APFS_BLOCK_SIZES
 };
 PedFileSystemType _apfs2_type = {
        next:            NULL,
        ops:             &_apfs2_ops,
        name:            "apfs2",
-       block_sizes:      APFS_BLOCK_SIZES
 };
diff --git a/libparted/fs/amiga/asfs.c b/libparted/fs/amiga/asfs.c
index f7b4ed0..5824881 100644
--- a/libparted/fs/amiga/asfs.c
+++ b/libparted/fs/amiga/asfs.c
@@ -62,6 +62,8 @@ _asfs_probe (PedGeometry* geom)
 
        PED_ASSERT (geom != NULL);
        PED_ASSERT (geom->dev != NULL);
+       if (geom->dev->sector_size != 512)
+               return NULL;
 
        /* Finds the blocksize of the partition block */
        if (!(part = ped_malloc (PED_SECTOR_SIZE_DEFAULT*blocksize))) {
@@ -124,5 +126,4 @@ PedFileSystemType _asfs_type = {
        next:            NULL,
        ops:             &_asfs_ops,
        name:            "asfs",
-       block_sizes:      ((int[2]){512, 0})
 };
diff --git a/libparted/fs/ext2/interface.c b/libparted/fs/ext2/interface.c
index 97220b7..ecafb62 100644
--- a/libparted/fs/ext2/interface.c
+++ b/libparted/fs/ext2/interface.c
@@ -33,10 +33,12 @@ struct ext2_dev_handle* 
ext2_make_dev_handle_from_parted_geometry(PedGeometry* g
 static PedGeometry*
 _ext2_generic_probe (PedGeometry* geom, int expect_ext_ver)
 {
-       void *sb_v;
-       if (!ped_geometry_read_alloc(geom, &sb_v, 2, 2))
+       const int sectors = (4096 + geom->dev->sector_size - 1) /
+                            geom->dev->sector_size;
+       char *sb_v = alloca (sectors * geom->dev->sector_size);
+       if (!ped_geometry_read(geom, sb_v, 0, sectors))
                return NULL;
-       struct ext2_super_block *sb = sb_v;
+       struct ext2_super_block *sb = (struct ext2_super_block *)(sb_v + 1024);
 
        if (EXT2_SUPER_MAGIC(*sb) == EXT2_SUPER_MAGIC_CONST) {
                PedSector block_size = 1 << (EXT2_SUPER_LOG_BLOCK_SIZE(*sb) + 
1);
@@ -66,8 +68,6 @@ _ext2_generic_probe (PedGeometry* geom, int expect_ext_ver)
                        if (is_ext4)
                                is_ext3 = 0;
                }
-               free (sb);
-
                if (expect_ext_ver == 2 && (is_ext3 || is_ext4))
                        return NULL;
                if (expect_ext_ver == 3 && !is_ext3)
@@ -94,9 +94,6 @@ _ext2_generic_probe (PedGeometry* geom, int expect_ext_ver)
                                                 block_count * block_size);
                }
        }
-        else {
-               free (sb);
-        }
 
        return NULL;
 }
@@ -131,27 +128,22 @@ static PedFileSystemOps _ext4_ops = {
        probe:          _ext4_probe,
 };
 
-#define EXT23_BLOCK_SIZES ((int[6]){512, 1024, 2048, 4096, 8192, 0})
-
 static PedFileSystemType _ext2_type = {
        next:            NULL,
        ops:             &_ext2_ops,
        name:            "ext2",
-       block_sizes:      EXT23_BLOCK_SIZES
 };
 
 static PedFileSystemType _ext3_type = {
        next:            NULL,
        ops:             &_ext3_ops,
        name:            "ext3",
-       block_sizes:      EXT23_BLOCK_SIZES
 };
 
 static PedFileSystemType _ext4_type = {
        next:            NULL,
        ops:             &_ext4_ops,
        name:            "ext4",
-       block_sizes:      EXT23_BLOCK_SIZES
 };
 
 void ped_file_system_ext2_init ()
diff --git a/libparted/fs/fat/bootsector.c b/libparted/fs/fat/bootsector.c
index d4f8dc4..63b0e31 100644
--- a/libparted/fs/fat/bootsector.c
+++ b/libparted/fs/fat/bootsector.c
@@ -36,13 +36,14 @@
  * fat_boot_sector_probe_type() to work (or possibly crash on a divide-by-zero)
  */
 int
-fat_boot_sector_read (FatBootSector* bs, const PedGeometry *geom)
+fat_boot_sector_read (FatBootSector** bsp, const PedGeometry *geom)
 {
-       PED_ASSERT (bs != NULL);
+       PED_ASSERT (bsp != NULL);
        PED_ASSERT (geom != NULL);
 
-       if (!ped_geometry_read (geom, bs, 0, 1))
+       if (!ped_geometry_read_alloc (geom, (void **)bsp, 0, 1))
                return 0;
+       FatBootSector *bs = *bsp;
 
        if (PED_LE16_TO_CPU (bs->boot_sign) != 0xAA55) {
                ped_exception_throw (PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
@@ -58,14 +59,6 @@ fat_boot_sector_read (FatBootSector* bs, const PedGeometry 
*geom)
                return 0;
        }
 
-       if (!bs->sector_size
-            || PED_LE16_TO_CPU (bs->sector_size) % PED_SECTOR_SIZE_DEFAULT) {
-               ped_exception_throw (PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
-                       _("File system has an invalid sector size for a FAT "
-                         "file system."));
-               return 0;
-       }
-
        if (!bs->cluster_size) {
                ped_exception_throw (PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
                        _("File system has an invalid cluster size for a FAT "
@@ -149,18 +142,6 @@ fat_boot_sector_analyse (FatBootSector* bs, PedFileSystem* 
fs)
 
        PED_ASSERT (bs != NULL);
 
-       if (PED_LE16_TO_CPU (bs->sector_size) != 512) {
-               if (ped_exception_throw (
-                       PED_EXCEPTION_BUG,
-                       PED_EXCEPTION_IGNORE_CANCEL,
-                       _("This file system has a logical sector size of %d.  "
-                       "GNU Parted is known not to work properly with sector "
-                       "sizes other than 512 bytes."),
-                       (int) PED_LE16_TO_CPU (bs->sector_size))
-                               != PED_EXCEPTION_IGNORE)
-                       return 0;
-       }
-
        fs_info->logical_sector_size = PED_LE16_TO_CPU (bs->sector_size) / 512;
 
        fs_info->sectors_per_track = PED_LE16_TO_CPU (bs->secs_track);
@@ -259,10 +240,10 @@ fat_boot_sector_analyse (FatBootSector* bs, 
PedFileSystem* fs)
                fs_info->serial_number
                        = PED_LE32_TO_CPU (bs->u.fat32.serial_number);
                fs_info->info_sector_offset
-                   = PED_LE16_TO_CPU (fs_info->boot_sector.u.fat32.info_sector)
+                   = PED_LE16_TO_CPU 
(fs_info->boot_sector->u.fat32.info_sector)
                          * fs_info->logical_sector_size;
                fs_info->boot_sector_backup_offset
-                 = PED_LE16_TO_CPU (fs_info->boot_sector.u.fat32.backup_sector)
+                 = PED_LE16_TO_CPU 
(fs_info->boot_sector->u.fat32.backup_sector)
                          * fs_info->logical_sector_size;
                fs_info->root_cluster
                        = PED_LE32_TO_CPU (bs->u.fat32.root_dir_cluster);
@@ -287,30 +268,3 @@ fat_boot_sector_analyse (FatBootSector* bs, PedFileSystem* 
fs)
                = fs_info->cluster_size / sizeof (FatDirEntry);
        return 1;
 }
-
-#ifndef DISCOVER_ONLY
-
-int
-fat_info_sector_read (FatInfoSector* is, const PedFileSystem* fs)
-{
-       FatSpecific*    fs_info = FAT_SPECIFIC (fs);
-       int             status;
-
-       PED_ASSERT (is != NULL);
-
-       if (!ped_geometry_read (fs->geom, is, fs_info->info_sector_offset, 1))
-               return 0;
-
-       if (PED_LE32_TO_CPU (is->signature_2) != FAT32_INFO_MAGIC2) {
-               status = ped_exception_throw (PED_EXCEPTION_WARNING,
-                               PED_EXCEPTION_IGNORE_CANCEL,
-                               _("The information sector has the wrong "
-                               "signature (%x).  Select cancel for now, "
-                               "and send in a bug report.  If you're "
-                               "desperate, it's probably safe to ignore."),
-                               PED_LE32_TO_CPU (is->signature_2));
-               if (status == PED_EXCEPTION_CANCEL) return 0;
-       }
-       return 1;
-}
-#endif /* !DISCOVER_ONLY */
diff --git a/libparted/fs/fat/bootsector.h b/libparted/fs/fat/bootsector.h
index 3f84742..449427a 100644
--- a/libparted/fs/fat/bootsector.h
+++ b/libparted/fs/fat/bootsector.h
@@ -116,11 +116,10 @@ struct __attribute__ ((packed)) _FatInfoSector {
         uint16_t       signature_3;    /* should be 0xaa55 */
 };
 
-int fat_boot_sector_read (FatBootSector* bs, const PedGeometry* geom);
+int fat_boot_sector_read (FatBootSector** bs, const PedGeometry* geom);
 FatType fat_boot_sector_probe_type (const FatBootSector* bs,
                                    const PedGeometry* geom);
 int fat_boot_sector_analyse (FatBootSector* bs, PedFileSystem* fs);
 
-int fat_info_sector_read (FatInfoSector* is, const PedFileSystem* fs);
 
 #endif /* PED_FAT_BOOTSECTOR_H */
diff --git a/libparted/fs/fat/fat.c b/libparted/fs/fat/fat.c
index 95cbc8d..5a409b2 100644
--- a/libparted/fs/fat/fat.c
+++ b/libparted/fs/fat/fat.c
@@ -34,7 +34,9 @@ fat_alloc (const PedGeometry* geom)
        fs->type_specific = (FatSpecific*) ped_malloc (sizeof (FatSpecific));
        if (!fs->type_specific)
                goto error_free_fs;
-
+       FatSpecific* fs_info = (FatSpecific*) fs->type_specific;
+       fs_info->boot_sector = NULL;
+       fs_info->info_sector = NULL;
        fs->geom = ped_geometry_duplicate (geom);
        if (!fs->geom)
                goto error_free_type_specific;
@@ -53,6 +55,8 @@ error:
 void
 fat_free (PedFileSystem* fs)
 {
+       FatSpecific* fs_info = (FatSpecific*) fs->type_specific;
+       free (fs_info->boot_sector);
        ped_geometry_destroy (fs->geom);
        free (fs->type_specific);
        free (fs);
@@ -72,7 +76,7 @@ fat_probe (PedGeometry* geom, FatType* fat_type)
 
        if (!fat_boot_sector_read (&fs_info->boot_sector, geom))
                goto error_free_fs;
-       if (!fat_boot_sector_analyse (&fs_info->boot_sector, fs))
+       if (!fat_boot_sector_analyse (fs_info->boot_sector, fs))
                goto error_free_fs;
 
        *fat_type = fs_info->fat_type;
@@ -124,20 +128,16 @@ static PedFileSystemOps fat32_ops = {
        probe:          fat_probe_fat32,
 };
 
-#define FAT_BLOCK_SIZES ((int[2]){512, 0})
-
 PedFileSystemType fat16_type = {
        next:           NULL,
        ops:            &fat16_ops,
        name:           "fat16",
-        block_sizes:    FAT_BLOCK_SIZES
 };
 
 PedFileSystemType fat32_type = {
        next:           NULL,
        ops:            &fat32_ops,
        name:           "fat32",
-        block_sizes:    FAT_BLOCK_SIZES
 };
 
 void
diff --git a/libparted/fs/fat/fat.h b/libparted/fs/fat/fat.h
index 437a020..2265871 100644
--- a/libparted/fs/fat/fat.h
+++ b/libparted/fs/fat/fat.h
@@ -84,8 +84,8 @@ struct __attribute__ ((packed)) _FatDirEntry {
 };
 
 struct _FatSpecific {
-       FatBootSector   boot_sector;    /* structure of boot sector */
-       FatInfoSector   info_sector;    /* fat32-only information sector */
+       FatBootSector   *boot_sector;    /* structure of boot sector */
+       FatInfoSector   *info_sector;    /* fat32-only information sector */
 
        int             logical_sector_size;    /* illogical sector size :-) */
        PedSector       sector_count;
diff --git a/libparted/fs/hfs/hfs.c b/libparted/fs/hfs/hfs.c
index 40c8173..e5396b2 100644
--- a/libparted/fs/hfs/hfs.c
+++ b/libparted/fs/hfs/hfs.c
@@ -44,10 +44,6 @@ uint8_t* hfsp_block = NULL;
 unsigned hfs_block_count;
 unsigned hfsp_block_count;
 
-#define HFS_BLOCK_SIZES       ((int[2]){512, 0})
-#define HFSP_BLOCK_SIZES       ((int[2]){512, 0})
-#define HFSX_BLOCK_SIZES       ((int[2]){512, 0})
-
 static PedFileSystemOps hfs_ops = {
        probe:          hfs_probe,
 };
@@ -65,21 +61,18 @@ static PedFileSystemType hfs_type = {
        next:   NULL,
        ops:    &hfs_ops,
        name:   "hfs",
-       block_sizes: HFS_BLOCK_SIZES
 };
 
 static PedFileSystemType hfsplus_type = {
        next:   NULL,
        ops:    &hfsplus_ops,
        name:   "hfs+",
-       block_sizes: HFSP_BLOCK_SIZES
 };
 
 static PedFileSystemType hfsx_type = {
        next:   NULL,
        ops:    &hfsx_ops,
        name:   "hfsx",
-       block_sizes: HFSX_BLOCK_SIZES
 };
 
 void
diff --git a/libparted/fs/hfs/probe.c b/libparted/fs/hfs/probe.c
index ad79a64..c4dca5e 100644
--- a/libparted/fs/hfs/probe.c
+++ b/libparted/fs/hfs/probe.c
@@ -62,7 +62,6 @@ it is in fact a wrapper to an HFS+ volume */
 PedGeometry*
 hfs_and_wrapper_probe (PedGeometry* geom)
 {
-       uint8_t         buf[PED_SECTOR_SIZE_DEFAULT];
        HfsMasterDirectoryBlock *mdb;
        PedGeometry*    geom_ret;
        PedSector       search, max;
@@ -70,18 +69,22 @@ hfs_and_wrapper_probe (PedGeometry* geom)
        PED_ASSERT (geom != NULL);
        PED_ASSERT (hfsc_can_use_geom (geom));
 
-       mdb = (HfsMasterDirectoryBlock *) buf;
+       const int       sectors = ((3 * 512) + geom->dev->sector_size - 1) /
+                                  geom->dev->sector_size;
+       char *          buf = alloca (sectors * geom->dev->sector_size);
+
+       mdb = (HfsMasterDirectoryBlock *)(buf+1024);
 
        /* is 5 an intelligent value ? */
        if ((geom->length < 5)
-           || (!ped_geometry_read (geom, buf, 2, 1))
+           || (!ped_geometry_read (geom, buf, 0, sectors))
            || (mdb->signature != PED_CPU_TO_BE16 (HFS_SIGNATURE)) )
                return NULL;
 
        search = ((PedSector) PED_BE16_TO_CPU (mdb->start_block)
                  + ((PedSector) PED_BE16_TO_CPU (mdb->total_blocks)
-                    * (PED_BE32_TO_CPU (mdb->block_size) / 
PED_SECTOR_SIZE_DEFAULT )));
-       max = search + (PED_BE32_TO_CPU (mdb->block_size) / 
PED_SECTOR_SIZE_DEFAULT);
+                    * (PED_BE32_TO_CPU (mdb->block_size) / 
geom->dev->sector_size)));
+       max = search + (PED_BE32_TO_CPU (mdb->block_size) / 
geom->dev->sector_size);
        if ((search < 0)
            || !(geom_ret = ped_geometry_new (geom->dev, geom->start, search + 
2)))
                return NULL;
diff --git a/libparted/fs/jfs/jfs.c b/libparted/fs/jfs/jfs.c
index 803c241..c271285 100644
--- a/libparted/fs/jfs/jfs.c
+++ b/libparted/fs/jfs/jfs.c
@@ -25,7 +25,7 @@
 #include "jfs_types.h"
 #include "jfs_superblock.h"
 
-#define JFS_SUPER_SECTOR 64
+#define JFS_SUPER_OFFSET 32768
 
 #if ENABLE_NLS
 #  include <libintl.h>
@@ -34,31 +34,23 @@
 #  define _(String) (String)
 #endif /* ENABLE_NLS */
 
-#define JFS_BLOCK_SIZES                ((int[2]){512, 0})
-
 static PedGeometry*
 jfs_probe (PedGeometry* geom)
 {
-       union {
-               struct superblock       sb;
-               char                    bytes[512];
-       } buf;
-
-        /* FIXME: for now, don't even try to deal with larger sector size.  */
-       if (geom->dev->sector_size != PED_SECTOR_SIZE_DEFAULT)
-               return NULL;
+       struct superblock *sb = (struct superblock *)alloca 
(geom->dev->sector_size);
 
-       if (geom->length < JFS_SUPER_SECTOR + 1)
+       if (geom->length * geom->dev->sector_size < JFS_SUPER_OFFSET)
                return NULL;
-       if (!ped_geometry_read (geom, &buf, JFS_SUPER_SECTOR, 1))
+       if (!ped_geometry_read (geom, sb, JFS_SUPER_OFFSET / 
geom->dev->sector_size, 1))
                return NULL;
 
-       if (strncmp (buf.sb.s_magic, JFS_MAGIC, 4) == 0) {
-               PedSector block_size = PED_LE32_TO_CPU (buf.sb.s_pbsize) / 512;
-               PedSector block_count = PED_LE64_TO_CPU (buf.sb.s_size);
-
+       if (strncmp (sb->s_magic, JFS_MAGIC, 4) == 0) {
+               PedSector block_size = PED_LE32_TO_CPU (sb->s_pbsize);
+               PedSector block_count = PED_LE64_TO_CPU (sb->s_size);
+               /* apparently jfs is retarded and always claims 512 byte
+                  sectors, with the block count as a multiple of that */
                return ped_geometry_new (geom->dev, geom->start,
-                                        block_size * block_count);
+                                        block_size * block_count / 
geom->dev->sector_size);
        } else {
                return NULL;
        }
@@ -72,7 +64,6 @@ static PedFileSystemType jfs_type = {
        next:   NULL,
        ops:    &jfs_ops,
        name:   "jfs",
-       block_sizes: JFS_BLOCK_SIZES
 };
 
 void
diff --git a/libparted/fs/linux_swap/linux_swap.c 
b/libparted/fs/linux_swap/linux_swap.c
index bbc034d..0621fa0 100644
--- a/libparted/fs/linux_swap/linux_swap.c
+++ b/libparted/fs/linux_swap/linux_swap.c
@@ -86,11 +86,6 @@ _generic_swap_probe (PedGeometry* geom, int kind)
        PedGeometry*    probed_geom;
        PedSector       length;
 
-        /* Fail the swap-file-system-recognizing test when sector size
-           is not the default.  */
-       if (geom->dev->sector_size != PED_SECTOR_SIZE_DEFAULT)
-               return NULL;
-
         switch (kind) {
         /* Check for old style swap partitions. */
                 case 0:
@@ -132,30 +127,18 @@ error:
 
 
 static int
-swap_init (PedFileSystem* fs, int fresh)
+swap_init (PedFileSystem* fs)
 {
        SwapSpecific*   fs_info = SWAP_SPECIFIC (fs);
 
-       fs_info->page_sectors = getpagesize () / 512;
+       fs_info->page_sectors = getpagesize () / fs->geom->dev->sector_size;
        fs_info->page_count = fs->geom->length / fs_info->page_sectors;
        fs_info->version = 1;
        fs_info->max_bad_pages = (getpagesize()
                                        - sizeof (SwapNewHeader)) / 4;
 
-       if (fresh) {
-               uuid_t uuid_dat;
-
-               memset (fs_info->header, 0, getpagesize());
-
-               /* version is always 1 here */
-               uuid_generate (uuid_dat);
-               memcpy (fs_info->header->new.sws_uuid, uuid_dat,
-                       sizeof (fs_info->header->new.sws_uuid));
-                return 1;
-        }
-       else
-                return ped_geometry_read (fs->geom, fs_info->header,
-                                          0, fs_info->page_sectors);
+       return ped_geometry_read (fs->geom, fs_info->header,
+                                 0, fs_info->page_sectors);
 }
 
 
@@ -174,7 +157,7 @@ swap_alloc (PedGeometry* geom)
                goto error_free_fs;
 
        fs_info = SWAP_SPECIFIC (fs);
-       fs_info->header = ped_malloc (getpagesize());
+       fs_info->header = ped_malloc (PED_MAX(getpagesize(), 
geom->dev->sector_size));
        if (!fs_info->header)
                goto error_free_type_specific;
 
@@ -225,7 +208,7 @@ _swap_v0_open (PedGeometry* geom)
        fs = swap_alloc (geom);
        if (!fs)
                goto error;
-       swap_init (fs, 0);
+       swap_init (fs);
 
        fs_info = SWAP_SPECIFIC (fs);
        if (!ped_geometry_read (fs->geom, fs_info->header, 0,
@@ -267,12 +250,7 @@ _swap_v1_open (PedGeometry* geom)
        fs = swap_alloc (geom);
        if (!fs)
                goto error;
-/*     swap_init (fs, 0); */
-
-/*     fs_info = SWAP_SPECIFIC (fs); */
-/*     if (!ped_geometry_read (fs->geom, fs_info->header, 0, */
-/*                             fs_info->page_sectors)) */
-        if (!swap_init(fs, 0))
+        if (!swap_init(fs))
                goto error_free_fs;
 
         fs_info = SWAP_SPECIFIC (fs);
@@ -311,7 +289,7 @@ _swap_swsusp_open (PedGeometry* geom)
        if (!fs)
                goto error;
         fs->type = &_swap_swsusp_type;
-       swap_init (fs, 0);
+       swap_init (fs);
 
        fs_info = SWAP_SPECIFIC (fs);
        if (!ped_geometry_read (fs->geom, fs_info->header, 0,
@@ -378,21 +356,18 @@ static PedFileSystemType _swap_v0_type = {
        next:   NULL,
        ops:    &_swap_v0_ops,
        name:   "linux-swap(v0)",
-       block_sizes: LINUXSWAP_BLOCK_SIZES
 };
 
 static PedFileSystemType _swap_v1_type = {
        next:   NULL,
        ops:    &_swap_v1_ops,
        name:   "linux-swap(v1)",
-       block_sizes: LINUXSWAP_BLOCK_SIZES
 };
 
 static PedFileSystemType _swap_swsusp_type = {
         next:   NULL,
        ops:    &_swap_swsusp_ops,
        name:   "swsusp",
-        block_sizes: LINUXSWAP_BLOCK_SIZES
 };
 
 void
diff --git a/libparted/fs/nilfs2/nilfs2.c b/libparted/fs/nilfs2/nilfs2.c
index bb0a84e..0ec5867 100644
--- a/libparted/fs/nilfs2/nilfs2.c
+++ b/libparted/fs/nilfs2/nilfs2.c
@@ -103,38 +103,31 @@ is_valid_nilfs_sb(struct nilfs2_super_block *sb)
 PedGeometry*
 nilfs2_probe (PedGeometry* geom)
 {
-       void *sb_v;
-       void *sb2_v;
        struct nilfs2_super_block *sb = NULL;
        struct nilfs2_super_block *sb2 = NULL;
-       PedSector length = geom->length;
+       PedSector length = geom->length * (geom->dev->sector_size / 512);
 
-       /* ignore if sector size is not 512bytes for now  */
-       if (geom->dev->sector_size != PED_SECTOR_SIZE_DEFAULT)
-               return NULL;
-
-       PedSector sb2off = NILFS_SB2_OFFSET(length);
+       PedSector sb2off = NILFS_SB2_OFFSET(length) / (geom->dev->sector_size / 
512);
        if (sb2off <= 2)
                return NULL;
+       const int sectors = (4096 + geom->dev->sector_size - 1) /
+                            geom->dev->sector_size;
+       char *buf = alloca (sectors * geom->dev->sector_size);
+       void *buff2 = alloca (geom->dev->sector_size);
 
-       if (ped_geometry_read_alloc(geom, &sb_v, 2, 1))
-               sb = sb_v;
-
-       if (ped_geometry_read_alloc(geom, &sb2_v, sb2off, 1))
-               sb2 = sb2_v;
+       if (ped_geometry_read(geom, buf, 0, sectors))
+               sb = (struct nilfs2_super_block *)(buf+1024);
+       if (ped_geometry_read(geom, buff2, sb2off, 1))
+               sb2 = buff2;
 
        if ((!sb || !is_valid_nilfs_sb(sb)) &&
-           (!sb2 || !is_valid_nilfs_sb(sb2)) ) {
-               free(sb);
-               free(sb2);
+           (!sb2 || !is_valid_nilfs_sb(sb2)) )
                return NULL;
-       }
 
        /* reserve 4k bytes for secondary superblock */
-       length = sb2off + 8;
+       length = sb2off + ((4096 + geom->dev->sector_size - 1) /
+                          geom->dev->sector_size);
 
-       free(sb);
-       free(sb2);
        return ped_geometry_new(geom->dev, geom->start, length);
 }
 
@@ -142,13 +135,10 @@ static PedFileSystemOps nilfs2_ops = {
        probe:                  nilfs2_probe,
 };
 
-#define NILFS2_BLOCK_SIZES ((int[5]){1024, 2048, 4096, 8192, 0})
-
 static PedFileSystemType nilfs2_type = {
        next:   NULL,
        ops:    &nilfs2_ops,
        name:   "nilfs2",
-       block_sizes: NILFS2_BLOCK_SIZES
 };
 
 void
diff --git a/libparted/fs/ntfs/ntfs.c b/libparted/fs/ntfs/ntfs.c
index 19e990a..4c154fd 100644
--- a/libparted/fs/ntfs/ntfs.c
+++ b/libparted/fs/ntfs/ntfs.c
@@ -30,24 +30,22 @@
 
 #include <unistd.h>
 
-#define NTFS_BLOCK_SIZES       ((int[2]){512, 0})
-
 #define NTFS_SIGNATURE "NTFS"
 
 PedGeometry*
 ntfs_probe (PedGeometry* geom)
 {
-       char    buf[512];
+       char    *buf = alloca (geom->dev->sector_size);
+       PedGeometry *newg = NULL;
 
-       if (!ped_geometry_read (geom, buf, 0, 1))
+       if (!ped_geometry_read(geom, buf, 0, 1))
                return 0;
 
        if (strncmp (NTFS_SIGNATURE, buf + 3, strlen (NTFS_SIGNATURE)) == 0)
-               return ped_geometry_new (geom->dev, geom->start,
+               newg = ped_geometry_new (geom->dev, geom->start,
                                         PED_LE64_TO_CPU (*(uint64_t*)
                                                          (buf + 0x28)));
-       else
-               return NULL;
+       return newg;
 }
 
 static PedFileSystemOps ntfs_ops = {
@@ -58,7 +56,6 @@ static PedFileSystemType ntfs_type = {
        next:   NULL,
        ops:    &ntfs_ops,
        name:   "ntfs",
-       block_sizes: NTFS_BLOCK_SIZES
 };
 
 void
diff --git a/libparted/fs/r/fat/bootsector.c b/libparted/fs/r/fat/bootsector.c
index 07b39cf..6c6e33d 100644
--- a/libparted/fs/r/fat/bootsector.c
+++ b/libparted/fs/r/fat/bootsector.c
@@ -36,14 +36,14 @@
  * fat_boot_sector_probe_type() to work (or possibly crash on a divide-by-zero)
  */
 int
-fat_boot_sector_read (FatBootSector* bs, const PedGeometry *geom)
+fat_boot_sector_read (FatBootSector** bsp, const PedGeometry *geom)
 {
-       PED_ASSERT (bs != NULL);
+       PED_ASSERT (bsp != NULL);
        PED_ASSERT (geom != NULL);
 
-       if (!ped_geometry_read (geom, bs, 0, 1))
+       if (!ped_geometry_read_alloc (geom, (void **)bsp, 0, 1))
                return 0;
-
+       FatBootSector *bs = *bsp;
        if (PED_LE16_TO_CPU (bs->boot_sign) != 0xAA55) {
                ped_exception_throw (PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
                        _("File system has an invalid signature for a FAT "
@@ -257,10 +257,10 @@ fat_boot_sector_analyse (FatBootSector* bs, 
PedFileSystem* fs)
                fs_info->serial_number
                        = PED_LE32_TO_CPU (bs->u.fat32.serial_number);
                fs_info->info_sector_offset
-                   = PED_LE16_TO_CPU (fs_info->boot_sector.u.fat32.info_sector)
+                   = PED_LE16_TO_CPU 
(fs_info->boot_sector->u.fat32.info_sector)
                          * fs_info->logical_sector_size;
                fs_info->boot_sector_backup_offset
-                 = PED_LE16_TO_CPU (fs_info->boot_sector.u.fat32.backup_sector)
+                 = PED_LE16_TO_CPU 
(fs_info->boot_sector->u.fat32.backup_sector)
                          * fs_info->logical_sector_size;
                fs_info->root_cluster
                        = PED_LE32_TO_CPU (bs->u.fat32.root_dir_cluster);
@@ -299,11 +299,13 @@ fat_boot_sector_set_boot_code (FatBootSector* bs)
 }
 
 int
-fat_boot_sector_generate (FatBootSector* bs, const PedFileSystem* fs)
+fat_boot_sector_generate (FatBootSector** bsp, const PedFileSystem* fs)
 {
        FatSpecific*    fs_info = FAT_SPECIFIC (fs);
 
-       PED_ASSERT (bs != NULL);
+       PED_ASSERT (bsp != NULL);
+       *bsp = ped_malloc (fs->geom->dev->sector_size);
+       FatBootSector *bs = *bsp;
 
        memcpy (bs->system_id, "MSWIN4.1", 8);
        bs->sector_size = PED_CPU_TO_LE16 (fs_info->logical_sector_size * 512);
@@ -395,16 +397,16 @@ fat_boot_sector_write (const FatBootSector* bs, 
PedFileSystem* fs)
 }
 
 int
-fat_info_sector_read (FatInfoSector* is, const PedFileSystem* fs)
+fat_info_sector_read (FatInfoSector** isp, const PedFileSystem* fs)
 {
        FatSpecific*    fs_info = FAT_SPECIFIC (fs);
        int             status;
 
-       PED_ASSERT (is != NULL);
+       PED_ASSERT (isp != NULL);
 
-       if (!ped_geometry_read (fs->geom, is, fs_info->info_sector_offset, 1))
+       if (!ped_geometry_read_alloc (fs->geom, (void **)isp, 
fs_info->info_sector_offset, 1))
                return 0;
-
+       FatInfoSector *is = *isp;
        if (PED_LE32_TO_CPU (is->signature_2) != FAT32_INFO_MAGIC2) {
                status = ped_exception_throw (PED_EXCEPTION_WARNING,
                                PED_EXCEPTION_IGNORE_CANCEL,
@@ -419,11 +421,13 @@ fat_info_sector_read (FatInfoSector* is, const 
PedFileSystem* fs)
 }
 
 int
-fat_info_sector_generate (FatInfoSector* is, const PedFileSystem* fs)
+fat_info_sector_generate (FatInfoSector** isp, const PedFileSystem* fs)
 {
        FatSpecific*    fs_info = FAT_SPECIFIC (fs);
 
-       PED_ASSERT (is != NULL);
+       PED_ASSERT (isp != NULL);
+       *isp = ped_malloc (fs->geom->dev->sector_size);
+       FatInfoSector *is = *isp;
 
        fat_table_count_stats (fs_info->fat);
 
diff --git a/libparted/fs/r/fat/bootsector.h b/libparted/fs/r/fat/bootsector.h
index ec367c3..6e8b9ce 100644
--- a/libparted/fs/r/fat/bootsector.h
+++ b/libparted/fs/r/fat/bootsector.h
@@ -116,16 +116,16 @@ struct __attribute__ ((packed)) _FatInfoSector {
         uint16_t       signature_3;    /* should be 0xaa55 */
 };
 
-int fat_boot_sector_read (FatBootSector* bs, const PedGeometry* geom);
+int fat_boot_sector_read (FatBootSector** bs, const PedGeometry* geom);
 FatType fat_boot_sector_probe_type (const FatBootSector* bs,
                                    const PedGeometry* geom);
 int fat_boot_sector_analyse (FatBootSector* bs, PedFileSystem* fs);
 int fat_boot_sector_set_boot_code (FatBootSector* bs);
-int fat_boot_sector_generate (FatBootSector* bs, const PedFileSystem* fs);
+int fat_boot_sector_generate (FatBootSector** bs, const PedFileSystem* fs);
 int fat_boot_sector_write (const FatBootSector* bs, PedFileSystem* fs);
 
-int fat_info_sector_read (FatInfoSector* is, const PedFileSystem* fs);
-int fat_info_sector_generate (FatInfoSector* is, const PedFileSystem* fs);
+int fat_info_sector_read (FatInfoSector** is, const PedFileSystem* fs);
+int fat_info_sector_generate (FatInfoSector** is, const PedFileSystem* fs);
 int fat_info_sector_write (const FatInfoSector* is, PedFileSystem* fs);
 
 #endif /* PED_FAT_BOOTSECTOR_H */
diff --git a/libparted/fs/r/fat/fat.c b/libparted/fs/r/fat/fat.c
index c8e4552..fdc1ecc 100644
--- a/libparted/fs/r/fat/fat.c
+++ b/libparted/fs/r/fat/fat.c
@@ -112,19 +112,22 @@ fat_set_frag_sectors (PedFileSystem* fs, PedSector 
frag_sectors)
 int
 fat_clobber (PedGeometry* geom)
 {
-       FatBootSector           boot_sector;
+       FatBootSector *boot_sector;
+       int ok;
 
        if (!fat_boot_sector_read (&boot_sector, geom))
                return 1;
 
-       boot_sector.system_id[0] = 0;
-       boot_sector.boot_sign = 0;
-       if (boot_sector.u.fat16.fat_name[0] == 'F')
-               boot_sector.u.fat16.fat_name[0] = 0;
-       if (boot_sector.u.fat32.fat_name[0] == 'F')
-               boot_sector.u.fat32.fat_name[0] = 0;
+       boot_sector->system_id[0] = 0;
+       boot_sector->boot_sign = 0;
+       if (boot_sector->u.fat16.fat_name[0] == 'F')
+               boot_sector->u.fat16.fat_name[0] = 0;
+       if (boot_sector->u.fat32.fat_name[0] == 'F')
+               boot_sector->u.fat32.fat_name[0] = 0;
 
-        return ped_geometry_write (geom, &boot_sector, 0, 1);
+        ok = ped_geometry_write (geom, boot_sector, 0, 1);
+       free (boot_sector);
+       return ok;
 }
 
 static int
@@ -163,7 +166,7 @@ fat_open (PedGeometry* geom)
 
        if (!fat_boot_sector_read (&fs_info->boot_sector, geom))
                goto error_free_fs;
-       if (!fat_boot_sector_analyse (&fs_info->boot_sector, fs))
+       if (!fat_boot_sector_analyse (fs_info->boot_sector, fs))
                goto error_free_fs;
        fs->type = (fs_info->fat_type == FAT_TYPE_FAT16)
                                ? &fat16_type
@@ -303,16 +306,16 @@ fat_create (PedGeometry* geom, FatType fat_type, 
PedTimer* timer)
 
        fs_info->serial_number = generate_random_uint32 ();
 
-       if (!fat_boot_sector_set_boot_code (&fs_info->boot_sector))
+       if (!fat_boot_sector_set_boot_code (fs_info->boot_sector))
                goto error_free_buffers;
        if (!fat_boot_sector_generate (&fs_info->boot_sector, fs))
                goto error_free_buffers;
-       if (!fat_boot_sector_write (&fs_info->boot_sector, fs))
+       if (!fat_boot_sector_write (fs_info->boot_sector, fs))
                goto error_free_buffers;
        if (fs_info->fat_type == FAT_TYPE_FAT32) {
                if (!fat_info_sector_generate (&fs_info->info_sector, fs))
                        goto error_free_buffers;
-               if (!fat_info_sector_write (&fs_info->info_sector, fs))
+               if (!fat_info_sector_write (fs_info->info_sector, fs))
                        goto error_free_buffers;
        }
 
@@ -469,7 +472,7 @@ fat_check (PedFileSystem* fs, PedTimer* timer)
 
        if (fs_info->fat_type == FAT_TYPE_FAT32) {
                info_free_clusters
-                       = PED_LE32_TO_CPU (fs_info->info_sector.free_clusters);
+                       = PED_LE32_TO_CPU (fs_info->info_sector->free_clusters);
                if (info_free_clusters != (FatCluster) -1
                    && info_free_clusters != fs_info->fat->free_cluster_count) {
                        if (ped_exception_throw (PED_EXCEPTION_WARNING,
diff --git a/libparted/fs/r/fat/fat.h b/libparted/fs/r/fat/fat.h
index d2ac2aa..943c5e5 100644
--- a/libparted/fs/r/fat/fat.h
+++ b/libparted/fs/r/fat/fat.h
@@ -77,8 +77,8 @@ struct __attribute__ ((packed)) _FatDirEntry {
 };
 
 struct _FatSpecific {
-       FatBootSector   boot_sector;    /* structure of boot sector */
-       FatInfoSector   info_sector;    /* fat32-only information sector */
+       FatBootSector   *boot_sector;    /* structure of boot sector */
+       FatInfoSector   *info_sector;    /* fat32-only information sector */
 
        int             logical_sector_size;    /* illogical sector size :-) */
        PedSector       sector_count;
diff --git a/libparted/fs/r/fat/resize.c b/libparted/fs/r/fat/resize.c
index 2b68a8b..f3439ac 100644
--- a/libparted/fs/r/fat/resize.c
+++ b/libparted/fs/r/fat/resize.c
@@ -857,10 +857,10 @@ fat_resize (PedFileSystem* fs, PedGeometry* geom, 
PedTimer* timer)
 
        _copy_hidden_sectors (ctx);
        fat_boot_sector_generate (&new_fs_info->boot_sector, new_fs);
-       fat_boot_sector_write (&new_fs_info->boot_sector, new_fs);
+       fat_boot_sector_write (new_fs_info->boot_sector, new_fs);
        if (new_fs_info->fat_type == FAT_TYPE_FAT32) {
                fat_info_sector_generate (&new_fs_info->info_sector, new_fs);
-               fat_info_sector_write (&new_fs_info->info_sector, new_fs);
+               fat_info_sector_write (new_fs_info->info_sector, new_fs);
        }
 
        if (!resize_context_assimilate (ctx))
diff --git a/libparted/fs/r/fat/table.c b/libparted/fs/r/fat/table.c
index 974dea8..62bc3b3 100644
--- a/libparted/fs/r/fat/table.c
+++ b/libparted/fs/r/fat/table.c
@@ -129,7 +129,7 @@ fat_table_read (FatTable* ft, const PedFileSystem* fs, int 
table_num)
                                fs_info->fat_sectors))
                return 0;
 
-        if ( *((unsigned char*) ft->table) != fs_info->boot_sector.media) {
+        if ( *((unsigned char*) ft->table) != fs_info->boot_sector->media) {
                if (ped_exception_throw (
                        PED_EXCEPTION_ERROR,
                        PED_EXCEPTION_IGNORE_CANCEL,
@@ -137,7 +137,7 @@ fat_table_read (FatTable* ft, const PedFileSystem* fs, int 
table_num)
                          "media %x.  You should probably run scandisk."),
                        (int) table_num + 1,
                        (int) *((unsigned char*) ft->table),
-                       (int) fs_info->boot_sector.media)
+                       (int) fs_info->boot_sector->media)
                                != PED_EXCEPTION_IGNORE)
                        return 0;
         }
diff --git a/libparted/fs/reiserfs/reiserfs.c b/libparted/fs/reiserfs/reiserfs.c
index 21d4272..838b2fb 100644
--- a/libparted/fs/reiserfs/reiserfs.c
+++ b/libparted/fs/reiserfs/reiserfs.c
@@ -46,8 +46,6 @@
 
 #include "reiserfs.h"
 
-#define REISERFS_BLOCK_SIZES       ((int[2]){512, 0})
-
 static PedSector reiserfs_super_offset[] = { 128, 16, -1 };
 static PedFileSystemType* reiserfs_type;
 
@@ -57,29 +55,29 @@ static PedFileSystemType* reiserfs_type;
 static PedGeometry *reiserfs_probe(PedGeometry *geom)
 {
        int i;
-       reiserfs_super_block_t sb;
 
        PED_ASSERT(geom != NULL);
+       reiserfs_super_block_t *sb =
+               (reiserfs_super_block_t *)alloca (geom->dev->sector_size);
 
        for (i = 0; reiserfs_super_offset[i] != -1; i++) {
                if (reiserfs_super_offset[i] >= geom->length)
                        continue;
-               if (!ped_geometry_read (geom, &sb, reiserfs_super_offset[i], 1))
+               if (!ped_geometry_read (geom, sb, reiserfs_super_offset[i], 1))
                        continue;
 
-               if (strncmp(REISERFS_SIGNATURE, sb.s_magic,
+               if (strncmp(REISERFS_SIGNATURE, sb->s_magic,
                            strlen(REISERFS_SIGNATURE)) == 0
-                   || strncmp(REISER2FS_SIGNATURE, sb.s_magic,
+                   || strncmp(REISER2FS_SIGNATURE, sb->s_magic,
                               strlen(REISER2FS_SIGNATURE)) == 0
-                   || strncmp(REISER3FS_SIGNATURE, sb.s_magic,
+                   || strncmp(REISER3FS_SIGNATURE, sb->s_magic,
                               strlen(REISER3FS_SIGNATURE)) == 0) {
                        PedSector block_size;
                        PedSector block_count;
 
-                       block_size = PED_LE16_TO_CPU(sb.s_blocksize)
-                                       / PED_SECTOR_SIZE_DEFAULT;
-                       block_count = PED_LE32_TO_CPU(sb.s_block_count);
-
+                       block_size = PED_LE16_TO_CPU(sb->s_blocksize)
+                                       / geom->dev->sector_size;
+                       block_count = PED_LE32_TO_CPU(sb->s_block_count);
                        return ped_geometry_new(geom->dev, geom->start,
                                                block_size * block_count);
                }
@@ -88,8 +86,6 @@ static PedGeometry *reiserfs_probe(PedGeometry *geom)
 }
 
 
-#define REISER_BLOCK_SIZES ((int[]){512, 1024, 2048, 4096, 8192, 0})
-
 static PedFileSystemOps reiserfs_simple_ops = {
        probe:          reiserfs_probe,
 };
@@ -98,7 +94,6 @@ static PedFileSystemType reiserfs_simple_type = {
        next:           NULL,
        ops:            &reiserfs_simple_ops,
        name:           "reiserfs",
-        block_sizes:    REISER_BLOCK_SIZES
 };
 
 void ped_file_system_reiserfs_init()
diff --git a/libparted/fs/ufs/ufs.c b/libparted/fs/ufs/ufs.c
index b668d7b..a75c082 100644
--- a/libparted/fs/ufs/ufs.c
+++ b/libparted/fs/ufs/ufs.c
@@ -34,10 +34,6 @@
 #include <unistd.h>
 #include <string.h>
 
-#define SUN_UFS_BLOCK_SIZES       ((int[2]){512, 0})
-#define HP_UFS_BLOCK_SIZES        ((int[2]){512, 0})
-
-
 /* taken from ufs_fs.h in Linux */
 #define        UFS_MAXNAMLEN 255
 #define UFS_MAXMNTLEN 512
@@ -178,24 +174,26 @@ struct ufs_super_block {
 static PedGeometry*
 ufs_probe_sun (PedGeometry* geom)
 {
-       int8_t buf[512 * 3];
+       const int       sectors = ((3 * 512) + geom->dev->sector_size - 1) /
+                                  geom->dev->sector_size;
+       char *          buf = alloca (sectors * geom->dev->sector_size);
        struct ufs_super_block *sb;
 
        if (geom->length < 5)
                return 0;
-       if (!ped_geometry_read (geom, buf, 16, 3))
+       if (!ped_geometry_read (geom, buf, 16 * 512 / geom->dev->sector_size, 
sectors))
                return 0;
 
        sb = (struct ufs_super_block *)buf;
 
        if (PED_BE32_TO_CPU(sb->fs_magic) == UFS_MAGIC) {
-               PedSector block_size = PED_BE32_TO_CPU(sb->fs_bsize) / 512;
+               PedSector block_size = PED_BE32_TO_CPU(sb->fs_bsize) / 
geom->dev->sector_size;
                PedSector block_count = PED_BE32_TO_CPU(sb->fs_size);
                return ped_geometry_new (geom->dev, geom->start,
                                         block_size * block_count);
        }
        if (PED_LE32_TO_CPU(sb->fs_magic) == UFS_MAGIC) {
-               PedSector block_size = PED_LE32_TO_CPU(sb->fs_bsize) / 512;
+               PedSector block_size = PED_LE32_TO_CPU(sb->fs_bsize) / 
geom->dev->sector_size;
                PedSector block_count = PED_LE32_TO_CPU(sb->fs_size);
                return ped_geometry_new (geom->dev, geom->start,
                                         block_size * block_count);
@@ -206,14 +204,17 @@ ufs_probe_sun (PedGeometry* geom)
 static PedGeometry*
 ufs_probe_hp (PedGeometry* geom)
 {
-       int8_t buf[1536];
        struct ufs_super_block *sb;
        PedSector block_size;
        PedSector block_count;
 
        if (geom->length < 5)
                return 0;
-       if (!ped_geometry_read (geom, buf, 16, 3))
+       const int       sectors = ((3 * 512) + geom->dev->sector_size - 1) /
+                                  geom->dev->sector_size;
+       char *          buf = alloca (sectors * geom->dev->sector_size);
+
+       if (!ped_geometry_read (geom, buf, 16 * 512 / geom->dev->sector_size, 
sectors))
                return 0;
 
        sb = (struct ufs_super_block *)buf;
@@ -223,7 +224,7 @@ ufs_probe_hp (PedGeometry* geom)
                case UFS_MAGIC_LFN:
                case UFS_MAGIC_FEA:
                case UFS_MAGIC_4GB:
-                       block_size = PED_BE32_TO_CPU(sb->fs_bsize) / 512;
+                       block_size = PED_BE32_TO_CPU(sb->fs_bsize) / 
geom->dev->sector_size;
                        block_count = PED_BE32_TO_CPU(sb->fs_size);
                        return ped_geometry_new (geom->dev, geom->start,
                                                 block_size * block_count);
@@ -234,7 +235,7 @@ ufs_probe_hp (PedGeometry* geom)
                case UFS_MAGIC_LFN:
                case UFS_MAGIC_FEA:
                case UFS_MAGIC_4GB:
-                       block_size = PED_LE32_TO_CPU(sb->fs_bsize) / 512;
+                       block_size = PED_LE32_TO_CPU(sb->fs_bsize) / 
geom->dev->sector_size;
                        block_count = PED_LE32_TO_CPU(sb->fs_size);
                        return ped_geometry_new (geom->dev, geom->start,
                                                 block_size * block_count);
@@ -254,14 +255,12 @@ static PedFileSystemType ufs_type_sun = {
        next:   NULL,
        ops:    &ufs_ops_sun,
        name:   "sun-ufs",
-       block_sizes: SUN_UFS_BLOCK_SIZES
 };
 
 static PedFileSystemType ufs_type_hp = {
        next:   NULL,
        ops:    &ufs_ops_hp,
        name:   "hp-ufs",
-       block_sizes: HP_UFS_BLOCK_SIZES
 };
 
 void
diff --git a/libparted/fs/xfs/xfs.c b/libparted/fs/xfs/xfs.c
index 0062604..d4144f8 100644
--- a/libparted/fs/xfs/xfs.c
+++ b/libparted/fs/xfs/xfs.c
@@ -33,39 +33,34 @@
 #include "xfs_types.h"
 #include "xfs_sb.h"
 
-#define XFS_BLOCK_SIZES                ((int[2]){512, 0})
-
 static PedGeometry*
 xfs_probe (PedGeometry* geom)
 {
        PedSector       block_size;
        PedSector       block_count;
-       union {
-               struct xfs_sb   sb;
-               char            bytes [512];
-       } buf;
+       struct xfs_sb   *sb = (struct xfs_sb *)alloca (geom->dev->sector_size);
 
        if (geom->length < XFS_SB_DADDR + 1)
                return NULL;
-       if (!ped_geometry_read (geom, &buf, XFS_SB_DADDR, 1))
+       if (!ped_geometry_read (geom, sb, XFS_SB_DADDR, 1))
                return NULL;
 
-       if (PED_LE32_TO_CPU (buf.sb.sb_magicnum) == XFS_SB_MAGIC) {
-               block_size = PED_LE32_TO_CPU (buf.sb.sb_blocksize) / 512;
-               block_count = PED_LE64_TO_CPU (buf.sb.sb_dblocks);
+       if (PED_LE32_TO_CPU (sb->sb_magicnum) == XFS_SB_MAGIC) {
+               block_size = PED_LE32_TO_CPU (sb->sb_blocksize) / 
geom->dev->sector_size;
+               block_count = PED_LE64_TO_CPU (sb->sb_dblocks);
 
                return ped_geometry_new (geom->dev, geom->start,
                                         block_size * block_count);
        }
 
-       if (PED_BE32_TO_CPU (buf.sb.sb_magicnum) == XFS_SB_MAGIC) {
-               block_size = PED_BE32_TO_CPU (buf.sb.sb_blocksize) / 512;
-               block_count = PED_BE64_TO_CPU (buf.sb.sb_dblocks);
+       if (PED_BE32_TO_CPU (sb->sb_magicnum) == XFS_SB_MAGIC) {
+               block_size = PED_BE32_TO_CPU (sb->sb_blocksize) / 
geom->dev->sector_size;
+               block_count = PED_BE64_TO_CPU (sb->sb_dblocks);
 
-               return ped_geometry_new (geom->dev, geom->start,
+               geom = ped_geometry_new (geom->dev, geom->start,
                                         block_size * block_count);
+               return geom;
        }
-
        return NULL;
 }
 
@@ -77,7 +72,6 @@ static PedFileSystemType xfs_type = {
        next:   NULL,
        ops:    &xfs_ops,
        name:   "xfs",
-       block_sizes: XFS_BLOCK_SIZES
 };
 
 void
-- 
1.8.3.2




Reply via email to