Package: parted;
Reported by: Phillip Susi <psusi <at> ubuntu.com>
Date: Sat, 4 Jan 2014 05:28:01 UTC
Severity: normal
Tags: patch
Done: Phillip Susi <psusi <at> ubuntu.com>
Bug is archived. No further changes may be made.
To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 16338 in the body.
You can then email your comments to 16338 AT debbugs.gnu.org in the normal way.
Toggle the display of automated, internal messages from the tracker.
View this report as an mbox folder, status mbox, maintainer mbox
bug-parted <at> gnu.org
:bug#16338
; Package parted
.
(Sat, 04 Jan 2014 05:28:01 GMT) Full text and rfc822 format available.Phillip Susi <psusi <at> ubuntu.com>
:bug-parted <at> gnu.org
.
(Sat, 04 Jan 2014 05:28:02 GMT) Full text and rfc822 format available.Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
From: Phillip Susi <psusi <at> ubuntu.com> To: bug-parted <at> gnu.org Subject: [PATCH 2/2] Fix filesystem detection on non 512 byte sectors Date: Sat, 4 Jan 2014 00:26:05 -0500
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
bug-parted <at> gnu.org
:bug#16338
; Package parted
.
(Mon, 03 Mar 2014 19:46:01 GMT) Full text and rfc822 format available.Message #8 received at submit <at> debbugs.gnu.org (full text, mbox):
From: "Brian C. Lane" <bcl <at> redhat.com> To: bug-parted <at> gnu.org Subject: Re: bug#16338: [PATCH 2/2] Fix filesystem detection on non 512 byte sectors Date: Mon, 3 Mar 2014 11:45:24 -0800
On Sat, Jan 04, 2014 at 12:26:05AM -0500, Phillip Susi wrote: > 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 > + Do our tests already cover all of these filesystems? > 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); It would probably be more readable to just read_alloc the first 4 blocks and then point *sb at +1024 inside that. Also, I just realized that you are using alloca for these -- I'm not sure we want to switch to using something that has undefined behavior on failure. -- Brian C. Lane | Anaconda Team | IRC: bcl #anaconda | Port Orchard, WA (PST8PDT)
bug-parted <at> gnu.org
:bug#16338
; Package parted
.
(Tue, 04 Mar 2014 00:37:01 GMT) Full text and rfc822 format available.Message #11 received at 16338 <at> debbugs.gnu.org (full text, mbox):
From: Phillip Susi <psusi <at> ubuntu.com> To: "Brian C. Lane" <bcl <at> redhat.com>, 16338 <at> debbugs.gnu.org Subject: Re: bug#16338: [PATCH 2/2] Fix filesystem detection on non 512 byte sectors Date: Mon, 03 Mar 2014 19:36:43 -0500
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 On 03/03/2014 02:45 PM, Brian C. Lane wrote: > Do our tests already cover all of these filesystems? I think so but now that I look at this again, it looks like I forgot to fix the tests. Currently they skip on !512 byte sector size. I'll fix that. > >> 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); > > It would probably be more readable to just read_alloc the first 4 > blocks and then point *sb at +1024 inside that. > > Also, I just realized that you are using alloca for these -- I'm > not sure we want to switch to using something that has undefined > behavior on failure. Practically speaking it isn't undefined; if you really blow your stack then you get a stack fault. Also it seems a waste to read 4 sectors when you only need 1. I suppose I could add a comment there to clarify the logic. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.14 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQEcBAEBCgAGBQJTFSAbAAoJEI5FoCIzSKrw/18IAJpp/P/NOz7eOC/Qntu+dft+ OBYeDUXK8kwJ+AukogRI9qAI6D1EX62SQ+cnaIKvGUJgXuw5YwhP5LPq6t68XR6q 1xlWRVdInj+ypTnDyGWLPu+VKuDavDTRKAocBBRjYc5bBf6RfpBYQixn7i9fWg1U SSHk+mevNYkjpTgRop+qVcuexEVgG5z8GimiBzhwaKDgx6pHbI02e0LV7PyN8BoC NWLAUpPci/KR5eZJaM2APozlLLzulkeNVxP7whN+swJ5fEms4QejLZPvqZooHVAI BqRFTBepDB4cNQ9N1Rn8BqxcPl6VioQ1XM5iTCN1eH2rogvTlY/xsZHgQqWojnE= =SFzt -----END PGP SIGNATURE-----
bug-parted <at> gnu.org
:bug#16338
; Package parted
.
(Tue, 18 Mar 2014 01:52:02 GMT) Full text and rfc822 format available.Message #14 received at 16338 <at> debbugs.gnu.org (full text, mbox):
From: Phillip Susi <psusi <at> ubuntu.com> To: "Brian C. Lane" <bcl <at> redhat.com>, 16338 <at> debbugs.gnu.org Subject: Re: bug#16338: [PATCH 2/2] Fix filesystem detection on non 512 byte sectors Date: Mon, 17 Mar 2014 21:51:18 -0400
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 On 03/03/2014 07:36 PM, Phillip Susi wrote: > On 03/03/2014 02:45 PM, Brian C. Lane wrote: >> Do our tests already cover all of these filesystems? > > I think so but now that I look at this again, it looks like I > forgot to fix the tests. Currently they skip on !512 byte sector > size. I'll fix that. So the best looking test to do this appears to be t1700-probe-fs. The problem is that it uses a loop file instead of a real device, and so does not really simulate !512 byte sectors. Also when I tried adding jfs, ntfs, and hfs, I found that hfs does not support -V ( version ) to test if it is supported, and mkfs.ntfs exits with an error status when run with -V, and mkfs.jfs tries to do an interactive prompt to really use a file instead of a device, and redirecting stdin to /dev/null causes it to crash with a SIGABRT. I suppose for the time being, this just may just have to be an untested feature. I did update the patch for the recent addition of btrfs support, and so will follow up this email with that. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.14 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQEcBAEBCgAGBQJTJ6aWAAoJEI5FoCIzSKrwXKkH/00CXfBkI9vrdnxluDWvX4LX knLEAu65orwITpJ87Vp8RHxRJdXHL83u7PQPrWxbwb/Zh00G/qhILumFFEv/vfx0 Y2Q2znX9o0mvaOJsB15obDghkMpzr6XOb3wz/bCLjPku/MGn56QqTdQazfDcamcZ X29wvewiz+tzPhmwBlNOgCz3IZm5J0tfr9aaA/0L9rDuaFqrXeo29no2wNa2LaTu HNZv2hPp7wqnbDITsQ/8Lq2tsnf1zLag0+tc+SPblbDrrdxq007kAjx2TuC8zWz8 gu2csd2WKF0jfE9c12M0T2PdrA7C/gTxupdkrS/AKgqjt+bBEgyn096iC+LOYQY= =ZB+/ -----END PGP SIGNATURE-----
bug-parted <at> gnu.org
:bug#16338
; Package parted
.
(Tue, 18 Mar 2014 14:32:01 GMT) Full text and rfc822 format available.Message #17 received at 16338 <at> debbugs.gnu.org (full text, mbox):
From: "Brian C. Lane" <bcl <at> redhat.com> To: Phillip Susi <psusi <at> ubuntu.com> Cc: 16338 <at> debbugs.gnu.org Subject: Re: bug#16338: [PATCH 2/2] Fix filesystem detection on non 512 byte sectors Date: Tue, 18 Mar 2014 07:30:23 -0700
On Mon, Mar 17, 2014 at 09:51:18PM -0400, Phillip Susi wrote: > On 03/03/2014 07:36 PM, Phillip Susi wrote: > > On 03/03/2014 02:45 PM, Brian C. Lane wrote: > >> Do our tests already cover all of these filesystems? > > > > I think so but now that I look at this again, it looks like I > > forgot to fix the tests. Currently they skip on !512 byte sector > > size. I'll fix that. > > So the best looking test to do this appears to be t1700-probe-fs. The > problem is that it uses a loop file instead of a real device, and so > does not really simulate !512 byte sectors. Also when I tried adding > jfs, ntfs, and hfs, I found that hfs does not support -V ( version ) > to test if it is supported, and mkfs.ntfs exits with an error status > when run with -V, and mkfs.jfs tries to do an interactive prompt to > really use a file instead of a device, and redirecting stdin to > /dev/null causes it to crash with a SIGABRT. I suppose for the time > being, this just may just have to be an untested feature. > > I did update the patch for the recent addition of btrfs support, and > so will follow up this email with that. > Sounds good for now. -- Brian C. Lane | Anaconda Team | IRC: bcl #anaconda | Port Orchard, WA (PST8PDT)
bug-parted <at> gnu.org
:bug#16338
; Package parted
.
(Sat, 29 Mar 2014 17:50:02 GMT) Full text and rfc822 format available.Message #20 received at 16338 <at> debbugs.gnu.org (full text, mbox):
From: Phillip Susi <psusi <at> ubuntu.com> To: bcl <at> redhat.com Cc: 16338 <at> debbugs.gnu.org Subject: [PATCH] Fix filesystem detection on non 512 byte sectors Date: Sat, 29 Mar 2014 13:49:09 -0400
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 | 2 ++ 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/btrfs/btrfs.c | 1 - libparted/fs/ext2/interface.c | 18 ++++--------- libparted/fs/fat/bootsector.c | 50 +++++------------------------------- 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 ++++++++----------- 27 files changed, 148 insertions(+), 275 deletions(-) diff --git a/NEWS b/NEWS index cdd406e..523fd9e 100644 --- a/NEWS +++ b/NEWS @@ -23,6 +23,8 @@ GNU parted NEWS -*- outline -*- ** Bug Fixes + Fix filesystem detection on non 512 byte sector sizes + Fix several bugs with loop labels ( whole disk filesystems ) Fix linux partition sync code to flush partitions > 16 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/btrfs/btrfs.c b/libparted/fs/btrfs/btrfs.c index e5abed6..8d76f6f 100644 --- a/libparted/fs/btrfs/btrfs.c +++ b/libparted/fs/btrfs/btrfs.c @@ -62,7 +62,6 @@ static PedFileSystemType btrfs_type = { next: NULL, ops: &btrfs_ops, name: "btrfs", - block_sizes: ((int[2]){512, 0}) }; void 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 dacc79c..95a8412 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, @@ -142,18 +143,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); @@ -252,10 +241,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); @@ -280,30 +269,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 3aff1d7..fcb9782 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 " @@ -250,10 +250,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); @@ -292,11 +292,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); @@ -388,16 +390,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, @@ -412,11 +414,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
bug-parted <at> gnu.org
:bug#16338
; Package parted
.
(Thu, 17 Apr 2014 22:13:01 GMT) Full text and rfc822 format available.Message #23 received at 16338 <at> debbugs.gnu.org (full text, mbox):
From: "Brian C. Lane" <bcl <at> redhat.com> To: Phillip Susi <psusi <at> ubuntu.com> Cc: 16338 <at> debbugs.gnu.org Subject: Re: [PATCH] Fix filesystem detection on non 512 byte sectors Date: Thu, 17 Apr 2014 15:12:26 -0700
On Sat, Mar 29, 2014 at 01:49:09PM -0400, Phillip Susi wrote: > 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 | 2 ++ > 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/btrfs/btrfs.c | 1 - > libparted/fs/ext2/interface.c | 18 ++++--------- > libparted/fs/fat/bootsector.c | 50 +++++------------------------------- > 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 ++++++++----------- > 27 files changed, 148 insertions(+), 275 deletions(-) This looks good to me. -- Brian C. Lane | Anaconda Team | IRC: bcl #anaconda | Port Orchard, WA (PST8PDT)
Phillip Susi <psusi <at> ubuntu.com>
:Phillip Susi <psusi <at> ubuntu.com>
:Message #28 received at 16338-done <at> debbugs.gnu.org (full text, mbox):
From: Phillip Susi <psusi <at> ubuntu.com> To: "Brian C. Lane" <bcl <at> redhat.com> Cc: 16338-done <at> debbugs.gnu.org Subject: Re: bug#16338: [PATCH] Fix filesystem detection on non 512 byte sectors Date: Fri, 18 Apr 2014 13:37:29 -0400
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 On 04/17/2014 06:12 PM, Brian C. Lane wrote: > On Sat, Mar 29, 2014 at 01:49:09PM -0400, Phillip Susi wrote: >> 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. > This looks good to me. pushed. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQEcBAEBCgAGBQJTUWLZAAoJEI5FoCIzSKrwxhIIAKJ70AXaaMSwRKSxjiPPxmDX sVc3bHS2rxXy/674wPzcIMAlhJTRBo6f88h7wluD0IgNmzeNWBWK8+VmOzr1zeJG u3WVOv7lIBoESdF+J+VK+ffZnwskVT1BmMhLkgK04NNQAUNCNMJcBe23ke6rIFvo +yPLkg76DrFIsFJkcsrWkFXegzTLwOUMyylfB77nDPLmyNpU7459PXTxx4oecNjI dxvVkWYnxJIJkJZmo/hNbNJ+7eW9vPJgRZKlt0x0fN+74nzI5vmxKKsRXFWYjvqG 7uaN7z5wzT321SiOfYa0GPU3ub46PA97K2UWceqzXp8I8dJpJtYLubPILLahTRI= =khYj -----END PGP SIGNATURE-----
bug-parted <at> gnu.org
:bug#16338
; Package parted
.
(Fri, 18 Apr 2014 22:55:02 GMT) Full text and rfc822 format available.Message #31 received at 16338 <at> debbugs.gnu.org (full text, mbox):
From: Phillip Susi <psusi <at> ubuntu.com> To: 16338 <at> debbugs.gnu.org Cc: bcl <at> redhat.com Subject: [PATCH] libparted: fix fat resize Date: Fri, 18 Apr 2014 18:54:01 -0400
The changes to fix filesystem detection on non 512 byte sector sizes broke fat filesystem resizing. --- libparted/fs/r/fat/fat.c | 6 +++++- libparted/fs/r/fat/resize.c | 10 ++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/libparted/fs/r/fat/fat.c b/libparted/fs/r/fat/fat.c index fdc1ecc..8d7420b 100644 --- a/libparted/fs/r/fat/fat.c +++ b/libparted/fs/r/fat/fat.c @@ -35,7 +35,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; @@ -86,6 +88,8 @@ fat_free_buffers (PedFileSystem* fs) 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); diff --git a/libparted/fs/r/fat/resize.c b/libparted/fs/r/fat/resize.c index f3439ac..046382b 100644 --- a/libparted/fs/r/fat/resize.c +++ b/libparted/fs/r/fat/resize.c @@ -667,10 +667,12 @@ create_resize_context (PedFileSystem* fs, const PedGeometry* new_geom) goto error_free_new_fs; /* preserve boot code, etc. */ - memcpy (&new_fs_info->boot_sector, &fs_info->boot_sector, - sizeof (FatBootSector)); - memcpy (&new_fs_info->info_sector, &fs_info->info_sector, - sizeof (FatInfoSector)); + new_fs_info->boot_sector = ped_malloc (new_geom->dev->sector_size); + new_fs_info->info_sector = ped_malloc (new_geom->dev->sector_size); + memcpy (new_fs_info->boot_sector, fs_info->boot_sector, + new_geom->dev->sector_size); + memcpy (new_fs_info->info_sector, fs_info->info_sector, + new_geom->dev->sector_size); new_fs_info->logical_sector_size = fs_info->logical_sector_size; new_fs_info->sector_count = new_geom->length; -- 1.9.1
Debbugs Internal Request <help-debbugs <at> gnu.org>
to internal_control <at> debbugs.gnu.org
.
(Sat, 17 May 2014 11:24:04 GMT) Full text and rfc822 format available.
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.