[Devel] [PATCH hci-8.1 2/5] drivers/md/push_backup: clear pb->alive under pb->lock
no-reply at sashiko.virtuozzo.com
no-reply at sashiko.virtuozzo.com
Tue Nov 3 02:47:24 MSK 2026
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Low] dm-push-backup: pb->alive KCSAN race only partly fixed, plain accesses remain
--
commit 9d9907f2e7f049fda97985539a4920b9e2e49764
Author: Andrey Zhadchenko <andrey.zhadchenko at virtuozzo.com>
drivers/md/push_backup: clear pb->alive under pb->lock
This patch makes pb_message() take pb->lock around the store that clears
pb->alive when handling push_backup_stop. The aim is to avoid a possible
KCSAN report and to match other users of pb->alive.
Link: https://virtuozzo.atlassian.net/browse/VSTOR-152912
> diff --git a/drivers/md/dm-push-backup.c b/drivers/md/dm-push-backup.c
> index 9a6252f2b21e..1ae4ccc208ff 100644
> --- a/drivers/md/dm-push-backup.c
> +++ b/drivers/md/dm-push-backup.c
> @@ -581,7 +581,9 @@ static int pb_message(struct dm_target *ti, unsigned int argc, char **argv,
> if (!pb->map)
> return -EBADF;
>
> + spin_lock_irq(&pb->lock);
> pb->alive = false;
> + spin_unlock_irq(&pb->lock);
> wake_up_interruptible(&pb->waitq); /* pb->alive = false */
> }
[Severity: Low]
Does this fully avoid the KCSAN report described in the commit message
("it may potentially trigger KCSAN")?
This store in pb_message() runs before ctl_rwsem is taken, so it holds
pb->lock but not ctl_rwsem. A concurrent push_backup_start() holds
ctl_rwsem but not pb->lock, so the two do not exclude each other:
push_backup_start()
if (pb->alive)
return -EEXIST;
That read is a plain read with no pb->lock and no READ_ONCE(), so it can
still race with the store above.
The wait_event condition used by push_backup_read() is also evaluated
without pb->lock. It reads the flag through pb_has_event():
!READ_ONCE(pb->alive) || !READ_ONCE(pb->map_bits) || ...
Here the reader is marked, but none of the writers use WRITE_ONCE(). The
stores in pb_message() (this patch), push_backup_stop(), and the
pb->alive = true store in the push_backup_start() setup path are all
still plain stores.
KCSAN can report a plain store racing with a lockless read, so taking
pb->lock around only this one store may not remove the report.
Would it make sense to use WRITE_ONCE() on the stores to pb->alive and
READ_ONCE() on the read in push_backup_start() (or take pb->lock for that
read)? The commit message could also be adjusted if the intent is only to
make the locking consistent.
--
Sashiko AI review · https://sashiko.vzint.dev/#/patchset/20261102233849.613155-1-andrey.zhadchenko@virtuozzo.com?part=2
More information about the Devel
mailing list