]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libblkid: topology/ioctl: simplify ioctl handling
authorThomas Weißschuh <thomas@t-8ch.de>
Thu, 4 Apr 2024 05:24:58 +0000 (07:24 +0200)
committerThomas Weißschuh <thomas@t-8ch.de>
Fri, 5 Apr 2024 05:45:22 +0000 (07:45 +0200)
Coverity complains about the data copy within the union.
Instead unroll the loop which is less code and easier to follow.

Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
libblkid/src/topology/ioctl.c

index 4be20e80240b7d55bf2eb1b5560b9107eebc05c9..7b15c9e9a74d54ca4481c5a7dad526d9972a9a24 100644 (file)
 
 #include "topology.h"
 
-/*
- * ioctl topology values
- */
-static const struct topology_val {
-
-       long  ioc;
-       size_t kernel_size;
-
-       /* functions to set probing result */
-       int (*set_ulong)(blkid_probe, unsigned long);
-       int (*set_int)(blkid_probe, int);
-       int (*set_u64)(blkid_probe, uint64_t);
-
-} topology_vals[] = {
-       { BLKALIGNOFF, sizeof(int),
-         .set_int = blkid_topology_set_alignment_offset },
-       { BLKIOMIN, sizeof(int),
-         .set_ulong = blkid_topology_set_minimum_io_size },
-       { BLKIOOPT, sizeof(int),
-         .set_ulong = blkid_topology_set_optimal_io_size },
-       { BLKPBSZGET, sizeof(int),
-         .set_ulong = blkid_topology_set_physical_sector_size },
-       { BLKGETDISKSEQ, sizeof(uint64_t),
-         .set_u64 = blkid_topology_set_diskseq },
-       /* we read BLKSSZGET in topology.c */
-};
-
 static int probe_ioctl_tp(blkid_probe pr,
                const struct blkid_idmag *mag __attribute__((__unused__)))
 {
-       size_t i;
-
-       for (i = 0; i < ARRAY_SIZE(topology_vals); i++) {
-               const struct topology_val *val = &topology_vals[i];
-               int rc = 1;
-               union {
-                       int s32;
-                       uint64_t u64;
-               } data = { 0 };
-
-               if (ioctl(pr->fd, val->ioc, &data) == -1)
-                       goto nothing;
-
-               /* Convert from kernel to libblkid type */
-               if (val->kernel_size == 4)
-                       data.u64 = data.s32;
-
-               if (val->set_int)
-                       rc = val->set_int(pr, data.u64);
-               else if (val->set_ulong)
-                       rc = val->set_ulong(pr, data.u64);
-               else
-                       rc = val->set_u64(pr, data.u64);
-
-               if (rc)
-                       goto err;
-       }
+       uint64_t u64;
+       int s32;
+
+       if (ioctl(pr->fd, BLKALIGNOFF, &s32) == -1)
+               return 1;
+       if (blkid_topology_set_alignment_offset(pr, s32))
+               return -1;
+
+       if (ioctl(pr->fd, BLKIOMIN, &s32) == -1)
+               return 1;
+       if (blkid_topology_set_minimum_io_size(pr, s32))
+               return -1;
+
+       if (ioctl(pr->fd, BLKIOOPT, &s32) == -1)
+               return 1;
+       if (blkid_topology_set_optimal_io_size(pr, s32))
+               return -1;
+
+       if (ioctl(pr->fd, BLKPBSZGET, &s32) == -1)
+               return 1;
+       if (blkid_topology_set_physical_sector_size(pr, s32))
+               return -1;
+
+       if (ioctl(pr->fd, BLKGETDISKSEQ, &u64) == -1)
+               return 1;
+       if (blkid_topology_set_physical_sector_size(pr, u64))
+               return -1;
 
        return 0;
-nothing:
-       return 1;
-err:
-       return -1;
 }
 
 const struct blkid_idinfo ioctl_tp_idinfo =