swap: major rework, use /sbin/swapon for setting up swaps, fix merging of aliased swap disks

This commit is contained in:
Lennart Poettering 2010-10-12 04:07:43 +02:00
parent 60b912f6b1
commit e04aad61bb
8 changed files with 774 additions and 111 deletions

4
TODO
View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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)

View File

@ -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;

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -376,7 +376,6 @@ void unit_free(Unit *u) {
set_free_free(u->meta.names);
free(u->meta.instance);
free(u);
}