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 <[email protected]>
---
 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 |  [email protected]
   /\/\|=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!

Attachment: signature.asc
Description: This is a digitally signed message part

_______________________________________________
lxc-devel mailing list
[email protected]
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to