mirror of
https://github.com/systemd/systemd
synced 2024-10-15 12:34:37 +00:00
swap: major rework, use /sbin/swapon for setting up swaps, fix merging of aliased swap disks
This commit is contained in:
parent
60b912f6b1
commit
e04aad61bb
4
TODO
4
TODO
|
@ -30,8 +30,6 @@
|
||||||
|
|
||||||
* set_put(), hashmap_put() return values check. i.e. == 0 doesn't free()!
|
* set_put(), hashmap_put() return values check. i.e. == 0 doesn't free()!
|
||||||
|
|
||||||
* fix merging in .swap units
|
|
||||||
|
|
||||||
* chkconfig/systemd-install glue
|
* chkconfig/systemd-install glue
|
||||||
|
|
||||||
* io priority during initialization
|
* io priority during initialization
|
||||||
|
@ -80,8 +78,6 @@
|
||||||
|
|
||||||
* beefed up tmpwatch that reads tmpfiles.d
|
* beefed up tmpwatch that reads tmpfiles.d
|
||||||
|
|
||||||
* use /sbin/swapon
|
|
||||||
|
|
||||||
* enable syslog.socket by default, activating our kmsg bridge
|
* enable syslog.socket by default, activating our kmsg bridge
|
||||||
|
|
||||||
* when processes remain in a service even though the start command failed enter active
|
* when processes remain in a service even though the start command failed enter active
|
||||||
|
|
|
@ -188,10 +188,6 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
|
||||||
if ((r = device_find_escape_name(m, path, &u)) < 0)
|
if ((r = device_find_escape_name(m, path, &u)) < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
/* If a different unit already claimed this name then let's do
|
|
||||||
* nothing. This can happen for example when two disks with
|
|
||||||
* the same label are plugged in, and which hence try to get
|
|
||||||
* conflicting symlinks in /dev/disk/by-label/xxxx */
|
|
||||||
if (u && DEVICE(u)->sysfs && !path_equal(DEVICE(u)->sysfs, sysfs))
|
if (u && DEVICE(u)->sysfs && !path_equal(DEVICE(u)->sysfs, sysfs))
|
||||||
return -EEXIST;
|
return -EEXIST;
|
||||||
|
|
||||||
|
|
|
@ -116,4 +116,10 @@
|
||||||
#define LIST_FOREACH_SAFE(name,i,n,head) \
|
#define LIST_FOREACH_SAFE(name,i,n,head) \
|
||||||
for ((i) = (head); (i) && (((n) = (i)->name##_next), 1); (i) = (n))
|
for ((i) = (head); (i) && (((n) = (i)->name##_next), 1); (i) = (n))
|
||||||
|
|
||||||
|
#define LIST_FOREACH_BEFORE(name,i,p) \
|
||||||
|
for ((i) = (p)->name##_prev; (i); (i) = (i)->name##_prev)
|
||||||
|
|
||||||
|
#define LIST_FOREACH_AFTER(name,i,p) \
|
||||||
|
for ((i) = (p)->name##_next; (i); (i) = (i)->name##_next)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2217,6 +2217,9 @@ int manager_loop(Manager *m) {
|
||||||
if (manager_dispatch_dbus_queue(m) > 0)
|
if (manager_dispatch_dbus_queue(m) > 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (swap_dispatch_reload(m) > 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
if ((n = epoll_wait(m->epoll_fd, &event, 1, -1)) < 0) {
|
if ((n = epoll_wait(m->epoll_fd, &event, 1, -1)) < 0) {
|
||||||
|
|
||||||
if (errno == EINTR)
|
if (errno == EINTR)
|
||||||
|
|
|
@ -155,6 +155,8 @@ struct Manager {
|
||||||
|
|
||||||
/* Data specific to the swap filesystem */
|
/* Data specific to the swap filesystem */
|
||||||
FILE *proc_swaps;
|
FILE *proc_swaps;
|
||||||
|
Hashmap *swaps_by_proc_swaps;
|
||||||
|
bool request_reload;
|
||||||
|
|
||||||
/* Data specific to the D-Bus subsystem */
|
/* Data specific to the D-Bus subsystem */
|
||||||
DBusConnection *api_bus, *system_bus;
|
DBusConnection *api_bus, *system_bus;
|
||||||
|
|
814
src/swap.c
814
src/swap.c
File diff suppressed because it is too large
Load diff
51
src/swap.h
51
src/swap.h
|
@ -29,12 +29,25 @@ typedef struct Swap Swap;
|
||||||
|
|
||||||
typedef enum SwapState {
|
typedef enum SwapState {
|
||||||
SWAP_DEAD,
|
SWAP_DEAD,
|
||||||
|
SWAP_ACTIVATING,
|
||||||
SWAP_ACTIVE,
|
SWAP_ACTIVE,
|
||||||
|
SWAP_DEACTIVATING,
|
||||||
|
SWAP_ACTIVATING_SIGTERM,
|
||||||
|
SWAP_ACTIVATING_SIGKILL,
|
||||||
|
SWAP_DEACTIVATING_SIGTERM,
|
||||||
|
SWAP_DEACTIVATING_SIGKILL,
|
||||||
SWAP_FAILED,
|
SWAP_FAILED,
|
||||||
_SWAP_STATE_MAX,
|
_SWAP_STATE_MAX,
|
||||||
_SWAP_STATE_INVALID = -1
|
_SWAP_STATE_INVALID = -1
|
||||||
} SwapState;
|
} SwapState;
|
||||||
|
|
||||||
|
typedef enum SwapExecCommand {
|
||||||
|
SWAP_EXEC_ACTIVATE,
|
||||||
|
SWAP_EXEC_DEACTIVATE,
|
||||||
|
_SWAP_EXEC_COMMAND_MAX,
|
||||||
|
_SWAP_EXEC_COMMAND_INVALID = -1
|
||||||
|
} SwapExecCommand;
|
||||||
|
|
||||||
typedef struct SwapParameters {
|
typedef struct SwapParameters {
|
||||||
char *what;
|
char *what;
|
||||||
int priority;
|
int priority;
|
||||||
|
@ -46,27 +59,55 @@ typedef struct SwapParameters {
|
||||||
struct Swap {
|
struct Swap {
|
||||||
Meta meta;
|
Meta meta;
|
||||||
|
|
||||||
|
char *what;
|
||||||
|
|
||||||
SwapParameters parameters_etc_fstab;
|
SwapParameters parameters_etc_fstab;
|
||||||
SwapParameters parameters_proc_swaps;
|
SwapParameters parameters_proc_swaps;
|
||||||
SwapParameters parameters_fragment;
|
SwapParameters parameters_fragment;
|
||||||
|
|
||||||
char *what;
|
|
||||||
|
|
||||||
SwapState state, deserialized_state;
|
|
||||||
|
|
||||||
bool from_etc_fstab:1;
|
bool from_etc_fstab:1;
|
||||||
bool from_proc_swaps:1;
|
bool from_proc_swaps:1;
|
||||||
bool from_fragment:1;
|
bool from_fragment:1;
|
||||||
|
|
||||||
|
bool failure:1;
|
||||||
|
|
||||||
|
/* Used while looking for swaps that vanished or got added
|
||||||
|
* from/to /proc/swaps */
|
||||||
|
bool is_active:1;
|
||||||
|
bool just_activated:1;
|
||||||
|
|
||||||
|
usec_t timeout_usec;
|
||||||
|
|
||||||
|
ExecCommand exec_command[_SWAP_EXEC_COMMAND_MAX];
|
||||||
|
ExecContext exec_context;
|
||||||
|
|
||||||
|
SwapState state, deserialized_state;
|
||||||
|
|
||||||
|
ExecCommand* control_command;
|
||||||
|
SwapExecCommand control_command_id;
|
||||||
|
pid_t control_pid;
|
||||||
|
|
||||||
|
Watch timer_watch;
|
||||||
|
|
||||||
|
/* In order to be able to distuingish dependencies on
|
||||||
|
different device nodes we might end up creating multiple
|
||||||
|
devices for the same swap. We chain them up here. */
|
||||||
|
|
||||||
|
LIST_FIELDS(struct Swap, same_proc_swaps);
|
||||||
};
|
};
|
||||||
|
|
||||||
extern const UnitVTable swap_vtable;
|
extern const UnitVTable swap_vtable;
|
||||||
|
|
||||||
int swap_add_one(Manager *m, const char *what, int prio, bool no_auto, bool no_fail, bool handle, bool from_proc_swap);
|
int swap_add_one(Manager *m, const char *what, const char *what_proc_swaps, int prio, bool no_auto, bool no_fail, bool handle, bool set_flags);
|
||||||
|
|
||||||
int swap_add_one_mount_link(Swap *s, Mount *m);
|
int swap_add_one_mount_link(Swap *s, Mount *m);
|
||||||
|
|
||||||
|
int swap_dispatch_reload(Manager *m);
|
||||||
|
|
||||||
const char* swap_state_to_string(SwapState i);
|
const char* swap_state_to_string(SwapState i);
|
||||||
SwapState swap_state_from_string(const char *s);
|
SwapState swap_state_from_string(const char *s);
|
||||||
|
|
||||||
|
const char* swap_exec_command_to_string(SwapExecCommand i);
|
||||||
|
SwapExecCommand swap_exec_command_from_string(const char *s);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -376,7 +376,6 @@ void unit_free(Unit *u) {
|
||||||
set_free_free(u->meta.names);
|
set_free_free(u->meta.names);
|
||||||
|
|
||||||
free(u->meta.instance);
|
free(u->meta.instance);
|
||||||
|
|
||||||
free(u);
|
free(u);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue