Commit c8775aef authored by Zheng Qixing's avatar Zheng Qixing Committed by Jens Axboe
Browse files

badblocks: return boolean from badblocks_set() and badblocks_clear()



Change the return type of badblocks_set() and badblocks_clear()
from int to bool, indicating success or failure. Specifically:

- _badblocks_set() and _badblocks_clear() functions now return
true for success and false for failure.
- All calls to these functions are updated to handle the new
boolean return type.
- This change improves code clarity and ensures a more consistent
handling of success and failure states.

Signed-off-by: default avatarZheng Qixing <zhengqixing@huawei.com>
Reviewed-by: default avatarYu Kuai <yukuai3@huawei.com>
Acked-by: default avatarColy Li <colyli@kernel.org>
Acked-by: default avatarIra Weiny <ira.weiny@intel.com>
Link: https://lore.kernel.org/r/20250227075507.151331-11-zhengqixing@huaweicloud.com


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 5236f041
Loading
Loading
Loading
Loading
+20 −21
Original line number Diff line number Diff line
@@ -836,7 +836,7 @@ static bool try_adjacent_combine(struct badblocks *bb, int prev)
}

/* Do exact work to set bad block range into the bad block table */
static int _badblocks_set(struct badblocks *bb, sector_t s, int sectors,
static bool _badblocks_set(struct badblocks *bb, sector_t s, int sectors,
			   int acknowledged)
{
	int len = 0, added = 0;
@@ -847,11 +847,11 @@ static int _badblocks_set(struct badblocks *bb, sector_t s, int sectors,

	if (bb->shift < 0)
		/* badblocks are disabled */
		return 1;
		return false;

	if (sectors == 0)
		/* Invalid sectors number */
		return 1;
		return false;

	if (bb->shift) {
		/* round the start down, and the end up */
@@ -977,7 +977,7 @@ static int _badblocks_set(struct badblocks *bb, sector_t s, int sectors,

	write_sequnlock_irqrestore(&bb->lock, flags);

	return sectors;
	return sectors == 0;
}

/*
@@ -1048,21 +1048,20 @@ static int front_splitting_clear(struct badblocks *bb, int prev,
}

/* Do the exact work to clear bad block range from the bad block table */
static int _badblocks_clear(struct badblocks *bb, sector_t s, int sectors)
static bool _badblocks_clear(struct badblocks *bb, sector_t s, int sectors)
{
	struct badblocks_context bad;
	int prev = -1, hint = -1;
	int len = 0, cleared = 0;
	int rv = 0;
	u64 *p;

	if (bb->shift < 0)
		/* badblocks are disabled */
		return 1;
		return false;

	if (sectors == 0)
		/* Invalid sectors number */
		return 1;
		return false;

	if (bb->shift) {
		sector_t target;
@@ -1182,9 +1181,9 @@ static int _badblocks_clear(struct badblocks *bb, sector_t s, int sectors)
	write_sequnlock_irq(&bb->lock);

	if (!cleared)
		rv = 1;
		return false;

	return rv;
	return true;
}

/* Do the exact work to check bad blocks range from the bad block table */
@@ -1338,11 +1337,11 @@ EXPORT_SYMBOL_GPL(badblocks_check);
 * decide how best to handle it.
 *
 * Return:
 *  0: success
 *  other: failed to set badblocks (out of space). Parital setting will be
 *  true: success
 *  false: failed to set badblocks (out of space). Parital setting will be
 *  treated as failure.
 */
int badblocks_set(struct badblocks *bb, sector_t s, int sectors,
bool badblocks_set(struct badblocks *bb, sector_t s, int sectors,
		   int acknowledged)
{
	return _badblocks_set(bb, s, sectors, acknowledged);
@@ -1360,10 +1359,10 @@ EXPORT_SYMBOL_GPL(badblocks_set);
 * drop the remove request.
 *
 * Return:
 *  0: success
 *  1: failed to clear badblocks
 *  true: success
 *  false: failed to clear badblocks
 */
int badblocks_clear(struct badblocks *bb, sector_t s, int sectors)
bool badblocks_clear(struct badblocks *bb, sector_t s, int sectors)
{
	return _badblocks_clear(bb, s, sectors);
}
@@ -1485,9 +1484,9 @@ ssize_t badblocks_store(struct badblocks *bb, const char *page, size_t len,
		return -EINVAL;
	}

	if (badblocks_set(bb, sector, length, !unack))
	if (!badblocks_set(bb, sector, length, !unack))
		return -ENOSPC;
	else

	return len;
}
EXPORT_SYMBOL_GPL(badblocks_store);
+7 −7
Original line number Diff line number Diff line
@@ -561,14 +561,14 @@ static ssize_t nullb_device_badblocks_store(struct config_item *item,
		goto out;
	/* enable badblocks */
	cmpxchg(&t_dev->badblocks.shift, -1, 0);
	if (buf[0] == '+')
		ret = badblocks_set(&t_dev->badblocks, start,
			end - start + 1, 1);
	else
		ret = badblocks_clear(&t_dev->badblocks, start,
			end - start + 1);
	if (ret == 0)
	if (buf[0] == '+') {
		if (badblocks_set(&t_dev->badblocks, start,
				  end - start + 1, 1))
			ret = count;
	} else if (badblocks_clear(&t_dev->badblocks, start,
				   end - start + 1)) {
		ret = count;
	}
out:
	kfree(orig);
	return ret;
+18 −17
Original line number Diff line number Diff line
@@ -1748,7 +1748,7 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_
			count <<= sb->bblog_shift;
			if (bb + 1 == 0)
				break;
			if (badblocks_set(&rdev->badblocks, sector, count, 1))
			if (!badblocks_set(&rdev->badblocks, sector, count, 1))
				return -EINVAL;
		}
	} else if (sb->bblog_offset != 0)
@@ -9833,7 +9833,6 @@ int rdev_set_badblocks(struct md_rdev *rdev, sector_t s, int sectors,
		       int is_new)
{
	struct mddev *mddev = rdev->mddev;
	int rv;

	/*
	 * Recording new badblocks for faulty rdev will force unnecessary
@@ -9849,8 +9848,10 @@ int rdev_set_badblocks(struct md_rdev *rdev, sector_t s, int sectors,
		s += rdev->new_data_offset;
	else
		s += rdev->data_offset;
	rv = badblocks_set(&rdev->badblocks, s, sectors, 0);
	if (rv == 0) {

	if (!badblocks_set(&rdev->badblocks, s, sectors, 0))
		return 0;

	/* Make sure they get written out promptly */
	if (test_bit(ExternalBbl, &rdev->flags))
		sysfs_notify_dirent_safe(rdev->sysfs_unack_badblocks);
@@ -9859,23 +9860,23 @@ int rdev_set_badblocks(struct md_rdev *rdev, sector_t s, int sectors,
		      BIT(MD_SB_CHANGE_CLEAN) | BIT(MD_SB_CHANGE_PENDING));
	md_wakeup_thread(rdev->mddev->thread);
	return 1;
	} else
		return 0;
}
EXPORT_SYMBOL_GPL(rdev_set_badblocks);

int rdev_clear_badblocks(struct md_rdev *rdev, sector_t s, int sectors,
			 int is_new)
{
	int rv;
	if (is_new)
		s += rdev->new_data_offset;
	else
		s += rdev->data_offset;
	rv = badblocks_clear(&rdev->badblocks, s, sectors);
	if ((rv == 0) && test_bit(ExternalBbl, &rdev->flags))

	if (!badblocks_clear(&rdev->badblocks, s, sectors))
		return 0;

	if (test_bit(ExternalBbl, &rdev->flags))
		sysfs_notify_dirent_safe(rdev->sysfs_badblocks);
	return rv;
	return 1;
}
EXPORT_SYMBOL_GPL(rdev_clear_badblocks);

+1 −1
Original line number Diff line number Diff line
@@ -167,7 +167,7 @@ static void set_badblock(struct badblocks *bb, sector_t s, int num)
	dev_dbg(bb->dev, "Found a bad range (0x%llx, 0x%llx)\n",
			(u64) s * 512, (u64) num * 512);
	/* this isn't an error as the hardware will still throw an exception */
	if (badblocks_set(bb, s, num, 1))
	if (!badblocks_set(bb, s, num, 1))
		dev_info_once(bb->dev, "%s: failed for sector %llx\n",
				__func__, (u64) s);
}
+3 −3
Original line number Diff line number Diff line
@@ -50,9 +50,9 @@ struct badblocks_context {

int badblocks_check(struct badblocks *bb, sector_t s, int sectors,
		   sector_t *first_bad, int *bad_sectors);
int badblocks_set(struct badblocks *bb, sector_t s, int sectors,
bool badblocks_set(struct badblocks *bb, sector_t s, int sectors,
		   int acknowledged);
int badblocks_clear(struct badblocks *bb, sector_t s, int sectors);
bool badblocks_clear(struct badblocks *bb, sector_t s, int sectors);
void ack_all_badblocks(struct badblocks *bb);
ssize_t badblocks_show(struct badblocks *bb, char *page, int unack);
ssize_t badblocks_store(struct badblocks *bb, const char *page, size_t len,