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!
signature.asc
Description: This is a digitally signed message part
_______________________________________________ lxc-devel mailing list [email protected] http://lists.linuxcontainers.org/listinfo/lxc-devel
