Path: blob/main/filesystems/libblkid/files/patch-libblkid_src_probe.c
17780 views
--- libblkid/src/probe.c.orig 2025-06-24 07:55:28 UTC1+++ libblkid/src/probe.c2@@ -594,7 +594,18 @@ static struct blkid_bufinfo *read_buffer(blkid_probe p3DBG(LOWPROBE, ul_debug("\tread: off=%"PRIu64" len=%"PRIu64"",4real_off, len));56- ret = read(pr->fd, bf->data, len);7+ /* on FreeBSD, devices are unbuffered so we need to align to full I/O blocks by ourselves */8+ if (len % pr->io_size) {9+ unsigned rawlen = len + (pr->io_size - len % pr->io_size);10+ char buf[rawlen];11+ ret = read(pr->fd, buf, rawlen);12+ if (ret < 0 || ret < len)13+ return NULL;14+ memcpy(bf->data, buf, len);15+ ret = len;16+ } else {17+ ret = read(pr->fd, bf->data, len);18+ }19if (ret != (ssize_t) len) {20DBG(LOWPROBE, ul_debug("\tread failed: %m"));21remove_buffer(bf);22@@ -718,7 +729,7 @@ const unsigned char *blkid_probe_get_buffer(blkid_prob23struct blkid_bufinfo *bf = NULL;24uint64_t real_off, bias, len_align;2526- bias = off % pr->io_size;27+ bias = off % /* pr->io_size */ 4096;28off -= bias;29len += bias;3031@@ -1106,6 +1117,7 @@ int blkid_probe_set_device(blkid_probe pr, int fd,32goto err;33}34} else if (S_ISCHR(sb.st_mode)) {35+#ifdef __linux__36char buf[PATH_MAX];3738if (!sysfs_chrdev_devno_to_devname(sb.st_rdev, buf, sizeof(buf))39@@ -1114,6 +1126,9 @@ int blkid_probe_set_device(blkid_probe pr, int fd,40errno = EINVAL;41goto err;42}43+#else44+ /* no-op, FreeBSD maps block devices as character */45+#endif46devsiz = 1; /* UBI devices are char... */47} else if (S_ISREG(sb.st_mode))48devsiz = sb.st_size; /* regular file */495051