static int lookup_block_device(const char *p, dev_t *ret) {
struct stat st = {};
+ dev_t st_rdev;
int r;
assert(p);
assert(ret);
- r = device_path_parse_major_minor(p, &st.st_mode, &st.st_rdev);
+ r = device_path_parse_major_minor(p, &st.st_mode, &st_rdev);
if (r == -ENODEV) { /* not a parsable device node, need to go to disk */
if (stat(p, &st) < 0)
return log_warning_errno(errno, "Couldn't stat device '%s': %m", p);
} else if (r < 0)
return log_warning_errno(r, "Failed to parse major/minor from path '%s': %m", p);
+ else
+ st.st_rdev = (__typeof__ (st.st_rdev))st_rdev;
if (S_ISCHR(st.st_mode)) {
log_warning("Device node '%s' is a character device, but block device needed.", p);
static int whitelist_device(BPFProgram *prog, const char *path, const char *node, const char *acc) {
struct stat st = {};
+ dev_t st_rdev;
int r;
assert(path);
/* Some special handling for /dev/block/%u:%u, /dev/char/%u:%u, /run/systemd/inaccessible/chr and
* /run/systemd/inaccessible/blk paths. Instead of stat()ing these we parse out the major/minor directly. This
* means clients can use these path without the device node actually around */
- r = device_path_parse_major_minor(node, &st.st_mode, &st.st_rdev);
+ r = device_path_parse_major_minor(node, &st.st_mode, &st_rdev);
if (r < 0) {
if (r != -ENODEV)
return log_warning_errno(r, "Couldn't parse major/minor from device path '%s': %m", node);
log_warning("%s is not a device.", node);
return -ENODEV;
}
- }
+ } else
+ st.st_rdev = (__typeof__ (st.st_rdev))st_rdev;
if (cg_all_unified() > 0) {
if (!prog)