[PATCH 1/2] add lpath_to_handle to libhandle
Alex Elder
aelder at sgi.com
Fri Oct 23 13:08:37 CDT 2009
Bill Kendall wrote:
> 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.
Looks good. I will up the version number after get this pulled in.
I will publish this and get the version number/dependency stuff
straightened out before I take the change for xfsrestore.
-Alex
> Signed-off-by: Bill Kendall <wkendall at sgi.com>
Reviewed-by: Alex Elder <aelder at sgi.com>
> diff --git a/include/handle.h b/include/handle.h
> index b211a2f..3f1a137 100644
> --- a/include/handle.h
> +++ b/include/handle.h
> @@ -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);
> diff --git a/libhandle/handle.c b/libhandle/handle.c
> index 6276797..6c9380d 100644
> --- a/libhandle/handle.c
> +++ b/libhandle/handle.c
> @@ -111,16 +111,29 @@ path_to_handle(
> 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;
>
> _______________________________________________
> xfs mailing list
> xfs at oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs
More information about the xfs
mailing list