core: add catalog entry and MESSAGE_ID for overmounting

This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2012-12-05 11:59:05 +01:00
parent f3ffced541
commit 20ad4cfd8e
8 changed files with 35 additions and 8 deletions

2
TODO
View File

@ -43,8 +43,6 @@ Features:
include _SYSTEMD_UNIT= fields so that "systemctl status" can show include _SYSTEMD_UNIT= fields so that "systemctl status" can show
them along with the unit them along with the unit
* define a message ID for "overmounting non-empty directory" and write message catalog entry for it
* use polkit "imply" for binding hostname actions together * use polkit "imply" for binding hostname actions together
* journal: when waiting for journal additions always sleep at least 1s or so, in order to minimize wakeups * journal: when waiting for journal additions always sleep at least 1s or so, in order to minimize wakeups

View File

@ -276,3 +276,16 @@ One or more messages could not be forwarded to the syslog service
running side-by-side with journald. This usually indicates that the running side-by-side with journald. This usually indicates that the
syslog implementation has not been able to keep up with the speed of syslog implementation has not been able to keep up with the speed of
messages queued. messages queued.
-- 1dee0369c7fc4736b7099b38ecb46ee7
Subject: Mount point is not empty
Defined-By: systemd
Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
Documentation: http://www.freedesktop.org/wiki/Software/systemd/catalog/@MESSAGE_ID@
The directory @WHERE@ is specified as the mount point (second field in
/etc/fstab or Where= field in systemd unit file) and is not empty.
This does not interfere with mounting, but the pre-exisiting files in
this directory become inaccessible. To see those over-mounted files,
please manually mount the underlying file system to a secondary
location.

View File

@ -31,6 +31,7 @@
#include "unit.h" #include "unit.h"
#include "automount.h" #include "automount.h"
#include "mount.h"
#include "load-fragment.h" #include "load-fragment.h"
#include "load-dropin.h" #include "load-dropin.h"
#include "unit-name.h" #include "unit-name.h"
@ -507,8 +508,7 @@ static void automount_enter_waiting(Automount *a) {
/* We knowingly ignore the results of this call */ /* We knowingly ignore the results of this call */
mkdir_p_label(a->where, 0555); mkdir_p_label(a->where, 0555);
if (dir_is_empty(a->where) <= 0) warn_if_dir_nonempty(a->meta.id, a->where);
log_notice("%s: Directory %s to mount over is not empty, mounting anyway. (To see the over-mounted files, please manually mount the underlying file system to a secondary location.)", a->meta.id, a->where);
if (pipe2(p, O_NONBLOCK|O_CLOEXEC) < 0) { if (pipe2(p, O_NONBLOCK|O_CLOEXEC) < 0) {
r = -errno; r = -errno;

View File

@ -50,6 +50,7 @@
#include "capability.h" #include "capability.h"
#include "util.h" #include "util.h"
#include "log.h" #include "log.h"
#include "sd-messages.h"
#include "ioprio.h" #include "ioprio.h"
#include "securebits.h" #include "securebits.h"
#include "cgroup.h" #include "cgroup.h"
@ -62,8 +63,6 @@
#include "loopback-setup.h" #include "loopback-setup.h"
#include "path-util.h" #include "path-util.h"
#include "syscall-list.h" #include "syscall-list.h"
#include "sd-id128.h"
#include "sd-messages.h"
#define IDLE_TIMEOUT_USEC (5*USEC_PER_SEC) #define IDLE_TIMEOUT_USEC (5*USEC_PER_SEC)

View File

@ -30,6 +30,7 @@
#include "load-fragment.h" #include "load-fragment.h"
#include "load-dropin.h" #include "load-dropin.h"
#include "log.h" #include "log.h"
#include "sd-messages.h"
#include "strv.h" #include "strv.h"
#include "mkdir.h" #include "mkdir.h"
#include "path-util.h" #include "path-util.h"
@ -927,6 +928,18 @@ fail:
set_free(pid_set); set_free(pid_set);
} }
void warn_if_dir_nonempty(const char *unit, const char* where) {
if (dir_is_empty(where) > 0)
return;
log_struct(LOG_NOTICE,
"MESSAGE=%s: Directory %s to mount over is not empty, mounting anyway.",
unit, where,
"WHERE=%s", where,
"_SYSTEMD_UNIT=%s", unit,
MESSAGE_ID(SD_MESSAGE_OVERMOUNTING),
NULL);
}
static void mount_enter_unmounting(Mount *m) { static void mount_enter_unmounting(Mount *m) {
int r; int r;
@ -967,8 +980,7 @@ static void mount_enter_mounting(Mount *m) {
mkdir_p_label(m->where, m->directory_mode); mkdir_p_label(m->where, m->directory_mode);
if (dir_is_empty(m->where) <= 0) warn_if_dir_nonempty(m->meta.id, m->where);
log_notice("%s: Directory %s to mount over is not empty, mounting anyway. (To see the over-mounted files, please manually mount the underlying file system to a secondary location.)", m->meta.id, m->where);
/* Create the source directory for bind-mounts if needed */ /* Create the source directory for bind-mounts if needed */
p = get_mount_parameters_fragment(m); p = get_mount_parameters_fragment(m);

View File

@ -119,3 +119,5 @@ MountExecCommand mount_exec_command_from_string(const char *s);
const char* mount_result_to_string(MountResult i); const char* mount_result_to_string(MountResult i);
MountResult mount_result_from_string(const char *s); MountResult mount_result_from_string(const char *s);
void warn_if_dir_nonempty(const char *unit, const char* where);

View File

@ -27,6 +27,7 @@
#include <errno.h> #include <errno.h>
#include "macro.h" #include "macro.h"
#include "sd-id128.h"
typedef enum LogTarget{ typedef enum LogTarget{
LOG_TARGET_CONSOLE, LOG_TARGET_CONSOLE,

View File

@ -65,6 +65,8 @@ extern "C" {
#define SD_MESSAGE_FORWARD_SYSLOG_MISSED SD_ID128_MAKE(00,27,22,9c,a0,64,41,81,a7,6c,4e,92,45,8a,fa,2e) #define SD_MESSAGE_FORWARD_SYSLOG_MISSED SD_ID128_MAKE(00,27,22,9c,a0,64,41,81,a7,6c,4e,92,45,8a,fa,2e)
#define SD_MESSAGE_OVERMOUNTING SD_ID128_MAKE(1d,ee,03,69,c7,fc,47,36,b7,09,9b,38,ec,b4,6e,e7)
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif