Re: open_by_handle on a file ?

Dave Chinner
2010-05-12T22:19:38Z

On Wed, May 12, 2010 at 05:39:44PM +0200, DENIEL Philippe wrote:
> Hi,
>
> I start using libhandle.so from xfsprogs-3.0.3 package. I meet an
> issue here : I can get a handle from files or directory.
> When used on diretories, open_by_handle works fine : I can read
> entries in it by using getdents, create stuff / removing stuff by
> using the ATFILE_FUNCTION (mkdirat, renameat, ...)
>
> Trouble start when I want to open a file with open_by_handle. I have
> a small test program that does this :
>
> rc = path_to_fshandle( path_dir, (void **)(&fshandle),
> &fshandlelen) ;
> if( rc < 0 ) exit( -1)
> rc = path_to_handle( path_dir, (void **)(&filehandle), &handlelen) ;
> if( rc < 0 ) exit( -1 )
>
> fd = open_by_handle( filehandle, handlelen, O_RDONLY ) ;
> printf( "open_by_handle: fd=%d \n", fd ) ;
> if( fd < 0 )
> printf( "----> Error=%d | %s\n", errno, strerror( errno ) ) ;
>
> The open_by_handle failed with errno=20 aka ENOTDIR, which is true,
> this is a file and no directory.

I think that is because the path_dir points to a regular file and
so path_to_fshandle() is generating a fshandle that points to a file
instead of a directory. This handle is cached inside libhandle, and
then use for subsequent handle calls like open_by_handle(). The
kernel rejects the request is the fshandle does not point to a
directory.

Try using the mount point or a directory within the mount for
the path_to_fshandle() call and see if that fixes the problem.

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com