ports/sysutils/xfsprogs/files/patch-fsr_xfs__fsr.c
Alexey Dokuchaev f9c458ae7c - Update to version 3.2.4, the latest in 3.x branch. Versions 4.x are
available, but they do not configure (this might be a red herring,
  pending further investigation):
    ...
    checking for blkid_probe_get_topology... no

    FATAL ERROR: could not find a valid BLKID header.
    Install the Block device ID development package.

- Because DISTNAME is sane now, setting of EXTRACT_SUFX and WRKSRC are
  no longer needed and were dropped
- DESTDIR is now respected by `install-sh' script, which allows to drop
  patching of individual makefiles and `include/buildmacros' file
- All programs are installed under ${LOCALBASE}/sbin now
- This version requires a number of patches to build on FreeBSD, most
  importantly:

    * Use getmntinfo() and extattr_set_fd() APIs instead of Linuxish
      getmntent() and fsetxattr()
    * Rename LIST_HEAD -> XFS_LIST_HEAD macro to avoid clash with our
      own one provided by queue(3)
    * Disable missing mremap(2) system call support in `io/mmap.c'
    * Replace `dirent->d_off' with more portable call to telldir()
    * Add missing `#include <inttypes.h>' in several files, etc.

TIMESTAMP (xfsprogs-3.2.4.tar.gz) = 1438219249
2017-05-12 19:08:17 +00:00

266 lines
6.7 KiB
C

--- fsr/xfs_fsr.c.orig 2015-07-24 04:28:04 UTC
+++ fsr/xfs_fsr.c
@@ -26,15 +26,13 @@
#include <fcntl.h>
#include <errno.h>
-#include <malloc.h>
-#include <mntent.h>
+#include <sys/mount.h>
#include <syslog.h>
#include <signal.h>
#include <sys/ioctl.h>
#include <sys/wait.h>
-#include <sys/vfs.h>
#include <sys/statvfs.h>
-#include <sys/xattr.h>
+#include <sys/extattr.h>
#ifndef XFS_XFLAG_NODEFRAG
@@ -184,10 +182,13 @@ aborter(int unused)
static char *
find_mountpoint(char *mtab, char *argname, struct stat64 *sb)
{
- struct mntent *t;
+ struct statfs *t;
struct stat64 ms;
- FILE *mtabp;
char *mntp = NULL;
+ int nt;
+
+#ifdef __linux__
+ FILE *mtabp;
mtabp = setmntent(mtab, "r");
if (!mtabp) {
@@ -195,40 +196,43 @@ find_mountpoint(char *mtab, char *argnam
progname, mtab);
exit(1);
}
+#endif
- while ((t = getmntent(mtabp))) {
+ for (nt = getmntinfo(&t, MNT_NOWAIT); nt--; t++) {
if (S_ISDIR(sb->st_mode)) { /* mount point */
- if (stat64(t->mnt_dir, &ms) < 0)
+ if (stat64(t->f_mntonname, &ms) < 0)
continue;
if (sb->st_ino != ms.st_ino)
continue;
if (sb->st_dev != ms.st_dev)
continue;
- if (strcmp(t->mnt_type, MNTTYPE_XFS) != 0)
+ if (strcmp(t->f_fstypename, MNTTYPE_XFS) != 0)
continue;
} else { /* device */
struct stat64 sb2;
- if (stat64(t->mnt_fsname, &ms) < 0)
+ if (stat64(t->f_mntfromname, &ms) < 0)
continue;
if (sb->st_rdev != ms.st_rdev)
continue;
- if (strcmp(t->mnt_type, MNTTYPE_XFS) != 0)
+ if (strcmp(t->f_fstypename, MNTTYPE_XFS) != 0)
continue;
/*
* Make sure the mountpoint given by mtab is accessible
* before using it.
*/
- if (stat64(t->mnt_dir, &sb2) < 0)
+ if (stat64(t->f_mntonname, &sb2) < 0)
continue;
}
- mntp = t->mnt_dir;
+ mntp = t->f_mntonname;
break;
}
+#ifdef __linux__
endmntent(mtabp);
+#endif
return mntp;
}
@@ -304,6 +308,7 @@ main(int argc, char **argv)
}
}
+#ifdef __linux__
/*
* If the user did not specify an explicit mount table, try to use
* /proc/mounts if it is available, else /etc/mtab. We prefer
@@ -317,6 +322,7 @@ main(int argc, char **argv)
else
mtab = _PATH_MOUNTED;
}
+#endif
if (vflag)
setbuf(stdout, NULL);
@@ -392,7 +398,7 @@ usage(int ret)
" -t time How long to run in seconds.\n"
" -p passes Number of passes before terminating global re-org.\n"
" -f leftoff Use this instead of %s.\n"
-" -m mtab Use something other than /etc/mtab.\n"
+" -m mtab Use this instead of /etc/mtab (ignored on FreeBSD).\n"
" -d Debug, print even more.\n"
" -v Verbose, more -v's more verbose.\n"
" -V Print version number and exit.\n"
@@ -406,17 +412,20 @@ usage(int ret)
static void
initallfs(char *mtab)
{
- FILE *fp;
- struct mntent *mp;
- int mi;
+ struct statfs *mp;
+ int mi, nmp;
char *cp;
struct stat64 sb;
+#ifdef __linux__
+ FILE *fp;
+
fp = setmntent(mtab, "r");
if (fp == NULL) {
fsrprintf(_("could not open mtab file: %s\n"), mtab);
exit(1);
}
+#endif
/* malloc a number of descriptors, increased later if needed */
if (!(fsbase = (fsdesc_t *)malloc(fsbufsize * sizeof(fsdesc_t)))) {
@@ -428,23 +437,19 @@ initallfs(char *mtab)
/* find all rw xfs file systems */
mi = 0;
fs = fsbase;
- while ((mp = getmntent(fp))) {
+ for (nmp = getmntinfo(&mp, MNT_NOWAIT); nmp--; mp++) {
int rw = 0;
- if (strcmp(mp->mnt_type, MNTTYPE_XFS ) != 0 ||
- stat64(mp->mnt_fsname, &sb) == -1 ||
+ if (strcmp(mp->f_fstypename, MNTTYPE_XFS ) != 0 ||
+ stat64(mp->f_mntfromname, &sb) == -1 ||
!S_ISBLK(sb.st_mode))
continue;
- cp = strtok(mp->mnt_opts,",");
- do {
- if (strcmp("rw", cp) == 0)
- rw++;
- } while ((cp = strtok(NULL, ",")) != NULL);
+ rw = !(mp->f_flags & MNT_RDONLY);
if (rw == 0) {
if (dflag)
fsrprintf(_("Skipping %s: not mounted rw\n"),
- mp->mnt_fsname);
+ mp->f_mntfromname);
continue;
}
@@ -464,15 +469,15 @@ initallfs(char *mtab)
fs = (fsbase + mi); /* Needed ? */
}
- fs->dev = strdup(mp->mnt_fsname);
- fs->mnt = strdup(mp->mnt_dir);
+ fs->dev = strdup(mp->f_mntfromname);
+ fs->mnt = strdup(mp->f_mntonname);
if (fs->dev == NULL) {
- fsrprintf(_("strdup(%s) failed\n"), mp->mnt_fsname);
+ fsrprintf(_("strdup(%s) failed\n"), mp->f_mntfromname);
exit(1);
}
if (fs->mnt == NULL) {
- fsrprintf(_("strdup(%s) failed\n"), mp->mnt_dir);
+ fsrprintf(_("strdup(%s) failed\n"), mp->f_mntonname);
exit(1);
}
mi++;
@@ -480,7 +485,9 @@ initallfs(char *mtab)
}
numfs = mi;
fsend = (fsbase + numfs);
+#ifdef __linux__
endmntent(fp);
+#endif
if (numfs == 0) {
fsrprintf(_("no rw xfs file systems in mtab: %s\n"), mtab);
exit(0);
@@ -1027,7 +1034,7 @@ fsr_setup_attr_fork(
xfs_bstat_t *bstatp)
{
struct stat64 tstatbuf;
- int i;
+ int i, ns;
int diff = 0;
int last_forkoff = 0;
int no_change_cnt = 0;
@@ -1036,6 +1043,9 @@ fsr_setup_attr_fork(
if (!(bstatp->bs_xflags & XFS_XFLAG_HASATTR))
return 0;
+ if (extattr_string_to_namespace("user", &ns) == -1)
+ return -1;
+
/*
* use the old method if we have attr1 or the kernel does not yet
* support passing the fork offset in the bulkstat data.
@@ -1043,8 +1053,8 @@ fsr_setup_attr_fork(
if (!(fsgeom.flags & XFS_FSOP_GEOM_FLAGS_ATTR2) ||
bstatp->bs_forkoff == 0) {
/* attr1 */
- ret = fsetxattr(tfd, "user.X", "X", 1, XATTR_CREATE);
- if (ret) {
+ ret = extattr_set_fd(tfd, ns, "X", "X", 1);
+ if (ret == -1) {
fsrprintf(_("could not set ATTR\n"));
return -1;
}
@@ -1085,7 +1095,7 @@ fsr_setup_attr_fork(
if (!diff)
goto out;
- snprintf(name, sizeof(name), "user.%d", i);
+ snprintf(name, sizeof(name), "%d", i);
/*
* If there is no attribute, then we need to create one to get
@@ -1093,8 +1103,8 @@ fsr_setup_attr_fork(
*/
if (!tbstat.bs_forkoff) {
ASSERT(i == 0);
- ret = fsetxattr(tfd, name, "XX", 2, XATTR_CREATE);
- if (ret) {
+ ret = extattr_set_fd(tfd, ns, name, "XX", 2);
+ if (ret == -1) {
fsrprintf(_("could not set ATTR\n"));
return -1;
}
@@ -1141,7 +1151,8 @@ fsr_setup_attr_fork(
if (diff < 0 && fsx.fsx_nextents > 0) {
char val[2048];
memset(val, 'X', 2048);
- if (fsetxattr(tfd, name, val, 2048, 0)) {
+ if (extattr_set_fd(tfd, ns, name, val, 2048)
+ == -1) {
fsrprintf(_("big ATTR set failed\n"));
return -1;
}
@@ -1185,8 +1196,8 @@ fsr_setup_attr_fork(
}
/* we need to grow the attr fork, so create another attr */
- ret = fsetxattr(tfd, name, "XX", 2, XATTR_CREATE);
- if (ret) {
+ ret = extattr_set_fd(tfd, ns, name, "XX", 2);
+ if (ret == -1) {
fsrprintf(_("could not set ATTR\n"));
return -1;
}