Commit 1b8c8cda authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'block-6.14-20250214' of git://git.kernel.dk/linux

Pull block fixes from Jens Axboe:

 - Fix for request rejection for batch addition

 - Fix a few issues for bogus mac partition tables

* tag 'block-6.14-20250214' of git://git.kernel.dk/linux:
  partitions: mac: fix handling of bogus partition table
  block: cleanup and fix batch completion adding conditions
parents ea717324 80e64804
Loading
Loading
Loading
Loading
+15 −3
Original line number Diff line number Diff line
@@ -53,13 +53,25 @@ int mac_partition(struct parsed_partitions *state)
	}
	secsize = be16_to_cpu(md->block_size);
	put_dev_sector(sect);

	/*
	 * If the "block size" is not a power of 2, things get weird - we might
	 * end up with a partition straddling a sector boundary, so we wouldn't
	 * be able to read a partition entry with read_part_sector().
	 * Real block sizes are probably (?) powers of two, so just require
	 * that.
	 */
	if (!is_power_of_2(secsize))
		return -1;
	datasize = round_down(secsize, 512);
	data = read_part_sector(state, datasize / 512, &sect);
	if (!data)
		return -1;
	partoffset = secsize % 512;
	if (partoffset + sizeof(*part) > datasize)
	if (partoffset + sizeof(*part) > datasize) {
		put_dev_sector(sect);
		return -1;
	}
	part = (struct mac_partition *) (data + partoffset);
	if (be16_to_cpu(part->signature) != MAC_PARTITION_MAGIC) {
		put_dev_sector(sect);
@@ -112,8 +124,8 @@ int mac_partition(struct parsed_partitions *state)
				int i, l;

				goodness++;
				l = strlen(part->name);
				if (strcmp(part->name, "/") == 0)
				l = strnlen(part->name, sizeof(part->name));
				if (strncmp(part->name, "/", sizeof(part->name)) == 0)
					goodness++;
				for (i = 0; i <= l - 4; ++i) {
					if (strncasecmp(part->name + i, "root",
+14 −4
Original line number Diff line number Diff line
@@ -861,12 +861,22 @@ static inline bool blk_mq_add_to_batch(struct request *req,
				       void (*complete)(struct io_comp_batch *))
{
	/*
	 * blk_mq_end_request_batch() can't end request allocated from
	 * sched tags
	 * Check various conditions that exclude batch processing:
	 * 1) No batch container
	 * 2) Has scheduler data attached
	 * 3) Not a passthrough request and end_io set
	 * 4) Not a passthrough request and an ioerror
	 */
	if (!iob || (req->rq_flags & RQF_SCHED_TAGS) || ioerror ||
			(req->end_io && !blk_rq_is_passthrough(req)))
	if (!iob)
		return false;
	if (req->rq_flags & RQF_SCHED_TAGS)
		return false;
	if (!blk_rq_is_passthrough(req)) {
		if (req->end_io)
			return false;
		if (ioerror < 0)
			return false;
	}

	if (!iob->complete)
		iob->complete = complete;