diff options
author | Scott Moser <smoser@ubuntu.com> | 2013-11-19 12:20:26 -0500 |
---|---|---|
committer | Scott Moser <smoser@ubuntu.com> | 2013-11-19 12:20:26 -0500 |
commit | 90baa71abc12e923a8fde1b7e94867b81b9047f4 (patch) | |
tree | 065a7f961fcb67f768ceebd69e39bd551e6ae409 | |
parent | c47d8c776ec92ba98ae6e4887daee8052cc720d0 (diff) | |
parent | 318d527055bffce51cfac72956a7da2fa4018b4f (diff) | |
download | cloud-init-90baa71abc12e923a8fde1b7e94867b81b9047f4.tar.gz |
fix issue with get_mount_info on older kernels
This removes the requirement for /proc/PID/mountinfo, which was added in linux
kernel 2.6.26. We could potentially re-visit this and read /proc/mounts rather
than /proc/mtab, but mtab proves effective in testing.
-rw-r--r-- | ChangeLog | 2 | ||||
-rw-r--r-- | cloudinit/util.py | 16 |
2 files changed, 16 insertions, 2 deletions
@@ -8,6 +8,8 @@ - support apt-add-archive with 'cloud-archive:' format. (LP: #1244355) - Change SmartOS verb for availability zone (LP: #1249124) - documentation fix for boothooks to use 'cloud-init-per' + - fix resizefs module by supporting kernels that do not have + /proc/PID/mountinfo. (LP: #1248625) [Tim Daly Jr.] 0.7.3: - fix omnibus chef installer (LP: #1182265) [Chris Wing] - small fix for OVF datasource for iso transport on non-iso9660 filesystem diff --git a/cloudinit/util.py b/cloudinit/util.py index 9e6e0a73..a8ddb390 100644 --- a/cloudinit/util.py +++ b/cloudinit/util.py @@ -1737,6 +1737,15 @@ def parse_mount_info(path, mountinfo_lines, log=LOG): return None +def parse_mtab(path): + """On older kernels there's no /proc/$$/mountinfo, so use mtab.""" + for line in load_file("/etc/mtab").splitlines(): + devpth, mount_point, fs_type = line.split()[:3] + if mount_point == path: + return devpth, fs_type, mount_point + return None + + def get_mount_info(path, log=LOG): # Use /proc/$$/mountinfo to find the device where path is mounted. # This is done because with a btrfs filesystem using os.stat(path) @@ -1767,8 +1776,11 @@ def get_mount_info(path, log=LOG): # So use /proc/$$/mountinfo to find the device underlying the # input path. mountinfo_path = '/proc/%s/mountinfo' % os.getpid() - lines = load_file(mountinfo_path).splitlines() - return parse_mount_info(path, lines, log) + if os.path.exists(mountinfo_path): + lines = load_file(mountinfo_path).splitlines() + return parse_mount_info(path, lines, log) + else: + return parse_mtab(path) def which(program): |