From: Johannes Thumshirn Date: Fri, 15 May 2020 08:41:33 +0000 (+0900) Subject: blkzone: deny destructive ioctls on busy blockdev X-Git-Tag: v2.36-rc1~100 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7a2602f629fef10be7254ad8fb58c52fc373ec29;p=thirdparty%2Futil-linux.git blkzone: deny destructive ioctls on busy blockdev If a user submits a zone management ioctl from user-space, like a zone reset and a file-system (like zonefs or f2fs) is mounted on the zoned block device, the zone will get reset and the file-system's cached value of the zone's write-pointer becomes invalid. Subsequent writes to this zone from the file-system will result in unaligned writes and the drive will error out. Open the block device file in exclusive mode for submitting these ioctls. If a file-system is mounted the kernel will return -EBUSY and we can't continue issuing the ioctl. [kzak@redhat.com: - remove unnecessary error message] Reported-by: Coly Li Cc: Damien Le Moal Signed-off-by: Johannes Thumshirn Signed-off-by: Karel Zak --- diff --git a/sys-utils/blkzone.c b/sys-utils/blkzone.c index 8d9de2e1bb..62430e6340 100644 --- a/sys-utils/blkzone.c +++ b/sys-utils/blkzone.c @@ -301,7 +301,7 @@ static int blkzone_action(struct blkzone_control *ctl) if (!zonesize) errx(EXIT_FAILURE, _("%s: unable to determine zone size"), ctl->devname); - fd = init_device(ctl, O_WRONLY); + fd = init_device(ctl, O_WRONLY | O_EXCL); if (ctl->offset & (zonesize - 1)) errx(EXIT_FAILURE, _("%s: offset %" PRIu64 " is not aligned "