aboutsummaryrefslogtreecommitdiffstats
path: root/spaceman
diff options
context:
space:
mode:
authorDarrick J. Wong <darrick.wong@oracle.com>2019-09-09 15:37:07 -0400
committerEric Sandeen <sandeen@redhat.com>2019-09-09 15:37:07 -0400
commita509ad57e94f3dc45c630074c642e28cc445f700 (patch)
tree80de5999f3dbf7b1c948098e5fb11ab7dd3ec087 /spaceman
parent8990666efce422c2dbe89765ec0730e179a3c3c3 (diff)
downloadxfsprogs-dev-a509ad57e94f3dc45c630074c642e28cc445f700.tar.gz
xfs_spaceman: embed struct xfs_fd in struct fileio
Replace the open-coded fd and geometry fields of struct fileio with a single xfs_fd, which will enable us to use it natively throughout xfs_spaceman in upcoming patches. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
Diffstat (limited to 'spaceman')
-rw-r--r--spaceman/file.c31
-rw-r--r--spaceman/freesp.c30
-rw-r--r--spaceman/info.c19
-rw-r--r--spaceman/init.c11
-rw-r--r--spaceman/prealloc.c15
-rw-r--r--spaceman/space.h9
-rw-r--r--spaceman/trim.c40
7 files changed, 72 insertions, 83 deletions
diff --git a/spaceman/file.c b/spaceman/file.c
index 29b7d9ce58..43b87e14af 100644
--- a/spaceman/file.c
+++ b/spaceman/file.c
@@ -11,8 +11,8 @@
#include "input.h"
#include "init.h"
#include "libfrog/paths.h"
-#include "space.h"
#include "libfrog/fsgeom.h"
+#include "space.h"
static cmdinfo_t print_cmd;
@@ -45,19 +45,13 @@ print_f(
int
openfile(
char *path,
- struct xfs_fsop_geom *geom,
+ struct xfs_fd *xfd,
struct fs_path *fs_path)
{
struct fs_path *fsp;
- int fd, ret;
-
- fd = open(path, 0);
- if (fd < 0) {
- perror(path);
- return -1;
- }
+ int ret;
- ret = xfrog_geometry(fd, geom);
+ ret = xfd_open(xfd, path, O_RDONLY);
if (ret) {
if (ret == ENOTTY)
fprintf(stderr,
@@ -65,9 +59,8 @@ _("%s: Not on a mounted XFS filesystem.\n"),
path);
else {
errno = ret;
- perror("XFS_IOC_FSGEOMETRY");
+ perror(path);
}
- close(fd);
return -1;
}
@@ -75,19 +68,18 @@ _("%s: Not on a mounted XFS filesystem.\n"),
if (!fsp) {
fprintf(stderr, _("%s: cannot find mount point."),
path);
- close(fd);
+ xfd_close(xfd);
return -1;
}
memcpy(fs_path, fsp, sizeof(struct fs_path));
- return fd;
+ return xfd->fd;
}
int
addfile(
char *name,
- int fd,
- struct xfs_fsop_geom *geometry,
+ struct xfs_fd *xfd,
struct fs_path *fs_path)
{
char *filename;
@@ -95,7 +87,7 @@ addfile(
filename = strdup(name);
if (!filename) {
perror("strdup");
- close(fd);
+ xfd_close(xfd);
return -1;
}
@@ -106,15 +98,14 @@ addfile(
perror("realloc");
filecount = 0;
free(filename);
- close(fd);
+ xfd_close(xfd);
return -1;
}
/* Finally, make this the new active open file */
file = &filetable[filecount - 1];
- file->fd = fd;
file->name = filename;
- file->geom = *geometry;
+ memcpy(&file->xfd, xfd, sizeof(struct xfs_fd));
memcpy(&file->fs_path, fs_path, sizeof(file->fs_path));
return 0;
}
diff --git a/spaceman/freesp.c b/spaceman/freesp.c
index 527ecb5209..f30171f03f 100644
--- a/spaceman/freesp.c
+++ b/spaceman/freesp.c
@@ -8,6 +8,7 @@
#include "libxfs.h"
#include <linux/fiemap.h>
+#include "libfrog/fsgeom.h"
#include "command.h"
#include "init.h"
#include "libfrog/paths.h"
@@ -149,7 +150,8 @@ scan_ag(
struct fsmap *extent;
struct fsmap *l, *h;
struct fsmap *p;
- off64_t blocksize = file->geom.blocksize;
+ struct xfs_fsop_geom *fsgeom = &file->xfd.fsgeom;
+ off64_t blocksize = fsgeom->blocksize;
off64_t bperag;
off64_t aglen;
xfs_agblock_t agbno;
@@ -158,7 +160,7 @@ scan_ag(
int ret;
int i;
- bperag = (off64_t)file->geom.agblocks * blocksize;
+ bperag = (off64_t)fsgeom->agblocks * blocksize;
fsmap = malloc(fsmap_sizeof(NR_EXTENTS));
if (!fsmap) {
@@ -185,7 +187,7 @@ scan_ag(
h->fmr_offset = ULLONG_MAX;
while (true) {
- ret = ioctl(file->fd, FS_IOC_GETFSMAP, fsmap);
+ ret = ioctl(file->xfd.fd, FS_IOC_GETFSMAP, fsmap);
if (ret < 0) {
fprintf(stderr, _("%s: FS_IOC_GETFSMAP [\"%s\"]: %s\n"),
progname, file->name, strerror(errno));
@@ -248,12 +250,13 @@ aglistadd(
static int
init(
- int argc,
- char **argv)
+ int argc,
+ char **argv)
{
- long long x;
- int c;
- int speced = 0; /* only one of -b -e -h or -m */
+ struct xfs_fsop_geom *fsgeom = &file->xfd.fsgeom;
+ long long x;
+ int c;
+ int speced = 0; /* only one of -b -e -h or -m */
agcount = dumpflag = equalsize = multsize = optind = gflag = 0;
histcount = seen1 = summaryflag = 0;
@@ -321,7 +324,7 @@ init(
return 0;
if (!speced)
multsize = 2;
- histinit(file->geom.agblocks);
+ histinit(fsgeom->agblocks);
return 1;
many_spec:
return command_usage(&freesp_cmd);
@@ -332,10 +335,11 @@ many_spec:
*/
static int
freesp_f(
- int argc,
- char **argv)
+ int argc,
+ char **argv)
{
- xfs_agnumber_t agno;
+ struct xfs_fsop_geom *fsgeom = &file->xfd.fsgeom;
+ xfs_agnumber_t agno;
if (!init(argc, argv))
return 0;
@@ -343,7 +347,7 @@ freesp_f(
printf(_(" AG extents blocks\n"));
if (rtflag)
scan_ag(NULLAGNUMBER);
- for (agno = 0; !rtflag && agno < file->geom.agcount; agno++) {
+ for (agno = 0; !rtflag && agno < fsgeom->agcount; agno++) {
if (inaglist(agno))
scan_ag(agno);
}
diff --git a/spaceman/info.c b/spaceman/info.c
index f563cf1edd..f6234c4c67 100644
--- a/spaceman/info.c
+++ b/spaceman/info.c
@@ -7,8 +7,8 @@
#include "command.h"
#include "init.h"
#include "libfrog/paths.h"
-#include "space.h"
#include "libfrog/fsgeom.h"
+#include "space.h"
static void
info_help(void)
@@ -28,26 +28,13 @@ info_f(
int argc,
char **argv)
{
- struct xfs_fsop_geom geo;
- int error;
-
if (fs_table_lookup_mount(file->name) == NULL) {
fprintf(stderr, _("%s: Not a XFS mount point.\n"), file->name);
return 1;
}
- /* get the current filesystem size & geometry */
- error = xfrog_geometry(file->fd, &geo);
- if (error) {
- fprintf(stderr,
- _("%s: cannot determine geometry of filesystem mounted at %s: %s\n"),
- progname, file->name, strerror(error));
- exitcode = 1;
- return 0;
- }
-
- xfs_report_geom(&geo, file->fs_path.fs_name, file->fs_path.fs_log,
- file->fs_path.fs_rt);
+ xfs_report_geom(&file->xfd.fsgeom, file->fs_path.fs_name,
+ file->fs_path.fs_log, file->fs_path.fs_rt);
return 0;
}
diff --git a/spaceman/init.c b/spaceman/init.c
index fa0397abf1..4afdb3866c 100644
--- a/spaceman/init.c
+++ b/spaceman/init.c
@@ -5,6 +5,7 @@
*/
#include "libxfs.h"
+#include "libfrog/fsgeom.h"
#include "command.h"
#include "input.h"
#include "init.h"
@@ -60,7 +61,7 @@ init(
char **argv)
{
int c;
- struct xfs_fsop_geom geometry = { 0 };
+ struct xfs_fd xfd = XFS_FD_INIT_EMPTY;
struct fs_path fsp;
progname = basename(argv[0]);
@@ -88,11 +89,13 @@ init(
if (optind != argc - 1)
usage();
- if ((c = openfile(argv[optind], &geometry, &fsp)) < 0)
+ c = openfile(argv[optind], &xfd, &fsp);
+ if (c < 0)
exit(1);
- if (!platform_test_xfs_fd(c))
+ if (!platform_test_xfs_fd(xfd.fd))
printf(_("Not an XFS filesystem!\n"));
- if (addfile(argv[optind], c, &geometry, &fsp) < 0)
+ c = addfile(argv[optind], &xfd, &fsp);
+ if (c < 0)
exit(1);
init_commands();
diff --git a/spaceman/prealloc.c b/spaceman/prealloc.c
index b223010c65..e5d857bdd3 100644
--- a/spaceman/prealloc.c
+++ b/spaceman/prealloc.c
@@ -5,6 +5,7 @@
*/
#include "libxfs.h"
+#include "libfrog/fsgeom.h"
#include "command.h"
#include "input.h"
#include "init.h"
@@ -18,11 +19,12 @@ static cmdinfo_t prealloc_cmd;
*/
static int
prealloc_f(
- int argc,
- char **argv)
+ int argc,
+ char **argv)
{
struct xfs_fs_eofblocks eofb = {0};
- int c;
+ struct xfs_fsop_geom *fsgeom = &file->xfd.fsgeom;
+ int c;
eofb.eof_version = XFS_EOFBLOCKS_VERSION;
@@ -51,9 +53,8 @@ prealloc_f(
break;
case 'm':
eofb.eof_flags |= XFS_EOF_FLAGS_MINFILESIZE;
- eofb.eof_min_file_size = cvtnum(file->geom.blocksize,
- file->geom.sectsize,
- optarg);
+ eofb.eof_min_file_size = cvtnum(fsgeom->blocksize,
+ fsgeom->sectsize, optarg);
break;
case '?':
default:
@@ -63,7 +64,7 @@ prealloc_f(
if (optind != argc)
return command_usage(&prealloc_cmd);
- if (ioctl(file->fd, XFS_IOC_FREE_EOFBLOCKS, &eofb) < 0) {
+ if (ioctl(file->xfd.fd, XFS_IOC_FREE_EOFBLOCKS, &eofb) < 0) {
fprintf(stderr, _("%s: XFS_IOC_FREE_EOFBLOCKS on %s: %s\n"),
progname, file->name, strerror(errno));
}
diff --git a/spaceman/space.h b/spaceman/space.h
index 8b224acabf..2c26884a02 100644
--- a/spaceman/space.h
+++ b/spaceman/space.h
@@ -7,18 +7,19 @@
#define XFS_SPACEMAN_SPACE_H_
struct fileio {
- struct xfs_fsop_geom geom; /* XFS filesystem geometry */
+ struct xfs_fd xfd; /* XFS runtime support context */
struct fs_path fs_path; /* XFS path information */
char *name; /* file name at time of open */
- int fd; /* open file descriptor */
};
extern struct fileio *filetable; /* open file table */
extern int filecount; /* number of open files */
extern struct fileio *file; /* active file in file table */
-extern int openfile(char *, struct xfs_fsop_geom *, struct fs_path *);
-extern int addfile(char *, int , struct xfs_fsop_geom *, struct fs_path *);
+extern int openfile(char *path, struct xfs_fd *xfd,
+ struct fs_path *fs_path);
+extern int addfile(char *path, struct xfs_fd *xfd,
+ struct fs_path *fs_path);
extern void print_init(void);
extern void help_init(void);
diff --git a/spaceman/trim.c b/spaceman/trim.c
index b23e2bf9a4..daf4e4273e 100644
--- a/spaceman/trim.c
+++ b/spaceman/trim.c
@@ -5,6 +5,7 @@
*/
#include "libxfs.h"
+#include "libfrog/fsgeom.h"
#include "command.h"
#include "init.h"
#include "libfrog/paths.h"
@@ -18,18 +19,19 @@ static cmdinfo_t trim_cmd;
*/
static int
trim_f(
- int argc,
- char **argv)
+ int argc,
+ char **argv)
{
- struct fstrim_range trim = {0};
- xfs_agnumber_t agno = 0;
- off64_t offset = 0;
- ssize_t length = 0;
- ssize_t minlen = 0;
- int aflag = 0;
- int fflag = 0;
- int ret;
- int c;
+ struct fstrim_range trim = {0};
+ struct xfs_fsop_geom *fsgeom = &file->xfd.fsgeom;
+ xfs_agnumber_t agno = 0;
+ off64_t offset = 0;
+ ssize_t length = 0;
+ ssize_t minlen = 0;
+ int aflag = 0;
+ int fflag = 0;
+ int ret;
+ int c;
while ((c = getopt(argc, argv, "a:fm:")) != EOF) {
switch (c) {
@@ -45,8 +47,8 @@ trim_f(
fflag = 1;
break;
case 'm':
- minlen = cvtnum(file->geom.blocksize,
- file->geom.sectsize, optarg);
+ minlen = cvtnum(fsgeom->blocksize, fsgeom->sectsize,
+ optarg);
break;
default:
return command_usage(&trim_cmd);
@@ -59,23 +61,23 @@ trim_f(
if (optind != argc - 2 && !(aflag || fflag))
return command_usage(&trim_cmd);
if (optind != argc) {
- offset = cvtnum(file->geom.blocksize, file->geom.sectsize,
+ offset = cvtnum(fsgeom->blocksize, fsgeom->sectsize,
argv[optind]);
- length = cvtnum(file->geom.blocksize, file->geom.sectsize,
+ length = cvtnum(fsgeom->blocksize, fsgeom->sectsize,
argv[optind + 1]);
} else if (agno) {
- offset = (off64_t)agno * file->geom.agblocks * file->geom.blocksize;
- length = file->geom.agblocks * file->geom.blocksize;
+ offset = (off64_t)agno * fsgeom->agblocks * fsgeom->blocksize;
+ length = fsgeom->agblocks * fsgeom->blocksize;
} else {
offset = 0;
- length = file->geom.datablocks * file->geom.blocksize;
+ length = fsgeom->datablocks * fsgeom->blocksize;
}
trim.start = offset;
trim.len = length;
trim.minlen = minlen;
- ret = ioctl(file->fd, FITRIM, (unsigned long)&trim);
+ ret = ioctl(file->xfd.fd, FITRIM, (unsigned long)&trim);
if (ret < 0) {
fprintf(stderr, "%s: ioctl(FITRIM) [\"%s\"]: %s\n",
progname, file->name, strerror(errno));