]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
add lpath_to_handle to libhandle
authorBill Kendall <wkendall@sgi.com>
Thu, 22 Oct 2009 16:52:23 +0000 (16:52 +0000)
committerAlex Elder <aelder@sgi.com>
Fri, 23 Oct 2009 18:18:59 +0000 (13:18 -0500)
path_to_handle() is not reliable when called on a path which
is a symlink. If the symlink is dangling, or if its points
to a non-XFS filesystem then path_to_handle() will fail. The
reason is that path_to_handle() must open the path in order
to obtain an fd for the xfsctl call.

It's common during xfsrestore to have dangling symlinks since
the target of the link may not be restored before the symlink.

This patch adds a new function to libhandle, lpath_to_handle.
It is just like path_to_handle, except it takes a filesystem
path in addition to the path which you want convert to a
handle.

Alex Elder is going to take care of bumping the libhandle
minor number, and adjusting the xfsdump/xfsprogs version numbers
and dependencies to ensure a compatible libhandle is installed
for xfsdump.

Signed-off-by: Bill Kendall <wkendall@sgi.com>
Reviewed-by: Alex Elder <aelder@sgi.com>
Signed-off-by: Alex Elder <aelder@sgi.com>
include/handle.h
libhandle/handle.c

index b211a2f4526ec173e18f27cd6acd5b143ac4b9d1..3f1a137f785dc3be1ae8fd0ed783f8af96c5dec2 100644 (file)
@@ -27,6 +27,8 @@ struct attrlist_cursor;
 struct parent;
 
 extern int  path_to_handle (char *__path, void **__hanp, size_t *__hlen);
+extern int  lpath_to_handle (char *__fspath, char *__path,
+                            void **__hanp, size_t *__hlen);
 extern int  path_to_fshandle (char *__path, void **__fshanp, size_t *__fshlen);
 extern int  handle_to_fshandle (void *__hanp, size_t __hlen, void **__fshanp,
                                size_t *__fshlen);
index 6276797485ec12360f53af2ea772b4fb8b9e7ead..6c9380de3b29049fde4942b46bf5dc60f8bac6b8 100644 (file)
@@ -110,17 +110,30 @@ path_to_handle(
        char            *path,          /* input,  path to convert */
        void            **hanp,         /* output, pointer to data */
        size_t          *hlen)          /* output, size of returned data */
+{
+       return lpath_to_handle(path, path, hanp, hlen);
+}
+
+/* Like path_to_handle, but reliable for paths which are either dangling
+ * symlinks or symlinks whose targets are not in XFS filesystems.
+ */
+int
+lpath_to_handle(
+       char            *fspath,        /* input,  path in filesystem */
+       char            *path,          /* input,  path to convert */
+       void            **hanp,         /* output, pointer to data */
+       size_t          *hlen)          /* output, size of returned data */
 {
        int             fd;
        int             result;
        comarg_t        obj;
 
-       fd = open(path, O_RDONLY);
+       fd = open(fspath, O_RDONLY);
        if (fd < 0)
                return -1;
 
        obj.path = path;
-       result = obj_to_handle(path, fd, XFS_IOC_PATH_TO_HANDLE,
+       result = obj_to_handle(fspath, fd, XFS_IOC_PATH_TO_HANDLE,
                                obj, hanp, hlen);
        close(fd);
        return result;