[lxc-devel] Patch: rootfs pinning: make file hidden, don't delete it (but not encode pid)

Jäkel, Guido G.Jaekel at dnb.de
Thu Mar 22 15:39:57 UTC 2018


Dear Serge and others

I suggest the following patch:

--- lxc/conf.c.20180315-160849  2018-03-15 16:08:49.283081271 +0100
+++ lxc/conf.c  2018-03-22 16:36:13.282864098 +0100
@@ -546,10 +546,11 @@
 
 /*
  * pin_rootfs
- * if rootfs is a directory, then open ${rootfs}/lxc.hold for writing for
+ * if rootfs is a directory, then open ${rootfs}/.lxc-keep for writing for
  * the duration of the container run, to prevent the container from marking
  * the underlying fs readonly on shutdown. unlink the file immediately so
  * no name pollution is happens
+ * don't unlink on NFS to avoid random named stale handles
  * return -1 on error.
  * return -2 if nothing needed to be pinned.
  * return an open fd (>=0) if we pinned it.
@@ -559,6 +560,7 @@
        char absrootfs[MAXPATHLEN];
        char absrootfspin[MAXPATHLEN];
        struct stat s;
+       struct statfs sfs;
        int ret, fd;
 
        if (rootfs == NULL || strlen(rootfs) == 0)
@@ -576,13 +578,23 @@
        if (!S_ISDIR(s.st_mode))
                return -2;
 
-       ret = snprintf(absrootfspin, MAXPATHLEN, "%s/lxc.hold", absrootfs);
+       ret = snprintf(absrootfspin, MAXPATHLEN, "%s/.lxc-keep", absrootfs);
        if (ret >= MAXPATHLEN)
                return -1;
 
        fd = open(absrootfspin, O_CREAT | O_RDWR, S_IWUSR|S_IRUSR);
        if (fd < 0)
                return fd;
+
+       if (fstatfs (fd, &sfs)) {
+               return -1;
+       }
+
+       if (sfs.f_type == NFS_SUPER_MAGIC) {
+               DEBUG("rootfs on NFS, not unlinking pin file \"%s\".", absrootfspin);
+               return fd;
+       }
+
        (void)unlink(absrootfspin);
        return fd;
 }                                   



More information about the lxc-devel mailing list