aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarrick J. Wong <darrick.wong@oracle.com>2018-04-12 10:34:11 -0500
committerEric Sandeen <sandeen@redhat.com>2018-04-12 10:34:11 -0500
commit07c6fd5956da012539ea876787ea1227cf1e8857 (patch)
tree46620bb03bf206c92ed7d5f229c732ce699c0f1a
parente4e022f9db759b5e45ff08974b12e050d5f4f769 (diff)
downloadxfsprogs-dev-07c6fd5956da012539ea876787ea1227cf1e8857.tar.gz
xfs_scrub_all: escape paths being passed to systemd service instances
systemd doesn't like unit instance names with slashes in them, so it replaces them with dashes when it invokes the service. However, it's not smart enough to convert the dashes to something else, so when it unescapes the instance name to feed to xfs_scrub, it turns all dashes into slashes. "/moo-cow" becomes "-moo-cow" becomes "/moo/cow", which is wrong. systemd actually /can/ escape the dashes correctly if it is told that this is a path (and not a unit name), but it didn't do this prior to January 2017, so fix this for them. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Eric Sandeen <sandeen@redhat.com> Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
-rw-r--r--scrub/xfs_scrub_all.in24
1 files changed, 23 insertions, 1 deletions
diff --git a/scrub/xfs_scrub_all.in b/scrub/xfs_scrub_all.in
index aed66a1ac2..83c4e21847 100644
--- a/scrub/xfs_scrub_all.in
+++ b/scrub/xfs_scrub_all.in
@@ -87,6 +87,28 @@ def run_killable(cmd, stdout, killfuncs, kill_fn):
except:
return -1
+# systemd doesn't like unit instance names with slashes in them, so it
+# replaces them with dashes when it invokes the service. However, it's not
+# smart enough to convert the dashes to something else, so when it unescapes
+# the instance name to feed to xfs_scrub, it turns all dashes into slashes.
+# "/moo-cow" becomes "-moo-cow" becomes "/moo/cow", which is wrong. systemd
+# actually /can/ escape the dashes correctly if it is told that this is a path
+# (and not a unit name), but it didn't do this prior to January 2017, so fix
+# this for them.
+def systemd_escape(path):
+ '''Escape a path to avoid mangled systemd mangling.'''
+
+ if '-' not in path:
+ return path
+ cmd = ['systemd-escape', '--path', path]
+ try:
+ proc = subprocess.Popen(cmd, stdout = subprocess.PIPE)
+ proc.wait()
+ for line in proc.stdout:
+ return '-' + line.decode(sys.stdout.encoding).strip()
+ except:
+ return path
+
def run_scrub(mnt, cond, running_devs, mntdevs, killfuncs):
'''Run a scrub process.'''
global retcode, terminate
@@ -99,7 +121,7 @@ def run_scrub(mnt, cond, running_devs, mntdevs, killfuncs):
return
# Try it the systemd way
- cmd=['systemctl', 'start', 'xfs_scrub@%s' % mnt]
+ cmd=['systemctl', 'start', 'xfs_scrub@%s' % systemd_escape(mnt)]
ret = run_killable(cmd, DEVNULL(), killfuncs, \
lambda proc: kill_systemd('xfs_scrub@%s' % mnt, proc))
if ret == 0 or ret == 1: