mirror of
https://github.com/systemd/systemd.git
synced 2024-11-01 09:21:26 +03:00
cgroup: beef up device lookup logic for block devices
Let's chase block devices through btrfs and LUKS like we do elsewhere.
This commit is contained in:
parent
880f09bd91
commit
45c2e06854
@ -11,6 +11,7 @@
|
||||
#include "alloc-util.h"
|
||||
#include "blockdev-util.h"
|
||||
#include "bpf-firewall.h"
|
||||
#include "btrfs-util.h"
|
||||
#include "bus-error.h"
|
||||
#include "cgroup-util.h"
|
||||
#include "cgroup.h"
|
||||
@ -306,30 +307,36 @@ void cgroup_context_dump(CGroupContext *c, FILE* f, const char *prefix) {
|
||||
}
|
||||
}
|
||||
|
||||
static int lookup_block_device(const char *p, dev_t *dev) {
|
||||
static int lookup_block_device(const char *p, dev_t *ret) {
|
||||
struct stat st;
|
||||
int r;
|
||||
|
||||
assert(p);
|
||||
assert(dev);
|
||||
assert(ret);
|
||||
|
||||
if (stat(p, &st) < 0)
|
||||
return log_warning_errno(errno, "Couldn't stat device %s: %m", p);
|
||||
return log_warning_errno(errno, "Couldn't stat device '%s': %m", p);
|
||||
|
||||
if (S_ISBLK(st.st_mode))
|
||||
*dev = st.st_rdev;
|
||||
else if (major(st.st_dev) != 0) {
|
||||
/* If this is not a device node then find the block
|
||||
* device this file is stored on */
|
||||
*dev = st.st_dev;
|
||||
|
||||
/* If this is a partition, try to get the originating
|
||||
* block device */
|
||||
(void) block_get_whole_disk(*dev, dev);
|
||||
} else {
|
||||
log_warning("%s is not a block device and file system block device cannot be determined or is not local.", p);
|
||||
*ret = st.st_rdev;
|
||||
else if (major(st.st_dev) != 0)
|
||||
*ret = st.st_dev; /* If this is not a device node then use the block device this file is stored on */
|
||||
else {
|
||||
/* If this is btrfs, getting the backing block device is a bit harder */
|
||||
r = btrfs_get_block_device(p, ret);
|
||||
if (r < 0 && r != -ENOTTY)
|
||||
return log_warning_errno(r, "Failed to determine block device backing btrfs file system '%s': %m", p);
|
||||
if (r == -ENOTTY) {
|
||||
log_warning("'%s' is not a block device node, and file system block device cannot be determined or is not local.", p);
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
|
||||
/* If this is a LUKS device, try to get the originating block device */
|
||||
(void) block_get_originating(*ret, ret);
|
||||
|
||||
/* If this is a partition, try to get the originating block device */
|
||||
(void) block_get_whole_disk(*ret, ret);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user