diff options
author | Karel Zak | 2016-03-24 11:51:12 +0100 |
---|---|---|
committer | Karel Zak | 2016-04-13 12:29:16 +0200 |
commit | 2238214ddc81d8ecab386d9e38d68f9357e2ad74 (patch) | |
tree | 6787fb2fb67d2b7fdac7c1e75af87828e51a6686 /include/canonicalize.h | |
parent | script: use empty-slave heuristic more carefully (diff) | |
download | kernel-qcow2-util-linux-2238214ddc81d8ecab386d9e38d68f9357e2ad74.tar.gz kernel-qcow2-util-linux-2238214ddc81d8ecab386d9e38d68f9357e2ad74.tar.xz kernel-qcow2-util-linux-2238214ddc81d8ecab386d9e38d68f9357e2ad74.zip |
libmount: try absolute target before canonicalize
The path canonicalization is expensive and in many cases unwanted due
to problems with readlink() on unreachable NFS and automounters.
This patch add a possibility to search also by $(CWD)/<path> if the
<path> is relative to reduce number of situation when we convert the
path to the canonical absolute path.
The common use-case:
# cd /some/long/path
# umount ./mountpoint
old version:
15543: libmount: TAB: [0x560a99a54230]: lookup TARGET: './test'
15543: libmount: CACHE: [0x560a99a54290]: canonicalize path ./test
15543: libmount: CACHE: [0x560a99a54290]: add entry [ 1] (path): /mnt/test: ./test
15543: libmount: TAB: [0x560a99a54230]: lookup canonical TARGET: '/mnt/test'
15543: libmount: CXT: [0x560a99a54050]: umount fs: /mnt/test
new version:
15597: libmount: TAB: [0xabf230]: lookup TARGET: './test'
15597: libmount: TAB: [0xabf230]: lookup absolute TARGET: '/mnt/test'
15597: libmount: CXT: [0xabf050]: umount fs: /mnt/test
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'include/canonicalize.h')
-rw-r--r-- | include/canonicalize.h | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/include/canonicalize.h b/include/canonicalize.h index 7a18aca09..0a292fc32 100644 --- a/include/canonicalize.h +++ b/include/canonicalize.h @@ -13,9 +13,19 @@ #define CANONICALIZE_H #include "c.h" /* for PATH_MAX */ +#include "strutils.h" extern char *canonicalize_path(const char *path); extern char *canonicalize_path_restricted(const char *path); extern char *canonicalize_dm_name(const char *ptname); +extern char *absolute_path(const char *path); + +static inline int is_relative_path(const char *path) +{ + if (!path || *path == '/') + return 0; + return 1; +} + #endif /* CANONICALIZE_H */ |