Re: New kernels
Posted: Thu Jun 29, 2023 4:35 am
I created a patch for reverting the commit.
revert_amiga.c.patch:
Code: Select all
diff -rupN a/block/partitions/amiga.c b/block/partitions/amiga.c > revert_amiga.c.patch
Code: Select all
--- a/block/partitions/amiga.c 2023-06-29 04:29:22.947100347 +0200
+++ b/block/partitions/amiga.c 2023-06-26 01:29:58.000000000 +0200
@@ -11,18 +11,10 @@
#define pr_fmt(fmt) fmt
#include <linux/types.h>
-#include <linux/mm_types.h>
-#include <linux/overflow.h>
#include <linux/affs_hardblocks.h>
#include "check.h"
-/* magic offsets in partition DosEnvVec */
-#define NR_HD 3
-#define NR_SECT 5
-#define LO_CYL 9
-#define HI_CYL 10
-
static __inline__ u32
checksum_block(__be32 *m, int size)
{
@@ -39,12 +31,8 @@ int amiga_partition(struct parsed_partit
unsigned char *data;
struct RigidDiskBlock *rdb;
struct PartitionBlock *pb;
- u64 start_sect, nr_sects;
- sector_t blk, end_sect;
- u32 cylblk; /* rdb_CylBlocks = nr_heads*sect_per_track */
- u32 nr_hd, nr_sect, lo_cyl, hi_cyl;
- int part, res = 0;
- unsigned int blksize = 1; /* Multiplier for disk block size */
+ int start_sect, nr_sects, blk, part, res = 0;
+ int blksize = 1; /* Multiplier for disk block size */
int slot = 1;
for (blk = 0; ; blk++, put_dev_sector(sect)) {
@@ -52,7 +40,7 @@ int amiga_partition(struct parsed_partit
goto rdb_done;
data = read_part_sector(state, blk, §);
if (!data) {
- pr_err("Dev %s: unable to read RDB block %llu\n",
+ pr_err("Dev %s: unable to read RDB block %d\n",
state->disk->disk_name, blk);
res = -1;
goto rdb_done;
@@ -69,12 +57,12 @@ int amiga_partition(struct parsed_partit
*(__be32 *)(data+0xdc) = 0;
if (checksum_block((__be32 *)data,
be32_to_cpu(rdb->rdb_SummedLongs) & 0x7F)==0) {
- pr_err("Trashed word at 0xd0 in block %llu ignored in checksum calculation\n",
+ pr_err("Trashed word at 0xd0 in block %d ignored in checksum calculation\n",
blk);
break;
}
- pr_err("Dev %s: RDB in block %llu has bad checksum\n",
+ pr_err("Dev %s: RDB in block %d has bad checksum\n",
state->disk->disk_name, blk);
}
@@ -91,15 +79,10 @@ int amiga_partition(struct parsed_partit
blk = be32_to_cpu(rdb->rdb_PartitionList);
put_dev_sector(sect);
for (part = 1; blk>0 && part<=16; part++, put_dev_sector(sect)) {
- /* Read in terms partition table understands */
- if (check_mul_overflow(blk, (sector_t) blksize, &blk)) {
- pr_err("Dev %s: overflow calculating partition block %llu! Skipping partitions %u and beyond\n",
- state->disk->disk_name, blk, part);
- break;
- }
+ blk *= blksize; /* Read in terms partition table understands */
data = read_part_sector(state, blk, §);
if (!data) {
- pr_err("Dev %s: unable to read partition block %llu\n",
+ pr_err("Dev %s: unable to read partition block %d\n",
state->disk->disk_name, blk);
res = -1;
goto rdb_done;
@@ -111,70 +94,19 @@ int amiga_partition(struct parsed_partit
if (checksum_block((__be32 *)pb, be32_to_cpu(pb->pb_SummedLongs) & 0x7F) != 0 )
continue;
- /* RDB gives us more than enough rope to hang ourselves with,
- * many times over (2^128 bytes if all fields max out).
- * Some careful checks are in order, so check for potential
- * overflows.
- * We are multiplying four 32 bit numbers to one sector_t!
- */
-
- nr_hd = be32_to_cpu(pb->pb_Environment[NR_HD]);
- nr_sect = be32_to_cpu(pb->pb_Environment[NR_SECT]);
-
- /* CylBlocks is total number of blocks per cylinder */
- if (check_mul_overflow(nr_hd, nr_sect, &cylblk)) {
- pr_err("Dev %s: heads*sects %u overflows u32, skipping partition!\n",
- state->disk->disk_name, cylblk);
- continue;
- }
-
- /* check for consistency with RDB defined CylBlocks */
- if (cylblk > be32_to_cpu(rdb->rdb_CylBlocks)) {
- pr_warn("Dev %s: cylblk %u > rdb_CylBlocks %u!\n",
- state->disk->disk_name, cylblk,
- be32_to_cpu(rdb->rdb_CylBlocks));
- }
-
- /* RDB allows for variable logical block size -
- * normalize to 512 byte blocks and check result.
- */
-
- if (check_mul_overflow(cylblk, blksize, &cylblk)) {
- pr_err("Dev %s: partition %u bytes per cyl. overflows u32, skipping partition!\n",
- state->disk->disk_name, part);
- continue;
- }
-
- /* Calculate partition start and end. Limit of 32 bit on cylblk
- * guarantees no overflow occurs if LBD support is enabled.
- */
-
- lo_cyl = be32_to_cpu(pb->pb_Environment[LO_CYL]);
- start_sect = ((u64) lo_cyl * cylblk);
-
- hi_cyl = be32_to_cpu(pb->pb_Environment[HI_CYL]);
- nr_sects = (((u64) hi_cyl - lo_cyl + 1) * cylblk);
+ /* Tell Kernel about it */
+ nr_sects = (be32_to_cpu(pb->pb_Environment[10]) + 1 -
+ be32_to_cpu(pb->pb_Environment[9])) *
+ be32_to_cpu(pb->pb_Environment[3]) *
+ be32_to_cpu(pb->pb_Environment[5]) *
+ blksize;
if (!nr_sects)
continue;
-
- /* Warn user if partition end overflows u32 (AmigaDOS limit) */
-
- if ((start_sect + nr_sects) > UINT_MAX) {
- pr_warn("Dev %s: partition %u (%llu-%llu) needs 64 bit device support!\n",
- state->disk->disk_name, part,
- start_sect, start_sect + nr_sects);
- }
-
- if (check_add_overflow(start_sect, nr_sects, &end_sect)) {
- pr_err("Dev %s: partition %u (%llu-%llu) needs LBD device support, skipping partition!\n",
- state->disk->disk_name, part,
- start_sect, end_sect);
- continue;
- }
-
- /* Tell Kernel about it */
-
+ start_sect = be32_to_cpu(pb->pb_Environment[9]) *
+ be32_to_cpu(pb->pb_Environment[3]) *
+ be32_to_cpu(pb->pb_Environment[5]) *
+ blksize;
put_partition(state,slot++,start_sect,nr_sects);
{
/* Be even more informative to aid mounting */