[lxc-devel] [PATCH] Check for symlinks before attempting create.

Michael H. Warfield mhw at WittsEnd.com
Fri Apr 25 16:06:44 UTC 2014


Check for symlinks before attempting create.

When attempting to create the compulsory symlinks in /dev,
check for the existence of the link using stat first before
blindly attempting to create the link.

This works around an apparent quirk in the kernel VFS on read-only
file systems where the returned error code might be EEXIST or EROFS
depending on previous access to the /dev directory and its entries.

Signed-off-by: Michael H. Warfield <mhw at WittsEnd.com>
---
 src/lxc/conf.c | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/src/lxc/conf.c b/src/lxc/conf.c
index 06235fb..18da296 100644
--- a/src/lxc/conf.c
+++ b/src/lxc/conf.c
@@ -828,6 +828,7 @@ static int setup_dev_symlinks(const struct lxc_rootfs *rootfs)
 {
 	char path[MAXPATHLEN];
 	int ret,i;
+	struct stat s;
 
 
 	for (i = 0; i < sizeof(dev_symlinks) / sizeof(dev_symlinks[0]); i++) {
@@ -835,10 +836,24 @@ static int setup_dev_symlinks(const struct lxc_rootfs *rootfs)
 		ret = snprintf(path, sizeof(path), "%s/dev/%s", rootfs->mount, d->name);
 		if (ret < 0 || ret >= MAXPATHLEN)
 			return -1;
+
+		/*
+		 * Stat the path first.  If we don't get an error
+		 * accept it as is and don't try to create it
+		 */
+		if (!stat(path, &s)) {
+			continue;
+		}
+
 		ret = symlink(d->oldpath, path);
+
 		if (ret && errno != EEXIST) {
-			SYSERROR("Error creating %s", path);
-			return -1;
+			if ( errno == EROFS ) {
+				WARN("Warning: Read Only file system while creating %s", path);
+			} else {
+				SYSERROR("Error creating %s", path);
+				return -1;
+			}
 		}
 	}
 	return 0;
-- 
1.9.0




-- 
Michael H. Warfield (AI4NB) | (770) 978-7061 |  mhw at WittsEnd.com
   /\/\|=mhw=|\/\/          | (678) 463-0932 |  http://www.wittsend.com/mhw/
   NIC whois: MHW9          | An optimist believes we live in the best of all
 PGP Key: 0x674627FF        | possible worlds.  A pessimist is sure of it!

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 482 bytes
Desc: This is a digitally signed message part
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20140425/157686ec/attachment.sig>


More information about the lxc-devel mailing list