xfs
[Top] [All Lists]

RE: [PATCH 1/2] add lpath_to_handle to libhandle

To: "Bill Kendall" <wkendall@xxxxxxx>
Subject: RE: [PATCH 1/2] add lpath_to_handle to libhandle
From: "Alex Elder" <aelder@xxxxxxx>
Date: Fri, 23 Oct 2009 13:08:37 -0500
Cc: <xfs@xxxxxxxxxxx>
In-reply-to: <4AE08DC7.7000200@xxxxxxx>
Thread-index: AcpTOobSlI+qlO9vRUyRZwvb5cf0/AA0OKXg
Thread-topic: [PATCH 1/2] add lpath_to_handle to libhandle
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@xxxxxxx>

Reviewed-by: Alex Elder <aelder@xxxxxxx>

> 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@xxxxxxxxxxx
> http://oss.sgi.com/mailman/listinfo/xfs

<Prev in Thread] Current Thread [Next in Thread>