mirror of
https://github.com/systemd/systemd.git
synced 2024-12-22 17:35:35 +03: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()!
|
||||
|
||||
* fix merging in .swap units
|
||||
|
||||
* chkconfig/systemd-install glue
|
||||
|
||||
* io priority during initialization
|
||||
@ -80,8 +78,6 @@
|
||||
|
||||
* beefed up tmpwatch that reads tmpfiles.d
|
||||
|
||||
* use /sbin/swapon
|
||||
|
||||
* enable syslog.socket by default, activating our kmsg bridge
|
||||
|
||||
* 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)
|
||||
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))
|
||||
return -EEXIST;
|
||||
|
||||
|
@ -116,4 +116,10 @@
|
||||
#define LIST_FOREACH_SAFE(name,i,n,head) \
|
||||
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
|
||||
|
@ -2217,6 +2217,9 @@ int manager_loop(Manager *m) {
|
||||
if (manager_dispatch_dbus_queue(m) > 0)
|
||||
continue;
|
||||
|
||||
if (swap_dispatch_reload(m) > 0)
|
||||
continue;
|
||||
|
||||
if ((n = epoll_wait(m->epoll_fd, &event, 1, -1)) < 0) {
|
||||
|
||||
if (errno == EINTR)
|
||||
|
@ -155,6 +155,8 @@ struct Manager {
|
||||
|
||||
/* Data specific to the swap filesystem */
|
||||
FILE *proc_swaps;
|
||||
Hashmap *swaps_by_proc_swaps;
|
||||
bool request_reload;
|
||||
|
||||
/* Data specific to the D-Bus subsystem */
|
||||
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 {
|
||||
SWAP_DEAD,
|
||||
SWAP_ACTIVATING,
|
||||
SWAP_ACTIVE,
|
||||
SWAP_DEACTIVATING,
|
||||
SWAP_ACTIVATING_SIGTERM,
|
||||
SWAP_ACTIVATING_SIGKILL,
|
||||
SWAP_DEACTIVATING_SIGTERM,
|
||||
SWAP_DEACTIVATING_SIGKILL,
|
||||
SWAP_FAILED,
|
||||
_SWAP_STATE_MAX,
|
||||
_SWAP_STATE_INVALID = -1
|
||||
} SwapState;
|
||||
|
||||
typedef enum SwapExecCommand {
|
||||
SWAP_EXEC_ACTIVATE,
|
||||
SWAP_EXEC_DEACTIVATE,
|
||||
_SWAP_EXEC_COMMAND_MAX,
|
||||
_SWAP_EXEC_COMMAND_INVALID = -1
|
||||
} SwapExecCommand;
|
||||
|
||||
typedef struct SwapParameters {
|
||||
char *what;
|
||||
int priority;
|
||||
@ -46,27 +59,55 @@ typedef struct SwapParameters {
|
||||
struct Swap {
|
||||
Meta meta;
|
||||
|
||||
char *what;
|
||||
|
||||
SwapParameters parameters_etc_fstab;
|
||||
SwapParameters parameters_proc_swaps;
|
||||
SwapParameters parameters_fragment;
|
||||
|
||||
char *what;
|
||||
|
||||
SwapState state, deserialized_state;
|
||||
|
||||
bool from_etc_fstab:1;
|
||||
bool from_proc_swaps: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;
|
||||
|
||||
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_dispatch_reload(Manager *m);
|
||||
|
||||
const char* swap_state_to_string(SwapState i);
|
||||
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
|
||||
|
@ -376,7 +376,6 @@ void unit_free(Unit *u) {
|
||||
set_free_free(u->meta.names);
|
||||
|
||||
free(u->meta.instance);
|
||||
|
||||
free(u);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user