On 2/14/16 11:32 PM, Dave Chinner wrote: > From: Dave Chinner <dchinner@xxxxxxxxxx> > > The kernel commit to make this ioctl promotion (bb99e06ddf) moved > the definitions for the XFS ioctl to uapi/linux/fs.h for the > following reason: > > Hoist the ioctl definitions for the XFS_IOC_FS[SG]SETXATTR API > from fs/xfs/libxfs/xfs_fs.h to include/uapi/linux/fs.h so that > the ioctls can be used by all filesystems, not just XFS. This > enables (initially) ext4 to use the ioctl to set project IDs on > inodes. > > This means we now need to handle this change in userspace as the > uapi/linux/fs.h file may not contain the definitions (i.e. new > xfsprogs/ old linux uapi files) xfsprogs needs to build. Hence we > need to massage the definition in xfs_fs.h to take the values from > the system header if it exists, otherwise keep the old definitions > for compatibility and platforms other than linux. > > To this extent, we add the FS* definitions to the platform headers > so the FS* versions are available on all platforms, and add trivial > defines to xfs_fs.h to present the XFS* versions for backwards > compatibility with existing code. New code should always use the FS* > versions, and as such we also convert all the users of XFS* in > xfsprogs to use the FS* definitions. > > Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> Reviewed-by: Eric Sandeen <sandeen@xxxxxxxxxx> > --- > fsr/xfs_fsr.c | 16 ++++++---------- > include/darwin.h | 34 +++++++++++++++++++++++++++++++++ > include/freebsd.h | 34 +++++++++++++++++++++++++++++++++ > include/irix.h | 37 +++++++++++++++++++++++++++++++++--- > include/linux.h | 38 +++++++++++++++++++++++++++++++++++++ > io/attr.c | 40 +++++++++++++++++++-------------------- > io/bmap.c | 16 ++++++++-------- > io/open.c | 32 +++++++++++++++---------------- > libxcmd/projects.c | 8 ++++---- > libxfs/xfs_format.h | 2 -- > libxfs/xfs_fs.h | 54 +++++++++++++++++++++-------------------------------- > quota/free.c | 6 +++--- > quota/project.c | 16 ++++++++-------- > repair/dinode.c | 4 ++-- > rtcp/xfs_rtcp.c | 12 ++++++------ > 15 files changed, 234 insertions(+), 115 deletions(-) > > diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c > index 19838ed..d75990a 100644 > --- a/fsr/xfs_fsr.c > +++ b/fsr/xfs_fsr.c > @@ -33,10 +33,6 @@ > #include <sys/xattr.h> > #include <paths.h> > > -#ifndef XFS_XFLAG_NODEFRAG > -#define XFS_XFLAG_NODEFRAG 0x00002000 /* src dependancy, remove later */ > -#endif > - > #define _PATH_FSRLAST "/var/tmp/.fsrlast_xfs" > #define _PATH_PROC_MOUNTS "/proc/mounts" > > @@ -962,22 +958,22 @@ fsrfile_common( > return 1; > } > > - if ((ioctl(fd, XFS_IOC_FSGETXATTR, &fsx)) < 0) { > + if ((ioctl(fd, FS_IOC_FSGETXATTR, &fsx)) < 0) { > fsrprintf(_("failed to get inode attrs: %s\n"), fname); > return(-1); > } > - if (fsx.fsx_xflags & (XFS_XFLAG_IMMUTABLE|XFS_XFLAG_APPEND)) { > + if (fsx.fsx_xflags & (FS_XFLAG_IMMUTABLE|FS_XFLAG_APPEND)) { > if (vflag) > fsrprintf(_("%s: immutable/append, ignoring\n"), fname); > return(0); > } > - if (fsx.fsx_xflags & XFS_XFLAG_NODEFRAG) { > + if (fsx.fsx_xflags & FS_XFLAG_NODEFRAG) { > if (vflag) > fsrprintf(_("%s: marked as don't defrag, ignoring\n"), > fname); > return(0); > } > - if (fsx.fsx_xflags & XFS_XFLAG_REALTIME) { > + if (fsx.fsx_xflags & FS_XFLAG_REALTIME) { > if (xfs_getrt(fd, &vfss) < 0) { > fsrprintf(_("cannot get realtime geometry for: %s\n"), > fname); > @@ -1038,7 +1034,7 @@ fsr_setup_attr_fork( > int no_change_cnt = 0; > int ret; > > - if (!(bstatp->bs_xflags & XFS_XFLAG_HASATTR)) > + if (!(bstatp->bs_xflags & FS_XFLAG_HASATTR)) > return 0; > > /* > @@ -1264,7 +1260,7 @@ packfile(char *fname, char *tname, int fd, > > /* Setup extended inode flags, project identifier, etc */ > if (fsxp->fsx_xflags || fsxp->fsx_projid) { > - if (ioctl(tfd, XFS_IOC_FSSETXATTR, fsxp) < 0) { > + if (ioctl(tfd, FS_IOC_FSSETXATTR, fsxp) < 0) { > fsrprintf(_("could not set inode attrs on tmp: %s\n"), > tname); > goto out; > diff --git a/include/darwin.h b/include/darwin.h > index dd6132f..2baa536 100644 > --- a/include/darwin.h > +++ b/include/darwin.h > @@ -285,4 +285,38 @@ static inline void platform_mntent_close(struct mntent_cursor * cursor) > cursor->i = 0; > } > > +/* check whether we have to define FS_IOC_FS[GS]ETXATTR ourselves */ > +#ifndef HAVE_FSXATTR > +struct fsxattr { > + __u32 fsx_xflags; /* xflags field value (get/set) */ > + __u32 fsx_extsize; /* extsize field value (get/set)*/ > + __u32 fsx_nextents; /* nextents field value (get) */ > + __u32 fsx_projid; /* project identifier (get/set) */ > + unsigned char fsx_pad[12]; > +}; > + > +/* > + * Flags for the fsx_xflags field > + */ > +#define FS_XFLAG_REALTIME 0x00000001 /* data in realtime volume */ > +#define FS_XFLAG_PREALLOC 0x00000002 /* preallocated file extents */ > +#define FS_XFLAG_IMMUTABLE 0x00000008 /* file cannot be modified */ > +#define FS_XFLAG_APPEND 0x00000010 /* all writes append */ > +#define FS_XFLAG_SYNC 0x00000020 /* all writes synchronous */ > +#define FS_XFLAG_NOATIME 0x00000040 /* do not update access time */ > +#define FS_XFLAG_NODUMP 0x00000080 /* do not include in backups */ > +#define FS_XFLAG_RTINHERIT 0x00000100 /* create with rt bit set */ > +#define FS_XFLAG_PROJINHERIT 0x00000200 /* create with parents projid */ > +#define FS_XFLAG_NOSYMLINKS 0x00000400 /* disallow symlink creation */ > +#define FS_XFLAG_EXTSIZE 0x00000800 /* extent size allocator hint */ > +#define FS_XFLAG_EXTSZINHERIT 0x00001000 /* inherit inode extent size */ > +#define FS_XFLAG_NODEFRAG 0x00002000 /* do not defragment */ > +#define FS_XFLAG_FILESTREAM 0x00004000 /* use filestream allocator */ > +#define FS_XFLAG_HASATTR 0x80000000 /* no DIFLAG for this */ > + > +#define FS_IOC_FSGETXATTR _IOR ('X', 31, struct fsxattr) > +#define FS_IOC_FSSETXATTR _IOW ('X', 32, struct fsxattr) > + > +#endif > + > #endif /* __XFS_DARWIN_H__ */ > diff --git a/include/freebsd.h b/include/freebsd.h > index 65bd60a..fe567d4 100644 > --- a/include/freebsd.h > +++ b/include/freebsd.h > @@ -175,5 +175,39 @@ static inline void platform_mntent_close(struct mntent_cursor * cursor) > endmntent(cursor->mtabp); > } > > +/* check whether we have to define FS_IOC_FS[GS]ETXATTR ourselves */ > +#ifndef HAVE_FSXATTR > +struct fsxattr { > + __u32 fsx_xflags; /* xflags field value (get/set) */ > + __u32 fsx_extsize; /* extsize field value (get/set)*/ > + __u32 fsx_nextents; /* nextents field value (get) */ > + __u32 fsx_projid; /* project identifier (get/set) */ > + unsigned char fsx_pad[12]; > +}; > + > +/* > + * Flags for the fsx_xflags field > + */ > +#define FS_XFLAG_REALTIME 0x00000001 /* data in realtime volume */ > +#define FS_XFLAG_PREALLOC 0x00000002 /* preallocated file extents */ > +#define FS_XFLAG_IMMUTABLE 0x00000008 /* file cannot be modified */ > +#define FS_XFLAG_APPEND 0x00000010 /* all writes append */ > +#define FS_XFLAG_SYNC 0x00000020 /* all writes synchronous */ > +#define FS_XFLAG_NOATIME 0x00000040 /* do not update access time */ > +#define FS_XFLAG_NODUMP 0x00000080 /* do not include in backups */ > +#define FS_XFLAG_RTINHERIT 0x00000100 /* create with rt bit set */ > +#define FS_XFLAG_PROJINHERIT 0x00000200 /* create with parents projid */ > +#define FS_XFLAG_NOSYMLINKS 0x00000400 /* disallow symlink creation */ > +#define FS_XFLAG_EXTSIZE 0x00000800 /* extent size allocator hint */ > +#define FS_XFLAG_EXTSZINHERIT 0x00001000 /* inherit inode extent size */ > +#define FS_XFLAG_NODEFRAG 0x00002000 /* do not defragment */ > +#define FS_XFLAG_FILESTREAM 0x00004000 /* use filestream allocator */ > +#define FS_XFLAG_HASATTR 0x80000000 /* no DIFLAG for this */ > + > +#define FS_IOC_FSGETXATTR _IOR ('X', 31, struct fsxattr) > +#define FS_IOC_FSSETXATTR _IOW ('X', 32, struct fsxattr) > + > +#endif > + > > #endif /* __XFS_FREEBSD_H__ */ > diff --git a/include/irix.h b/include/irix.h > index 293f869..bdb4b6a 100644 > --- a/include/irix.h > +++ b/include/irix.h > @@ -378,8 +378,6 @@ static __inline__ char * strsep(char **s, const char *ct) > #define __XFS_FS_H__ 1 > > #define XFS_IOC_DIOINFO F_DIOINFO > -#define XFS_IOC_FSGETXATTR F_FSGETXATTR > -#define XFS_IOC_FSSETXATTR F_FSSETXATTR > #define XFS_IOC_ALLOCSP64 F_ALLOCSP64 > #define XFS_IOC_FREESP64 F_FREESP64 > #define XFS_IOC_GETBMAP F_GETBMAP > @@ -422,7 +420,40 @@ static __inline__ char * strsep(char **s, const char *ct) > > #define _AIOCB64_T_DEFINED 1 > > -#define XFS_XFLAG_NODEFRAG 0x00002000 > +/* check whether we have to define FS_IOC_FS[GS]ETXATTR ourselves */ > +#ifndef HAVE_FSXATTR > +struct fsxattr { > + __u32 fsx_xflags; /* xflags field value (get/set) */ > + __u32 fsx_extsize; /* extsize field value (get/set)*/ > + __u32 fsx_nextents; /* nextents field value (get) */ > + __u32 fsx_projid; /* project identifier (get/set) */ > + unsigned char fsx_pad[12]; > +}; > + > +/* > + * Flags for the fsx_xflags field > + */ > +#define FS_XFLAG_REALTIME 0x00000001 /* data in realtime volume */ > +#define FS_XFLAG_PREALLOC 0x00000002 /* preallocated file extents */ > +#define FS_XFLAG_IMMUTABLE 0x00000008 /* file cannot be modified */ > +#define FS_XFLAG_APPEND 0x00000010 /* all writes append */ > +#define FS_XFLAG_SYNC 0x00000020 /* all writes synchronous */ > +#define FS_XFLAG_NOATIME 0x00000040 /* do not update access time */ > +#define FS_XFLAG_NODUMP 0x00000080 /* do not include in backups */ > +#define FS_XFLAG_RTINHERIT 0x00000100 /* create with rt bit set */ > +#define FS_XFLAG_PROJINHERIT 0x00000200 /* create with parents projid */ > +#define FS_XFLAG_NOSYMLINKS 0x00000400 /* disallow symlink creation */ > +#define FS_XFLAG_EXTSIZE 0x00000800 /* extent size allocator hint */ > +#define FS_XFLAG_EXTSZINHERIT 0x00001000 /* inherit inode extent size */ > +#define FS_XFLAG_NODEFRAG 0x00002000 /* do not defragment */ > +#define FS_XFLAG_FILESTREAM 0x00004000 /* use filestream allocator */ > +#define FS_XFLAG_HASATTR 0x80000000 /* no DIFLAG for this */ > + > +#define FS_IOC_FSGETXATTR F_FSGETXATTR > +#define FS_IOC_FSSETXATTR F_FSSETXATTR > + > +#endif > + > > /** > * Abstraction of mountpoints. > diff --git a/include/linux.h b/include/linux.h > index 16fb707..17391c3 100644 > --- a/include/linux.h > +++ b/include/linux.h > @@ -174,4 +174,42 @@ static inline void platform_mntent_close(struct mntent_cursor * cursor) > endmntent(cursor->mtabp); > } > > +/* > + * Check whether we have to define FS_IOC_FS[GS]ETXATTR ourselves. These > + * are a copy of the definitions moved to linux/uapi/fs.h in the 4.5 kernel, > + * so this is purely for supporting builds against old kernel headers. > + */ > +#ifndef FS_IOC_FSGETXATTR > +struct fsxattr { > + __u32 fsx_xflags; /* xflags field value (get/set) */ > + __u32 fsx_extsize; /* extsize field value (get/set)*/ > + __u32 fsx_nextents; /* nextents field value (get) */ > + __u32 fsx_projid; /* project identifier (get/set) */ > + unsigned char fsx_pad[12]; > +}; > + > +/* > + * Flags for the fsx_xflags field > + */ > +#define FS_XFLAG_REALTIME 0x00000001 /* data in realtime volume */ > +#define FS_XFLAG_PREALLOC 0x00000002 /* preallocated file extents */ > +#define FS_XFLAG_IMMUTABLE 0x00000008 /* file cannot be modified */ > +#define FS_XFLAG_APPEND 0x00000010 /* all writes append */ > +#define FS_XFLAG_SYNC 0x00000020 /* all writes synchronous */ > +#define FS_XFLAG_NOATIME 0x00000040 /* do not update access time */ > +#define FS_XFLAG_NODUMP 0x00000080 /* do not include in backups */ > +#define FS_XFLAG_RTINHERIT 0x00000100 /* create with rt bit set */ > +#define FS_XFLAG_PROJINHERIT 0x00000200 /* create with parents projid */ > +#define FS_XFLAG_NOSYMLINKS 0x00000400 /* disallow symlink creation */ > +#define FS_XFLAG_EXTSIZE 0x00000800 /* extent size allocator hint */ > +#define FS_XFLAG_EXTSZINHERIT 0x00001000 /* inherit inode extent size */ > +#define FS_XFLAG_NODEFRAG 0x00002000 /* do not defragment */ > +#define FS_XFLAG_FILESTREAM 0x00004000 /* use filestream allocator */ > +#define FS_XFLAG_HASATTR 0x80000000 /* no DIFLAG for this */ > + > +#define FS_IOC_FSGETXATTR _IOR ('X', 31, struct fsxattr) > +#define FS_IOC_FSSETXATTR _IOW ('X', 32, struct fsxattr) > + > +#endif > + > #endif /* __XFS_LINUX_H__ */ > diff --git a/io/attr.c b/io/attr.c > index 7cbcc3c..6fa08bf 100644 > --- a/io/attr.c > +++ b/io/attr.c > @@ -33,20 +33,20 @@ static struct xflags { > char *shortname; > char *longname; > } xflags[] = { > - { XFS_XFLAG_REALTIME, "r", "realtime" }, > - { XFS_XFLAG_PREALLOC, "p", "prealloc" }, > - { XFS_XFLAG_IMMUTABLE, "i", "immutable" }, > - { XFS_XFLAG_APPEND, "a", "append-only" }, > - { XFS_XFLAG_SYNC, "s", "sync" }, > - { XFS_XFLAG_NOATIME, "A", "no-atime" }, > - { XFS_XFLAG_NODUMP, "d", "no-dump" }, > - { XFS_XFLAG_RTINHERIT, "t", "rt-inherit" }, > - { XFS_XFLAG_PROJINHERIT, "P", "proj-inherit" }, > - { XFS_XFLAG_NOSYMLINKS, "n", "nosymlinks" }, > - { XFS_XFLAG_EXTSIZE, "e", "extsize" }, > - { XFS_XFLAG_EXTSZINHERIT, "E", "extsz-inherit" }, > - { XFS_XFLAG_NODEFRAG, "f", "no-defrag" }, > - { XFS_XFLAG_FILESTREAM, "S", "filestream" }, > + { FS_XFLAG_REALTIME, "r", "realtime" }, > + { FS_XFLAG_PREALLOC, "p", "prealloc" }, > + { FS_XFLAG_IMMUTABLE, "i", "immutable" }, > + { FS_XFLAG_APPEND, "a", "append-only" }, > + { FS_XFLAG_SYNC, "s", "sync" }, > + { FS_XFLAG_NOATIME, "A", "no-atime" }, > + { FS_XFLAG_NODUMP, "d", "no-dump" }, > + { FS_XFLAG_RTINHERIT, "t", "rt-inherit" }, > + { FS_XFLAG_PROJINHERIT, "P", "proj-inherit" }, > + { FS_XFLAG_NOSYMLINKS, "n", "nosymlinks" }, > + { FS_XFLAG_EXTSIZE, "e", "extsize" }, > + { FS_XFLAG_EXTSZINHERIT, "E", "extsz-inherit" }, > + { FS_XFLAG_NODEFRAG, "f", "no-defrag" }, > + { FS_XFLAG_FILESTREAM, "S", "filestream" }, > { 0, NULL, NULL } > }; > #define CHATTR_XFLAG_LIST "r"/*p*/"iasAdtPneEfS" > @@ -169,7 +169,7 @@ lsattr_callback( > if ((fd = open(path, O_RDONLY)) == -1) > fprintf(stderr, _("%s: cannot open %s: %s\n"), > progname, path, strerror(errno)); > - else if ((xfsctl(path, fd, XFS_IOC_FSGETXATTR, &fsx)) < 0) > + else if ((xfsctl(path, fd, FS_IOC_FSGETXATTR, &fsx)) < 0) > fprintf(stderr, _("%s: cannot get flags on %s: %s\n"), > progname, path, strerror(errno)); > else > @@ -216,7 +216,7 @@ lsattr_f( > if (recurse_all || recurse_dir) { > nftw(name, lsattr_callback, > 100, FTW_PHYS | FTW_MOUNT | FTW_DEPTH); > - } else if ((xfsctl(name, file->fd, XFS_IOC_FSGETXATTR, &fsx)) < 0) { > + } else if ((xfsctl(name, file->fd, FS_IOC_FSGETXATTR, &fsx)) < 0) { > fprintf(stderr, _("%s: cannot get flags on %s: %s\n"), > progname, name, strerror(errno)); > } else { > @@ -245,13 +245,13 @@ chattr_callback( > if ((fd = open(path, O_RDONLY)) == -1) { > fprintf(stderr, _("%s: cannot open %s: %s\n"), > progname, path, strerror(errno)); > - } else if (xfsctl(path, fd, XFS_IOC_FSGETXATTR, &attr) < 0) { > + } else if (xfsctl(path, fd, FS_IOC_FSGETXATTR, &attr) < 0) { > fprintf(stderr, _("%s: cannot get flags on %s: %s\n"), > progname, path, strerror(errno)); > } else { > attr.fsx_xflags |= orflags; > attr.fsx_xflags &= ~andflags; > - if (xfsctl(path, fd, XFS_IOC_FSSETXATTR, &attr) < 0) > + if (xfsctl(path, fd, FS_IOC_FSSETXATTR, &attr) < 0) > fprintf(stderr, _("%s: cannot set flags on %s: %s\n"), > progname, path, strerror(errno)); > } > @@ -316,13 +316,13 @@ chattr_f( > if (recurse_all || recurse_dir) { > nftw(name, chattr_callback, > 100, FTW_PHYS | FTW_MOUNT | FTW_DEPTH); > - } else if (xfsctl(name, file->fd, XFS_IOC_FSGETXATTR, &attr) < 0) { > + } else if (xfsctl(name, file->fd, FS_IOC_FSGETXATTR, &attr) < 0) { > fprintf(stderr, _("%s: cannot get flags on %s: %s\n"), > progname, name, strerror(errno)); > } else { > attr.fsx_xflags |= orflags; > attr.fsx_xflags &= ~andflags; > - if (xfsctl(name, file->fd, XFS_IOC_FSSETXATTR, &attr) < 0) > + if (xfsctl(name, file->fd, FS_IOC_FSSETXATTR, &attr) < 0) > fprintf(stderr, _("%s: cannot set flags on %s: %s\n"), > progname, name, strerror(errno)); > } > diff --git a/io/bmap.c b/io/bmap.c > index cbeed3b..04d04c7 100644 > --- a/io/bmap.c > +++ b/io/bmap.c > @@ -125,7 +125,7 @@ bmap_f( > exitcode = 1; > return 0; > } > - c = xfsctl(file->name, file->fd, XFS_IOC_FSGETXATTR, &fsx); > + c = xfsctl(file->name, file->fd, FS_IOC_FSGETXATTR, &fsx); > if (c < 0) { > fprintf(stderr, > _("%s: cannot read attrs on \"%s\": %s\n"), > @@ -134,7 +134,7 @@ bmap_f( > return 0; > } > > - if (fsx.fsx_xflags == XFS_XFLAG_REALTIME) { > + if (fsx.fsx_xflags == FS_XFLAG_REALTIME) { > /* > * ag info not applicable to rt, continue > * without ag output. > @@ -157,7 +157,7 @@ bmap_f( > * by nflag, or the initial guess number of extents (32). > * > * If there are more extents than we guessed, use xfsctl > - * (XFS_IOC_FSGETXATTR[A]) to get the extent count, realloc some more > + * (FS_IOC_FSGETXATTR[A]) to get the extent count, realloc some more > * space based on this count, and try again. > * > * If the initial FGETBMAPX attempt returns EINVAL, this may mean > @@ -165,13 +165,13 @@ bmap_f( > * EINVAL, check the length with fstat() and return "no extents" > * if the length == 0. > * > - * Why not do the xfsctl(XFS_IOC_FSGETXATTR[A]) first? Two reasons: > + * Why not do the xfsctl(FS_IOC_FSGETXATTR[A]) first? Two reasons: > * (1) The extent count may be wrong for a file with delayed > * allocation blocks. The XFS_IOC_GETBMAPX forces the real > * allocation and fixes up the extent count. > * (2) For XFS_IOC_GETBMAP[X] on a DMAPI file that has been moved > * offline by a DMAPI application (e.g., DMF) the > - * XFS_IOC_FSGETXATTR only reflects the extents actually online. > + * FS_IOC_FSGETXATTR only reflects the extents actually online. > * Doing XFS_IOC_GETBMAPX call first forces that data blocks online > * and then everything proceeds normally (see PV #545725). > * > @@ -207,13 +207,13 @@ bmap_f( > break; > if (map->bmv_entries < map->bmv_count-1) > break; > - /* Get number of extents from xfsctl XFS_IOC_FSGETXATTR[A] > + /* Get number of extents from xfsctl FS_IOC_FSGETXATTR[A] > * syscall. > */ > i = xfsctl(file->name, file->fd, aflag ? > - XFS_IOC_FSGETXATTRA : XFS_IOC_FSGETXATTR, &fsx); > + XFS_IOC_FSGETXATTRA : FS_IOC_FSGETXATTR, &fsx); > if (i < 0) { > - fprintf(stderr, "%s: xfsctl(XFS_IOC_FSGETXATTR%s) " > + fprintf(stderr, "%s: xfsctl(FS_IOC_FSGETXATTR%s) " > "[\"%s\"]: %s\n", progname, aflag ? "A" : "", > file->name, strerror(errno)); > free(map); > diff --git a/io/open.c b/io/open.c > index ac5a5e0..037843d 100644 > --- a/io/open.c > +++ b/io/open.c > @@ -115,9 +115,9 @@ stat_f( > } > if (file->flags & IO_FOREIGN) > return 0; > - if ((xfsctl(file->name, file->fd, XFS_IOC_FSGETXATTR, &fsx)) < 0 || > + if ((xfsctl(file->name, file->fd, FS_IOC_FSGETXATTR, &fsx)) < 0 || > (xfsctl(file->name, file->fd, XFS_IOC_FSGETXATTRA, &fsxa)) < 0) { > - perror("XFS_IOC_FSGETXATTR"); > + perror("FS_IOC_FSGETXATTR"); > } else { > printf(_("fsxattr.xflags = 0x%x "), fsx.fsx_xflags); > printxattr(fsx.fsx_xflags, verbose, 0, file->name, 1, 1); > @@ -193,15 +193,15 @@ openfile( > if (!(flags & IO_READONLY) && (flags & IO_REALTIME)) { > struct fsxattr attr; > > - if (xfsctl(path, fd, XFS_IOC_FSGETXATTR, &attr) < 0) { > - perror("XFS_IOC_FSGETXATTR"); > + if (xfsctl(path, fd, FS_IOC_FSGETXATTR, &attr) < 0) { > + perror("FS_IOC_FSGETXATTR"); > close(fd); > return -1; > } > - if (!(attr.fsx_xflags & XFS_XFLAG_REALTIME)) { > - attr.fsx_xflags |= XFS_XFLAG_REALTIME; > - if (xfsctl(path, fd, XFS_IOC_FSSETXATTR, &attr) < 0) { > - perror("XFS_IOC_FSSETXATTR"); > + if (!(attr.fsx_xflags & FS_XFLAG_REALTIME)) { > + attr.fsx_xflags |= FS_XFLAG_REALTIME; > + if (xfsctl(path, fd, FS_IOC_FSSETXATTR, &attr) < 0) { > + perror("FS_IOC_FSSETXATTR"); > close(fd); > return -1; > } > @@ -559,8 +559,8 @@ get_extsize(const char *path, int fd) > { > struct fsxattr fsx; > > - if ((xfsctl(path, fd, XFS_IOC_FSGETXATTR, &fsx)) < 0) { > - printf("%s: XFS_IOC_FSGETXATTR %s: %s\n", > + if ((xfsctl(path, fd, FS_IOC_FSGETXATTR, &fsx)) < 0) { > + printf("%s: FS_IOC_FSGETXATTR %s: %s\n", > progname, path, strerror(errno)); > return 0; > } > @@ -578,24 +578,24 @@ set_extsize(const char *path, int fd, long extsz) > perror("fstat64"); > return 0; > } > - if ((xfsctl(path, fd, XFS_IOC_FSGETXATTR, &fsx)) < 0) { > - printf("%s: XFS_IOC_FSGETXATTR %s: %s\n", > + if ((xfsctl(path, fd, FS_IOC_FSGETXATTR, &fsx)) < 0) { > + printf("%s: FS_IOC_FSGETXATTR %s: %s\n", > progname, path, strerror(errno)); > return 0; > } > > if (S_ISREG(stat.st_mode)) { > - fsx.fsx_xflags |= XFS_XFLAG_EXTSIZE; > + fsx.fsx_xflags |= FS_XFLAG_EXTSIZE; > } else if (S_ISDIR(stat.st_mode)) { > - fsx.fsx_xflags |= XFS_XFLAG_EXTSZINHERIT; > + fsx.fsx_xflags |= FS_XFLAG_EXTSZINHERIT; > } else { > printf(_("invalid target file type - file %s\n"), path); > return 0; > } > fsx.fsx_extsize = extsz; > > - if ((xfsctl(path, fd, XFS_IOC_FSSETXATTR, &fsx)) < 0) { > - printf("%s: XFS_IOC_FSSETXATTR %s: %s\n", > + if ((xfsctl(path, fd, FS_IOC_FSSETXATTR, &fsx)) < 0) { > + printf("%s: FS_IOC_FSSETXATTR %s: %s\n", > progname, path, strerror(errno)); > return 0; > } > diff --git a/libxcmd/projects.c b/libxcmd/projects.c > index 24ef70a..c9e863d 100644 > --- a/libxcmd/projects.c > +++ b/libxcmd/projects.c > @@ -176,8 +176,8 @@ getprojid( > { > struct fsxattr fsx; > > - if (xfsctl(name, fd, XFS_IOC_FSGETXATTR, &fsx)) { > - perror("XFS_IOC_FSGETXATTR"); > + if (xfsctl(name, fd, FS_IOC_FSGETXATTR, &fsx)) { > + perror("FS_IOC_FSGETXATTR"); > return -1; > } > *projid = fsx.fsx_projid; > @@ -193,9 +193,9 @@ setprojid( > struct fsxattr fsx; > int error; > > - if ((error = xfsctl(name, fd, XFS_IOC_FSGETXATTR, &fsx)) == 0) { > + if ((error = xfsctl(name, fd, FS_IOC_FSGETXATTR, &fsx)) == 0) { > fsx.fsx_projid = projid; > - error = xfsctl(name, fd, XFS_IOC_FSSETXATTR, &fsx); > + error = xfsctl(name, fd, FS_IOC_FSSETXATTR, &fsx); > } > return error; > } > diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h > index a35009a..967b1ef 100644 > --- a/libxfs/xfs_format.h > +++ b/libxfs/xfs_format.h > @@ -984,8 +984,6 @@ static inline void xfs_dinode_put_rdev(struct xfs_dinode *dip, xfs_dev_t rdev) > > /* > * Values for di_flags > - * There should be a one-to-one correspondence between these flags and the > - * XFS_XFLAG_s. > */ > #define XFS_DIFLAG_REALTIME_BIT 0 /* file's blocks come from rt area */ > #define XFS_DIFLAG_PREALLOC_BIT 1 /* file space has been preallocated */ > diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h > index d8b733a..b9622ba 100644 > --- a/libxfs/xfs_fs.h > +++ b/libxfs/xfs_fs.h > @@ -36,38 +36,28 @@ struct dioattr { > #endif > > /* > - * Structure for XFS_IOC_FSGETXATTR[A] and XFS_IOC_FSSETXATTR. > + * Flags for the bs_xflags/fsx_xflags field in XFS_IOC_FS[GS]ETXATTR[A] > + * These are for backwards compatibility only. New code should > + * use the kernel [4.5 onwards] defined FS_XFLAG_* definitions directly. > */ > -#ifndef HAVE_FSXATTR > -struct fsxattr { > - __u32 fsx_xflags; /* xflags field value (get/set) */ > - __u32 fsx_extsize; /* extsize field value (get/set)*/ > - __u32 fsx_nextents; /* nextents field value (get) */ > - __u32 fsx_projid; /* project identifier (get/set) */ > - unsigned char fsx_pad[12]; > -}; > -#endif > - > -/* > - * Flags for the bs_xflags/fsx_xflags field > - * There should be a one-to-one correspondence between these flags and the > - * XFS_DIFLAG_s. > - */ > -#define XFS_XFLAG_REALTIME 0x00000001 /* data in realtime volume */ > -#define XFS_XFLAG_PREALLOC 0x00000002 /* preallocated file extents */ > -#define XFS_XFLAG_IMMUTABLE 0x00000008 /* file cannot be modified */ > -#define XFS_XFLAG_APPEND 0x00000010 /* all writes append */ > -#define XFS_XFLAG_SYNC 0x00000020 /* all writes synchronous */ > -#define XFS_XFLAG_NOATIME 0x00000040 /* do not update access time */ > -#define XFS_XFLAG_NODUMP 0x00000080 /* do not include in backups */ > -#define XFS_XFLAG_RTINHERIT 0x00000100 /* create with rt bit set */ > -#define XFS_XFLAG_PROJINHERIT 0x00000200 /* create with parents projid */ > -#define XFS_XFLAG_NOSYMLINKS 0x00000400 /* disallow symlink creation */ > -#define XFS_XFLAG_EXTSIZE 0x00000800 /* extent size allocator hint */ > -#define XFS_XFLAG_EXTSZINHERIT 0x00001000 /* inherit inode extent size */ > -#define XFS_XFLAG_NODEFRAG 0x00002000 /* do not defragment */ > -#define XFS_XFLAG_FILESTREAM 0x00004000 /* use filestream allocator */ > -#define XFS_XFLAG_HASATTR 0x80000000 /* no DIFLAG for this */ > +#define XFS_XFLAG_REALTIME FS_XFLAG_REALTIME > +#define XFS_XFLAG_PREALLOC FS_XFLAG_PREALLOC > +#define XFS_XFLAG_IMMUTABLE FS_XFLAG_IMMUTABLE > +#define XFS_XFLAG_APPEND FS_XFLAG_APPEND > +#define XFS_XFLAG_SYNC FS_XFLAG_SYNC > +#define XFS_XFLAG_NOATIME FS_XFLAG_NOATIME > +#define XFS_XFLAG_NODUMP FS_XFLAG_NODUMP > +#define XFS_XFLAG_RTINHERIT FS_XFLAG_RTINHERIT > +#define XFS_XFLAG_PROJINHERIT FS_XFLAG_PROJINHERIT > +#define XFS_XFLAG_NOSYMLINKS FS_XFLAG_NOSYMLINKS > +#define XFS_XFLAG_EXTSIZE FS_XFLAG_EXTSIZE > +#define XFS_XFLAG_EXTSZINHERIT FS_XFLAG_EXTSZINHERIT > +#define XFS_XFLAG_NODEFRAG FS_XFLAG_NODEFRAG > +#define XFS_XFLAG_FILESTREAM FS_XFLAG_FILESTREAM > +#define XFS_XFLAG_HASATTR FS_XFLAG_HASATTR > + > +#define XFS_IOC_FSGETXATTR FS_IOC_FSGETXATTR > +#define XFS_IOC_FSSETXATTR FS_IOC_FSSETXATTR > > /* > * Structure for XFS_IOC_GETBMAP. > @@ -513,8 +503,6 @@ typedef struct xfs_swapext > #define XFS_IOC_ALLOCSP _IOW ('X', 10, struct xfs_flock64) > #define XFS_IOC_FREESP _IOW ('X', 11, struct xfs_flock64) > #define XFS_IOC_DIOINFO _IOR ('X', 30, struct dioattr) > -#define XFS_IOC_FSGETXATTR _IOR ('X', 31, struct fsxattr) > -#define XFS_IOC_FSSETXATTR _IOW ('X', 32, struct fsxattr) > #define XFS_IOC_ALLOCSP64 _IOW ('X', 36, struct xfs_flock64) > #define XFS_IOC_FREESP64 _IOW ('X', 37, struct xfs_flock64) > #define XFS_IOC_GETBMAP _IOWR('X', 38, struct getbmap) > diff --git a/quota/free.c b/quota/free.c > index dcbe8ce..e9e0319 100644 > --- a/quota/free.c > +++ b/quota/free.c > @@ -143,13 +143,13 @@ projects_free_space_data( > return 0; > } > > - if ((xfsctl(path->fs_dir, fd, XFS_IOC_FSGETXATTR, &fsx)) < 0) { > + if ((xfsctl(path->fs_dir, fd, FS_IOC_FSGETXATTR, &fsx)) < 0) { > exitcode = 1; > - perror("XFS_IOC_FSGETXATTR"); > + perror("FS_IOC_FSGETXATTR"); > close(fd); > return 0; > } > - if (!(fsx.fsx_xflags & XFS_XFLAG_PROJINHERIT)) { > + if (!(fsx.fsx_xflags & FS_XFLAG_PROJINHERIT)) { > exitcode = 1; > fprintf(stderr, _("%s: project quota flag not set on %s\n"), > progname, path->fs_dir); > diff --git a/quota/project.c b/quota/project.c > index 17a83b0..fb8b9e1 100644 > --- a/quota/project.c > +++ b/quota/project.c > @@ -117,7 +117,7 @@ check_project( > exitcode = 1; > fprintf(stderr, _("%s: cannot open %s: %s\n"), > progname, path, strerror(errno)); > - } else if ((xfsctl(path, fd, XFS_IOC_FSGETXATTR, &fsx)) < 0) { > + } else if ((xfsctl(path, fd, FS_IOC_FSGETXATTR, &fsx)) < 0) { > exitcode = 1; > fprintf(stderr, _("%s: cannot get flags on %s: %s\n"), > progname, path, strerror(errno)); > @@ -126,7 +126,7 @@ check_project( > printf(_("%s - project identifier is not set" > " (inode=%u, tree=%u)\n"), > path, fsx.fsx_projid, (unsigned int)prid); > - if (!(fsx.fsx_xflags & XFS_XFLAG_PROJINHERIT)) > + if (!(fsx.fsx_xflags & FS_XFLAG_PROJINHERIT)) > printf(_("%s - project inheritance flag is not set\n"), > path); > } > @@ -163,7 +163,7 @@ clear_project( > fprintf(stderr, _("%s: cannot open %s: %s\n"), > progname, path, strerror(errno)); > return 0; > - } else if (xfsctl(path, fd, XFS_IOC_FSGETXATTR, &fsx) < 0) { > + } else if (xfsctl(path, fd, FS_IOC_FSGETXATTR, &fsx) < 0) { > exitcode = 1; > fprintf(stderr, _("%s: cannot get flags on %s: %s\n"), > progname, path, strerror(errno)); > @@ -172,8 +172,8 @@ clear_project( > } > > fsx.fsx_projid = 0; > - fsx.fsx_xflags &= ~XFS_XFLAG_PROJINHERIT; > - if (xfsctl(path, fd, XFS_IOC_FSSETXATTR, &fsx) < 0) { > + fsx.fsx_xflags &= ~FS_XFLAG_PROJINHERIT; > + if (xfsctl(path, fd, FS_IOC_FSSETXATTR, &fsx) < 0) { > exitcode = 1; > fprintf(stderr, _("%s: cannot clear project on %s: %s\n"), > progname, path, strerror(errno)); > @@ -210,7 +210,7 @@ setup_project( > fprintf(stderr, _("%s: cannot open %s: %s\n"), > progname, path, strerror(errno)); > return 0; > - } else if (xfsctl(path, fd, XFS_IOC_FSGETXATTR, &fsx) < 0) { > + } else if (xfsctl(path, fd, FS_IOC_FSGETXATTR, &fsx) < 0) { > exitcode = 1; > fprintf(stderr, _("%s: cannot get flags on %s: %s\n"), > progname, path, strerror(errno)); > @@ -219,8 +219,8 @@ setup_project( > } > > fsx.fsx_projid = prid; > - fsx.fsx_xflags |= XFS_XFLAG_PROJINHERIT; > - if (xfsctl(path, fd, XFS_IOC_FSSETXATTR, &fsx) < 0) { > + fsx.fsx_xflags |= FS_XFLAG_PROJINHERIT; > + if (xfsctl(path, fd, FS_IOC_FSSETXATTR, &fsx) < 0) { > exitcode = 1; > fprintf(stderr, _("%s: cannot set project on %s: %s\n"), > progname, path, strerror(errno)); > diff --git a/repair/dinode.c b/repair/dinode.c > index df28e9e..cbd4305 100644 > --- a/repair/dinode.c > +++ b/repair/dinode.c > @@ -2423,7 +2423,7 @@ _("bad (negative) size %" PRId64 " on inode %" PRIu64 "\n"), > XFS_DIFLAG_NOSYMLINKS); > } > } > - if (flags & (XFS_DIFLAG_REALTIME | XFS_XFLAG_EXTSIZE)) { > + if (flags & (XFS_DIFLAG_REALTIME | FS_XFLAG_EXTSIZE)) { > /* must be a file */ > if (di_mode && !S_ISREG(di_mode)) { > if (!uncertain) { > @@ -2432,7 +2432,7 @@ _("bad (negative) size %" PRId64 " on inode %" PRIu64 "\n"), > lino); > } > flags &= ~(XFS_DIFLAG_REALTIME | > - XFS_XFLAG_EXTSIZE); > + FS_XFLAG_EXTSIZE); > } > } > if (!verify_mode && flags != be16_to_cpu(dino->di_flags)) { > diff --git a/rtcp/xfs_rtcp.c b/rtcp/xfs_rtcp.c > index f604b46..3044350 100644 > --- a/rtcp/xfs_rtcp.c > +++ b/rtcp/xfs_rtcp.c > @@ -186,13 +186,13 @@ rtcp( char *source, char *target, int fextsize) > /* > * mark the file as a realtime file > */ > - fsxattr.fsx_xflags = XFS_XFLAG_REALTIME; > + fsxattr.fsx_xflags = FS_XFLAG_REALTIME; > if (fextsize != -1 ) > fsxattr.fsx_extsize = fextsize; > else > fsxattr.fsx_extsize = 0; > > - if ( xfsctl(tbuf, tofd, XFS_IOC_FSSETXATTR, &fsxattr) ) { > + if ( xfsctl(tbuf, tofd, FS_IOC_FSSETXATTR, &fsxattr) ) { > fprintf(stderr, > _("%s: set attributes on %s failed: %s\n"), > progname, tbuf, strerror(errno)); > @@ -210,7 +210,7 @@ rtcp( char *source, char *target, int fextsize) > return( -1 ); > } > > - if ( xfsctl(tbuf, tofd, XFS_IOC_FSGETXATTR, &fsxattr) ) { > + if ( xfsctl(tbuf, tofd, FS_IOC_FSGETXATTR, &fsxattr) ) { > fprintf(stderr, > _("%s: get attributes of %s failed: %s\n"), > progname, tbuf, strerror(errno)); > @@ -221,7 +221,7 @@ rtcp( char *source, char *target, int fextsize) > /* > * check if the existing file is already a realtime file > */ > - if ( !(fsxattr.fsx_xflags & XFS_XFLAG_REALTIME) ) { > + if ( !(fsxattr.fsx_xflags & FS_XFLAG_REALTIME) ) { > fprintf(stderr, _("%s: %s is not a realtime file.\n"), > progname, tbuf); > close( tofd ); > @@ -255,10 +255,10 @@ rtcp( char *source, char *target, int fextsize) > > fsxattr.fsx_xflags = 0; > fsxattr.fsx_extsize = 0; > - if ( xfsctl(source, fromfd, XFS_IOC_FSGETXATTR, &fsxattr) ) { > + if ( xfsctl(source, fromfd, FS_IOC_FSGETXATTR, &fsxattr) ) { > reopen = 1; > } else { > - if (! (fsxattr.fsx_xflags & XFS_XFLAG_REALTIME) ){ > + if (! (fsxattr.fsx_xflags & FS_XFLAG_REALTIME) ){ > fprintf(stderr, _("%s: %s is not a realtime file.\n"), > progname, source); > reopen = 1; > _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs