xfs
[Top] [All Lists]

Re: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support

To: Jan Tulak <jtulak@xxxxxxxxxx>
Subject: Re: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support
From: Christoph Hellwig <hch@xxxxxxxxxxxxx>
Date: Mon, 17 Aug 2015 12:32:23 -0700
Cc: xfs@xxxxxxxxxxx, hch@xxxxxxxxxxxxx
Delivered-to: xfs@xxxxxxxxxxx
In-reply-to: <1439828606-7886-6-git-send-email-jtulak@xxxxxxxxxx>
References: <1439828606-7886-1-git-send-email-jtulak@xxxxxxxxxx> <1439828606-7886-6-git-send-email-jtulak@xxxxxxxxxx>
User-agent: Mutt/1.5.23 (2014-03-12)
On Mon, Aug 17, 2015 at 06:23:20PM +0200, Jan Tulak wrote:
> Add and update various API, macros and types where is some change
> in OS X or xfsprogs. Most changes are in darwin.h.
> 
> Add dummy implementations where native support is nonexistent
> and the tools are not expected to work anyway, so all tools can be
> at least compiled.
> 
> Signed-off-by: Jan Tulak <jtulak@xxxxxxxxxx>
> Reviewed-by: Christoph Hellwig <hch@xxxxxx>
> ---
>  fsr/xfs_fsr.c    |   8 +++
>  include/darwin.h | 153 
> +++++++++++++++++++++++++++++++++++++++++++++++++------
>  2 files changed, 145 insertions(+), 16 deletions(-)
> 
> diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c
> index 7c1d776..b4ff136 100644
> --- a/fsr/xfs_fsr.c
> +++ b/fsr/xfs_fsr.c
> @@ -43,6 +43,14 @@
>  #define _PATH_FSRLAST                "/var/tmp/.fsrlast_xfs"
>  #define _PATH_PROC_MOUNTS    "/proc/mounts"
>  
> +#ifdef USE_DUMMY_XATTR
> +     /* OS X has fsetxattr with different number of arguments.
> +      * Because it won't work anyway (no fstab/mtab and so on),
> +      * hijack the call to a dummy function so it can at least
> +      * compile.
> +      */
> +#  define fsetxattr(a,b,c,d,e) dummy_fsetxattr(a,b,c,d,e)
> +#endif

I don't think this is the right way to do it.  I'd rather:

a) check for fsetxattr using autoconf, and
b) stub out the whole code calling it.
c) make this a patch on it's own

>  
>  char *progname;
>  
> diff --git a/include/darwin.h b/include/darwin.h
> index 8b5a661..775dfc8 100644
> --- a/include/darwin.h
> +++ b/include/darwin.h
> @@ -76,45 +76,37 @@ static __inline__ void platform_getoptreset(void)
>  
>  static __inline__ int platform_uuid_compare(uuid_t *uu1, uuid_t *uu2)
>  {
> -     return uuid_compare(uu1, uu2, NULL);
> +     return uuid_compare((const unsigned char *) uu1, (const unsigned char*) 
> uu2);

Do you have any idea why MacOS defines a uuid_t, but wants unsigned
char arguments to uuid_compare?

Or given that the others work with pointer dereferences why doesn't:

        return uuid_compare(*uu1, *uu2);

work?

Also please make the uuid changes a patch on it's own.

> -#define ENOATTR              989     /* Attribute not found */
>  #define EFSCORRUPTED 990     /* Filesystem is corrupted */
>  #define EFSBADCRC    991     /* Bad CRC detected */
>  #define constpp              char * const *

> +#define XATTR_SIZE_MAX 65536    /* size of an extended attribute value (64k) 
> */
> +#define XATTR_LIST_MAX 65536    /* size of extended attribute namelist (64k) 
> */

Eww, looks like we depend on these Linux values in the on disk
defintion.  I think we need to add new XFS_XATTR_SIZE_MAX and
XFS_XATTR_LIST_MAX defintions to xfs_format.h and use them where
we currently use these.

> +/*
> + * Dummy POSIX timer replacement
> + */
> +#define CLOCK_REALTIME 1
> +typedef uint64_t timer_t;
> +typedef double   timer_c;
> +typedef clock_id_t clockid_t;
> +struct itimerspec
> +  {
> +    struct timespec it_interval;
> +    struct timespec it_value;
> +  };
> +
> +static inline int timer_create (clockid_t __clock_id,
> +                         struct sigevent *__restrict __evp,
> +                         timer_t *__restrict __timerid)
> +{
> +     return 0;
> +}
> +
> +static inline int timer_settime (timer_t __timerid, int __flags,
> +                          const struct itimerspec *__restrict __value,
> +                          struct itimerspec *__restrict __ovalue)
> +{
> +     return 0;
> +}
> +
> +static inline int timer_delete (timer_t __timerid)
> +{
> +     return 0;
> +}
> +
> +static inline int timer_gettime (timer_t __timerid, struct itimerspec 
> *__value)
> +{
> +     return 0;
> +}

I don't think these stubs will work.  It might be worth to figure
out what people use as replacement for realtime clocks on MacOS
by searching various programming resoures on the internet.

> +static inline int nftw64(const char *path, int (*fn)(const char *, const 
> struct stat *ptr, int flag, struct FTW *), int depth,
> +         int flags)
> +{
> +     return nftw(path, fn, depth, flags);
> +}
> +
> +#define MREMAP_FIXED 1
> +#define MREMAP_MAYMOVE 2
> +static inline void *mremap(void *old_address, size_t old_size,
> +                    size_t new_size, int flags, ... /* void *new_address */)
> +{
> +     return NULL;
> +}
> +
> +/* FSR */

Please just build the mremap file in xfs_io conditional.

> +typedef int __fsblkcnt_t;
> +typedef int __fsfilcnt_t;
> +typedef long long int __fsblkcnt64_t;
> +typedef long long int __fsfilcnt64_t;
> +
> +struct statvfs64
> +{
> +     unsigned long int f_bsize;
> +     unsigned long int f_frsize;
> +     __fsblkcnt64_t f_blocks;
> +     __fsblkcnt64_t f_bfree;
> +     __fsblkcnt64_t f_bavail;
> +     __fsfilcnt64_t f_files;
> +     __fsfilcnt64_t f_ffree;
> +     __fsfilcnt64_t f_favail;
> +     unsigned long int f_fsid;
> +     int __f_unused;
> +     unsigned long int f_flag;
> +     unsigned long int f_namemax;
> +     int __f_spare[6];
> +};

Does MacOS support statvfs? or statfs?  We should use the proper API
here instead of a dummy.  Or maybe just not build fsr on OSX for now,
as that would solve the fsetxattr issue as well.

> +struct mntent
> +{

Another fsr issue, right?  Seems like it would need similar getmntinfo
based code.  As a stopgap I'd suggest we stop building fsr on OSX for
now.

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