[systemd-devel] [PATCH] fstab overmount

John Lane systemd at jelmail.com
Tue Jan 15 07:47:04 PST 2013


---
 src/core/mount.c                      | 13 +++++++++-
 src/fstab-generator/fstab-generator.c | 49 +++++++++++++++++++++++++----------
 2 files changed, 47 insertions(+), 15 deletions(-)

diff --git a/src/core/mount.c b/src/core/mount.c
index 25bc7e1..8f35f68 100644
--- a/src/core/mount.c
+++ b/src/core/mount.c
@@ -518,6 +518,9 @@ static int mount_fix_timeouts(Mount *m) {
 static int mount_verify(Mount *m) {
         bool b;
         char *e;
+	char *ext, *suf;
+	int name_len;
+	char cm[strlen(UNIT(m)->id)];
         assert(m);
 
         if (UNIT(m)->load_state != UNIT_LOADED)
@@ -529,7 +532,15 @@ static int mount_verify(Mount *m) {
         if (!(e = unit_name_from_path(m->where, ".mount")))
                 return -ENOMEM;
 
-        b = unit_has_name(UNIT(m), e);
+	/* clean mount file name with any overmount suffix removed */
+	ext = strrchr(UNIT(m)->id,'.');
+	suf = strrchr(UNIT(m)->id,'_');
+	name_len = (suf ? suf : ext ) - UNIT(m)->id;
+        strncpy(cm,UNIT(m)->id, name_len);
+        strcpy(cm + name_len, ext);
+	log_debug("clean mount file name (with any overmount suffix removed): %s", cm);
+
+        b = unit_has_name(UNIT(m), e) || !strcmp(e,cm);
         free(e);
 
         if (!b) {
diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c
index 2b67bb6..aad2d49 100644
--- a/src/fstab-generator/fstab-generator.c
+++ b/src/fstab-generator/fstab-generator.c
@@ -198,6 +198,10 @@ static int add_mount(const char *what, const char *where, const char *type, cons
         int r;
         const char *post, *pre;
 
+        char uniq_suffix[10] = ".mount";
+        int uniq_num = 0;
+        char *prior_unit = NULL;
+
         assert(what);
         assert(where);
         assert(type);
@@ -224,22 +228,33 @@ static int add_mount(const char *what, const char *where, const char *type, cons
                 pre = SPECIAL_LOCAL_FS_PRE_TARGET;
         }
 
-        name = unit_name_from_path(where, ".mount");
-        if (!name)
-                return log_oom();
+        do {
 
-        unit = strjoin(arg_dest, "/", name, NULL);
-        if (!unit)
-                return log_oom();
+                name = unit_name_from_path(where, uniq_suffix);
+                if (!name)
+                        return log_oom();
 
-        f = fopen(unit, "wxe");
-        if (!f) {
-                if (errno == EEXIST)
-                        log_error("Failed to create mount unit file %s, as it already exists. Duplicate entry in /etc/fstab?", unit);
-                else
-                        log_error("Failed to create unit file %s: %m", unit);
-                return -errno;
-        }
+                unit = strjoin(arg_dest, "/", name, NULL);
+                if (!unit)
+                        return log_oom();
+
+                f = fopen(unit, "wxe");
+                if (!f) {
+                        if (errno == EEXIST)
+                        {
+                                free(prior_unit);
+                                prior_unit = strdup(name);
+                                snprintf(uniq_suffix, 10, "_%d.mount", uniq_num++);
+                                log_warning("Failed to create mount unit file %s because it already exists (overmount entry in /etc/fstab?). Will retry with suffix %s", unit, uniq_suffix);
+                        }
+                        else
+                        {
+                                log_error("Failed to create unit file %s: %m", unit);
+                                return -errno;
+                        }
+                }
+
+        } while (!f);
 
         fprintf(f,
               "# Automatically generated by systemd-fstab-generator\n\n"
@@ -257,6 +272,12 @@ static int add_mount(const char *what, const char *where, const char *type, cons
                         pre,
                         pre);
 
+        if (prior_unit) {
+                fprintf(f,
+                        "After=%s\n",
+                        prior_unit);
+                free(prior_unit);
+        }
 
         if (!noauto && !nofail && !automount)
                 fprintf(f,
-- 
1.8.0



More information about the systemd-devel mailing list