Most of the content of libxfs_init is members duplicated for each of the data, log and RT devices. Split those members into a separate libxfs_dev structure. Signed-off-by: Christoph Hellwig <hch@xxxxxx> --- copy/xfs_copy.c | 4 +- db/info.c | 2 +- db/init.c | 12 +-- db/output.c | 2 +- db/sb.c | 8 +- growfs/xfs_growfs.c | 20 ++--- include/libxfs.h | 45 ++++------ libxfs/init.c | 210 +++++++++++++++++++++----------------------- libxfs/topology.c | 16 ++-- logprint/logprint.c | 40 ++++----- mkfs/xfs_mkfs.c | 158 ++++++++++++++++----------------- repair/init.c | 12 +-- repair/phase2.c | 4 +- repair/sb.c | 16 ++-- repair/xfs_repair.c | 8 +- 15 files changed, 265 insertions(+), 292 deletions(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index bd7c6d334..6e692e4f7 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -716,8 +716,8 @@ main(int argc, char **argv) memset(&xargs, 0, sizeof(xargs)); xargs.flags = LIBXFS_ISREADONLY | LIBXFS_DIRECT; - xargs.dname = source_name; - xargs.disfile = source_is_file; + xargs.data.name = source_name; + xargs.data.isfile = source_is_file; if (!libxfs_init(&xargs)) { do_log(_("%s: couldn't initialize XFS library\n" diff --git a/db/info.c b/db/info.c index b30ada3aa..9c6203f02 100644 --- a/db/info.c +++ b/db/info.c @@ -30,7 +30,7 @@ info_f( struct xfs_fsop_geom geo; libxfs_fs_geometry(mp, &geo, XFS_FS_GEOM_MAX_STRUCT_VER); - xfs_report_geom(&geo, x.dname, x.logname, x.rtname); + xfs_report_geom(&geo, x.data.name, x.log.name, x.rt.name); return 0; } diff --git a/db/init.c b/db/init.c index f240d0f66..cea25ae52 100644 --- a/db/init.c +++ b/db/init.c @@ -61,7 +61,7 @@ init( cmdline[ncmdline++] = optarg; break; case 'f': - x.disfile = 1; + x.data.isfile = 1; break; case 'F': force = 1; @@ -76,7 +76,7 @@ init( x.flags = LIBXFS_ISREADONLY; break; case 'l': - x.logname = optarg; + x.log.name = optarg; break; case 'x': expert_mode = 1; @@ -91,7 +91,7 @@ init( if (optind + 1 != argc) usage(); - x.dname = argv[optind]; + x.data.name = argv[optind]; x.flags |= LIBXFS_DIRECT; x.bcache_flags = CACHE_MISCOMPARE_PURGE; @@ -111,7 +111,7 @@ init( 1 << (XFS_MAX_SECTORSIZE_LOG - BBSHIFT), 0, &bp, NULL); if (error) { fprintf(stderr, _("%s: %s is invalid (cannot read first 512 " - "bytes)\n"), progname, x.dname); + "bytes)\n"), progname, x.data.name); exit(1); } @@ -122,7 +122,7 @@ init( sbp = &xmount.m_sb; if (sbp->sb_magicnum != XFS_SB_MAGIC) { fprintf(stderr, _("%s: %s is not a valid XFS filesystem (unexpected SB magic number 0x%08x)\n"), - progname, x.dname, sbp->sb_magicnum); + progname, x.data.name, sbp->sb_magicnum); if (!force) { fprintf(stderr, _("Use -F to force a read attempt.\n")); exit(EXIT_FAILURE); @@ -134,7 +134,7 @@ init( if (!mp) { fprintf(stderr, _("%s: device %s unusable (not an XFS filesystem?)\n"), - progname, x.dname); + progname, x.data.name); exit(1); } mp->m_log = &xlog; diff --git a/db/output.c b/db/output.c index 30ae82ced..d12266c42 100644 --- a/db/output.c +++ b/db/output.c @@ -34,7 +34,7 @@ dbprintf(const char *fmt, ...) blockint(); i = 0; if (dbprefix) - i += printf("%s: ", x.dname); + i += printf("%s: ", x.data.name); i += vprintf(fmt, ap); unblockint(); va_end(ap); diff --git a/db/sb.c b/db/sb.c index b2aa4a626..b48767f47 100644 --- a/db/sb.c +++ b/db/sb.c @@ -220,13 +220,13 @@ sb_logcheck(void) int dirty; if (mp->m_sb.sb_logstart) { - if (x.logdev && x.logdev != x.ddev) { + if (x.log.dev && x.log.dev != x.data.dev) { dbprintf(_("aborting - external log specified for FS " "with an internal log\n")); return 0; } } else { - if (!x.logdev || (x.logdev == x.ddev)) { + if (!x.log.dev || (x.log.dev == x.data.dev)) { dbprintf(_("aborting - no external log specified for FS " "with an external log\n")); return 0; @@ -452,10 +452,10 @@ uuid_f( } } if (mp->m_sb.sb_logstart) { - if (x.logdev && x.logdev != x.ddev) + if (x.log.dev && x.log.dev != x.data.dev) dbprintf(_("warning - external log specified " "for FS with an internal log\n")); - } else if (!x.logdev || (x.logdev == x.ddev)) { + } else if (!x.log.dev || (x.log.dev == x.data.dev)) { dbprintf(_("warning - no external log specified " "for FS with an external log\n")); } diff --git a/growfs/xfs_growfs.c b/growfs/xfs_growfs.c index 05aea3496..4b941403e 100644 --- a/growfs/xfs_growfs.c +++ b/growfs/xfs_growfs.c @@ -183,26 +183,26 @@ main(int argc, char **argv) */ memset(&xi, 0, sizeof(xi)); - xi.dname = datadev; - xi.logname = logdev; - xi.rtname = rtdev; + xi.data.name = datadev; + xi.log.name = logdev; + xi.rt.name = rtdev; xi.flags = LIBXFS_ISREADONLY; if (!libxfs_init(&xi)) usage(); /* check we got the info for all the sections we are trying to modify */ - if (!xi.ddev) { + if (!xi.data.dev) { fprintf(stderr, _("%s: failed to access data device for %s\n"), progname, fname); exit(1); } - if (lflag && !isint && !xi.logdev) { + if (lflag && !isint && !xi.log.dev) { fprintf(stderr, _("%s: failed to access external log for %s\n"), progname, fname); exit(1); } - if (rflag && !xi.rtdev) { + if (rflag && !xi.rt.dev) { fprintf(stderr, _("%s: failed to access realtime device for %s\n"), progname, fname); @@ -211,10 +211,10 @@ main(int argc, char **argv) xfs_report_geom(&geo, datadev, logdev, rtdev); - ddsize = xi.dsize; - dlsize = ( xi.logBBsize? xi.logBBsize : + ddsize = xi.data.size; + dlsize = (xi.log.size ? xi.log.size : geo.logblocks * (geo.blocksize / BBSIZE) ); - drsize = xi.rtsize; + drsize = xi.rt.size; /* * Ok, Linux only has a 1024-byte resolution on device _size_, @@ -328,7 +328,7 @@ _("[EXPERIMENTAL] try to shrink unused space %lld, old size is %lld\n"), else if (xflag) in.isint = 0; else - in.isint = xi.logBBsize == 0; + in.isint = xi.log.size == 0; if (lsize == geo.logblocks && (in.isint == isint)) { if (lflag) fprintf(stderr, diff --git a/include/libxfs.h b/include/libxfs.h index 058217c2a..eb3f9ac22 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -89,38 +89,31 @@ struct iomap; #define xfs_isset(a,i) ((a)[(i)/(sizeof(*(a))*NBBY)] & (1ULL<<((i)%(sizeof(*(a))*NBBY)))) +struct libxfs_dev { + /* input parameters */ + char *name; /* pathname of the device */ + bool isfile; /* is the device a file? */ + bool create; /* create file if it doesn't exist */ + + /* output parameters */ + dev_t dev; /* device name for the device */ + long long size; /* size of subvolume (BBs) */ + int bsize; /* device blksize */ + int fd; /* file descriptor */ +}; + /* * Argument structure for libxfs_init(). */ struct libxfs_init { - /* input parameters */ - char *dname; /* pathname of data "subvolume" */ - char *logname; /* pathname of log "subvolume" */ - char *rtname; /* pathname of realtime "subvolume" */ + struct libxfs_dev data; + struct libxfs_dev log; + struct libxfs_dev rt; + + /* input parameters */ unsigned flags; /* LIBXFS_* flags below */ - int disfile; /* data "subvolume" is a regular file */ - int dcreat; /* try to create data subvolume */ - int lisfile; /* log "subvolume" is a regular file */ - int lcreat; /* try to create log subvolume */ - int risfile; /* realtime "subvolume" is a reg file */ - int rcreat; /* try to create realtime subvolume */ - int setblksize; /* attempt to set device blksize */ - /* output results */ - dev_t ddev; /* device for data subvolume */ - dev_t logdev; /* device for log subvolume */ - dev_t rtdev; /* device for realtime subvolume */ - long long dsize; /* size of data subvolume (BBs) */ - long long logBBsize; /* size of log subvolume (BBs) */ - /* (blocks allocated for use as - * log is stored in mount structure) */ - long long rtsize; /* size of realtime subvolume (BBs) */ - int dbsize; /* data subvolume device blksize */ - int lbsize; /* log subvolume device blksize */ - int rtbsize; /* realtime subvolume device blksize */ - int dfd; /* data subvolume file descriptor */ - int logfd; /* log subvolume file descriptor */ - int rtfd; /* realtime subvolume file descriptor */ int bcache_flags; /* cache init flags */ + int setblksize; /* value to set device blksizes to */ }; /* disallow all mounted filesystems: */ diff --git a/libxfs/init.c b/libxfs/init.c index 320e4d63f..63c506a69 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -62,93 +62,117 @@ check_isactive(char *name, char *block, int fatal) return 0; } -/* libxfs_device_open: - * open a device and return its device number - */ -static dev_t -libxfs_device_open(char *path, int creat, int xflags, int setblksize, int *fdp) +static int +check_open( + struct libxfs_init *xi, + struct libxfs_dev *dev) { - int fd, flags; - int readonly, dio, excl; - struct stat statb; + struct stat stbuf; - readonly = (xflags & LIBXFS_ISREADONLY); - excl = (xflags & LIBXFS_EXCLUSIVELY) && !creat; - dio = (xflags & LIBXFS_DIRECT) && !creat && platform_direct_blockdev(); + if (stat(dev->name, &stbuf) < 0) { + perror(dev->name); + return 0; + } + if (!(xi->flags & LIBXFS_ISREADONLY) && + !(xi->flags & LIBXFS_ISINACTIVE) && + platform_check_ismounted(dev->name, dev->name, NULL, 1)) + return 0; -retry: - flags = (readonly ? O_RDONLY : O_RDWR) | \ - (creat ? (O_CREAT|O_TRUNC) : 0) | \ - (dio ? O_DIRECT : 0) | \ - (excl ? O_EXCL : 0); + if ((xi->flags & LIBXFS_ISINACTIVE) && + check_isactive(dev->name, dev->name, !!(xi->flags & + (LIBXFS_ISREADONLY | LIBXFS_DANGEROUSLY)))) + return 0; + + return 1; +} + +static bool +libxfs_device_open( + struct libxfs_init *xi, + struct libxfs_dev *dev) +{ + struct stat statb; + int flags; + + dev->fd = -1; + + if (!dev->name) + return true; + if (!dev->isfile && !check_open(xi, dev)) + return false; + + if (xi->flags & LIBXFS_ISREADONLY) + flags = O_RDONLY; + else + flags = O_RDWR; - if ((fd = open(path, flags, 0666)) < 0) { - if (errno == EINVAL && --dio == 0) + if (dev->create) { + flags |= O_CREAT | O_TRUNC; + } else { + if (xi->flags & LIBXFS_EXCLUSIVELY) + flags |= O_EXCL; + if ((xi->flags & LIBXFS_DIRECT) && platform_direct_blockdev()) + flags |= O_DIRECT; + } + +retry: + dev->fd = open(dev->name, flags, 0666); + if (dev->fd < 0) { + if (errno == EINVAL && (flags & O_DIRECT)) { + flags &= ~O_DIRECT; goto retry; + } fprintf(stderr, _("%s: cannot open %s: %s\n"), - progname, path, strerror(errno)); + progname, dev->name, strerror(errno)); exit(1); } - if (fstat(fd, &statb) < 0) { + if (fstat(dev->fd, &statb) < 0) { fprintf(stderr, _("%s: cannot stat %s: %s\n"), - progname, path, strerror(errno)); + progname, dev->name, strerror(errno)); exit(1); } - if (!readonly && setblksize && (statb.st_mode & S_IFMT) == S_IFBLK) { + if (!(xi->flags & LIBXFS_ISREADONLY) && + xi->setblksize && + (statb.st_mode & S_IFMT) == S_IFBLK) { /* * Try to use the given explicit blocksize. Failure to set the * block size is only fatal for direct I/O. */ - platform_set_blocksize(fd, path, statb.st_rdev, setblksize, - dio); + platform_set_blocksize(dev->fd, dev->name, statb.st_rdev, + xi->setblksize, flags & O_DIRECT); } /* * Get the device number from the stat buf - unless we're not opening a * real device, in which case choose a new fake device number. */ - *fdp = fd; if (statb.st_rdev) - return statb.st_rdev; - return nextfakedev--; + dev->dev = statb.st_rdev; + else + dev->dev = nextfakedev--; + platform_findsizes(dev->name, dev->fd, &dev->size, &dev->bsize); + return true; } static void -libxfs_device_close(int fd, dev_t dev) +libxfs_device_close( + struct libxfs_dev *dev) { - int ret; + int ret; - ret = platform_flush_device(fd, dev); + ret = platform_flush_device(dev->fd, dev->dev); if (ret) { ret = -errno; fprintf(stderr, _("%s: flush of device %lld failed, err=%d"), progname, (long long)dev, ret); } - close(fd); -} + close(dev->fd); -static int -check_open(char *path, int flags) -{ - int readonly = (flags & LIBXFS_ISREADONLY); - int inactive = (flags & LIBXFS_ISINACTIVE); - int dangerously = (flags & LIBXFS_DANGEROUSLY); - struct stat stbuf; - - if (stat(path, &stbuf) < 0) { - perror(path); - return 0; - } - if (!readonly && !inactive && platform_check_ismounted(path, path, NULL, 1)) - return 0; - - if (inactive && check_isactive(path, path, ((readonly|dangerously)?1:0))) - return 0; - - return 1; + dev->fd = -1; + dev->dev = 0; } /* @@ -209,15 +233,12 @@ static void libxfs_close_devices( struct libxfs_init *li) { - if (li->ddev) - libxfs_device_close(li->dfd, li->ddev); - if (li->logdev && li->logdev != li->ddev) - libxfs_device_close(li->logfd, li->logdev); - if (li->rtdev) - libxfs_device_close(li->rtfd, li->rtdev); - - li->ddev = li->logdev = li->rtdev = 0; - li->dfd = li->logfd = li->rtfd = -1; + if (li->data.dev) + libxfs_device_close(&li->data); + if (li->log.dev && li->log.dev != li->data.dev) + libxfs_device_close(&li->log); + if (li->rt.dev) + libxfs_device_close(&li->rt); } /* @@ -227,44 +248,16 @@ libxfs_close_devices( int libxfs_init(struct libxfs_init *a) { - char *dname; - char *logname; - char *rtname; - - dname = a->dname; - logname = a->logname; - rtname = a->rtname; - a->dfd = a->logfd = a->rtfd = -1; - a->ddev = a->logdev = a->rtdev = 0; - a->dsize = a->lbsize = a->rtbsize = 0; - a->dbsize = a->logBBsize = a->rtsize = 0; - rcu_init(); rcu_register_thread(); radix_tree_init(); - if (dname) { - if (!a->disfile && !check_open(dname, a->flags)) - goto done; - a->ddev = libxfs_device_open(dname, a->dcreat, a->flags, - a->setblksize, &a->dfd); - platform_findsizes(dname, a->dfd, &a->dsize, &a->dbsize); - } - if (logname) { - if (!a->lisfile && !check_open(logname, a->flags)) - goto done; - a->logdev = libxfs_device_open(logname, a->lcreat, a->flags, - a->setblksize, &a->logfd); - platform_findsizes(logname, a->logfd, &a->logBBsize, - &a->lbsize); - } - if (rtname) { - if (a->risfile && !check_open(rtname, a->flags)) - goto done; - a->rtdev = libxfs_device_open(rtname, a->rcreat, a->flags, - a->setblksize, &a->rtfd); - platform_findsizes(dname, a->rtfd, &a->rtsize, &a->rtbsize); - } + if (!libxfs_device_open(a, &a->data)) + goto done; + if (!libxfs_device_open(a, &a->log)) + goto done; + if (!libxfs_device_open(a, &a->rt)) + goto done; if (!libxfs_bhash_size) libxfs_bhash_size = LIBXFS_BHASHSIZE(sbp); @@ -452,8 +445,7 @@ xfs_set_inode_alloc( static struct xfs_buftarg * libxfs_buftarg_alloc( struct xfs_mount *mp, - dev_t dev, - int fd, + struct libxfs_dev *dev, unsigned long write_fails) { struct xfs_buftarg *btp; @@ -465,8 +457,8 @@ libxfs_buftarg_alloc( exit(1); } btp->bt_mount = mp; - btp->bt_bdev = dev; - btp->bt_bdev_fd = fd; + btp->bt_bdev = dev->dev; + btp->bt_bdev_fd = dev->fd; btp->flags = 0; if (write_fails) { btp->writes_left = write_fails; @@ -538,29 +530,29 @@ libxfs_buftarg_init( if (mp->m_ddev_targp) { /* should already have all buftargs initialised */ - if (mp->m_ddev_targp->bt_bdev != xi->ddev || + if (mp->m_ddev_targp->bt_bdev != xi->data.dev || mp->m_ddev_targp->bt_mount != mp) { fprintf(stderr, _("%s: bad buftarg reinit, ddev\n"), progname); exit(1); } - if (!xi->logdev || xi->logdev == xi->ddev) { + if (!xi->log.dev || xi->log.dev == xi->data.dev) { if (mp->m_logdev_targp != mp->m_ddev_targp) { fprintf(stderr, _("%s: bad buftarg reinit, ldev mismatch\n"), progname); exit(1); } - } else if (mp->m_logdev_targp->bt_bdev != xi->logdev || + } else if (mp->m_logdev_targp->bt_bdev != xi->log.dev || mp->m_logdev_targp->bt_mount != mp) { fprintf(stderr, _("%s: bad buftarg reinit, logdev\n"), progname); exit(1); } - if (xi->rtdev && - (mp->m_rtdev_targp->bt_bdev != xi->rtdev || + if (xi->rt.dev && + (mp->m_rtdev_targp->bt_bdev != xi->rt.dev || mp->m_rtdev_targp->bt_mount != mp)) { fprintf(stderr, _("%s: bad buftarg reinit, rtdev\n"), @@ -570,14 +562,12 @@ libxfs_buftarg_init( return; } - mp->m_ddev_targp = libxfs_buftarg_alloc(mp, xi->ddev, xi->dfd, dfail); - if (!xi->logdev || xi->logdev == xi->ddev) + mp->m_ddev_targp = libxfs_buftarg_alloc(mp, &xi->data, dfail); + if (!xi->log.dev || xi->log.dev == xi->data.dev) mp->m_logdev_targp = mp->m_ddev_targp; else - mp->m_logdev_targp = libxfs_buftarg_alloc(mp, xi->logdev, - xi->logfd, lfail); - mp->m_rtdev_targp = libxfs_buftarg_alloc(mp, xi->rtdev, xi->rtfd, - rfail); + mp->m_logdev_targp = libxfs_buftarg_alloc(mp, &xi->log, lfail); + mp->m_rtdev_targp = libxfs_buftarg_alloc(mp, &xi->rt, rfail); } /* Compute maximum possible height for per-AG btree types for this fs. */ @@ -711,7 +701,7 @@ libxfs_mount( /* Initialize the precomputed transaction reservations values */ xfs_trans_init(mp); - if (xi->ddev == 0) /* maxtrres, we have no device so leave now */ + if (xi->data.dev == 0) /* maxtrres, we have no device so leave now */ return mp; /* device size checks must pass unless we're a debugger. */ diff --git a/libxfs/topology.c b/libxfs/topology.c index d6791c0f6..06013d429 100644 --- a/libxfs/topology.c +++ b/libxfs/topology.c @@ -299,34 +299,34 @@ get_topology( * to try to obtain the underlying filesystem's requirements * for direct IO; we'll set our sector size to that if possible. */ - if (xi->disfile || - (!stat(xi->dname, &statbuf) && S_ISREG(statbuf.st_mode))) { + if (xi->data.isfile || + (!stat(xi->data.name, &statbuf) && S_ISREG(statbuf.st_mode))) { int fd; int flags = O_RDONLY; long long dummy; /* with xi->disfile we may not have the file yet! */ - if (xi->disfile) + if (xi->data.isfile) flags |= O_CREAT; - fd = open(xi->dname, flags, 0666); + fd = open(xi->data.name, flags, 0666); if (fd >= 0) { - platform_findsizes(xi->dname, fd, &dummy, + platform_findsizes(xi->data.name, fd, &dummy, &ft->lsectorsize); close(fd); ft->psectorsize = ft->lsectorsize; } else ft->psectorsize = ft->lsectorsize = BBSIZE; } else { - blkid_get_topology(xi->dname, &ft->dsunit, &ft->dswidth, + blkid_get_topology(xi->data.name, &ft->dsunit, &ft->dswidth, &ft->lsectorsize, &ft->psectorsize, force_overwrite); } - if (xi->rtname && !xi->risfile) { + if (xi->rt.name && !xi->rt.isfile) { int sunit, lsectorsize, psectorsize; - blkid_get_topology(xi->rtname, &sunit, &ft->rtswidth, + blkid_get_topology(xi->rt.name, &sunit, &ft->rtswidth, &lsectorsize, &psectorsize, force_overwrite); } } diff --git a/logprint/logprint.c b/logprint/logprint.c index 5349e7838..7c69cdcc7 100644 --- a/logprint/logprint.c +++ b/logprint/logprint.c @@ -64,9 +64,9 @@ logstat( * filesystem. We need this to get the length of the * log. Otherwise we end up seeking forever. -- mkp */ - if ((fd = open(x.dname, O_RDONLY)) == -1) { + if ((fd = open(x.data.name, O_RDONLY)) == -1) { fprintf(stderr, _(" Can't open device %s: %s\n"), - x.dname, strerror(errno)); + x.data.name, strerror(errno)); exit(1); } lseek(fd, 0, SEEK_SET); @@ -76,7 +76,7 @@ logstat( } close (fd); - if (!x.disfile) { + if (!x.data.isfile) { struct xfs_sb *sb = &mp->m_sb; /* @@ -88,7 +88,7 @@ logstat( xlog_init(mp, log); - if (!x.logname && sb->sb_logstart == 0) { + if (!x.log.name && sb->sb_logstart == 0) { fprintf(stderr, _(" external log device not specified\n\n")); usage(); /*NOTREACHED*/ @@ -96,7 +96,7 @@ logstat( } else { struct stat s; - stat(x.dname, &s); + stat(x.data.name, &s); log->l_logBBsize = s.st_size >> 9; log->l_logBBstart = 0; @@ -105,15 +105,15 @@ logstat( log->l_mp = mp; } - if (x.logname && *x.logname) { /* External log */ - if ((fd = open(x.logname, O_RDONLY)) == -1) { + if (x.log.name && *x.log.name) { /* External log */ + if ((fd = open(x.log.name, O_RDONLY)) == -1) { fprintf(stderr, _("Can't open file %s: %s\n"), - x.logname, strerror(errno)); + x.log.name, strerror(errno)); exit(1); } close(fd); } else { /* Internal log */ - x.logdev = x.ddev; + x.log.dev = x.data.dev; } return 0; @@ -165,11 +165,11 @@ main(int argc, char **argv) break; case 'f': print_skip_uuid++; - x.disfile = 1; + x.data.isfile = 1; break; case 'l': - x.logname = optarg; - x.lisfile = 1; + x.log.name = optarg; + x.log.isfile = 1; break; case 'i': print_inode++; @@ -203,9 +203,9 @@ main(int argc, char **argv) if (argc - optind != 1) usage(); - x.dname = argv[optind]; + x.data.name = argv[optind]; - if (x.dname == NULL) + if (x.data.name == NULL) usage(); x.flags = LIBXFS_ISINACTIVE; @@ -216,20 +216,20 @@ main(int argc, char **argv) libxfs_buftarg_init(&mount, &x); logstat(&mount, &log); - logfd = (x.logfd < 0) ? x.dfd : x.logfd; + logfd = (x.log.fd < 0) ? x.data.fd : x.log.fd; - printf(_(" data device: 0x%llx\n"), (unsigned long long)x.ddev); + printf(_(" data device: 0x%llx\n"), (unsigned long long)x.data.dev); - if (x.logname) { - printf(_(" log file: \"%s\" "), x.logname); + if (x.log.name) { + printf(_(" log file: \"%s\" "), x.log.name); } else { - printf(_(" log device: 0x%llx "), (unsigned long long)x.logdev); + printf(_(" log device: 0x%llx "), (unsigned long long)x.log.dev); } printf(_("daddr: %lld length: %lld\n\n"), (long long)log.l_logBBstart, (long long)log.l_logBBsize); - ASSERT(log.l_logBBsize <= INT_MAX); + ASSERT(x.log.size <= INT_MAX); switch (print_operation) { case OP_PRINT: diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 01c6ce33b..fcbf54132 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -1092,37 +1092,35 @@ invalid_cfgfile_opt( static void check_device_type( - const char *name, - int *isfile, - bool no_size, - bool no_name, - int *create, - const char *optname) + struct libxfs_dev *dev, + bool no_size, + bool dry_run, + const char *optname) { struct stat statbuf; - if (*isfile && (no_size || no_name)) { + if (dev->isfile && (no_size || !dev->name)) { fprintf(stderr, _("if -%s file then -%s name and -%s size are required\n"), optname, optname, optname); usage(); } - if (!name) { + if (!dev->name) { fprintf(stderr, _("No device name specified\n")); usage(); } - if (stat(name, &statbuf)) { - if (errno == ENOENT && *isfile) { - if (create) - *create = 1; + if (stat(dev->name, &statbuf)) { + if (errno == ENOENT && dev->isfile) { + if (!dry_run) + dev->create = 1; return; } fprintf(stderr, _("Error accessing specified device %s: %s\n"), - name, strerror(errno)); + dev->name, strerror(errno)); usage(); return; } @@ -1133,18 +1131,18 @@ check_device_type( * this case to trigger that behaviour. */ if (S_ISREG(statbuf.st_mode)) { - if (!*isfile) - *isfile = 1; - else if (create) - *create = 1; + if (!dev->isfile) + dev->isfile = 1; + else if (!dry_run) + dev->create = 1; return; } if (S_ISBLK(statbuf.st_mode)) { - if (*isfile) { + if (dev->isfile) { fprintf(stderr, _("specified \"-%s file\" on a block device %s\n"), - optname, name); + optname, dev->name); usage(); } return; @@ -1152,7 +1150,7 @@ check_device_type( fprintf(stderr, _("specified device %s not a file or block device\n"), - name); + dev->name); usage(); } @@ -1258,7 +1256,7 @@ zero_old_xfs_structures( /* * We open regular files with O_TRUNC|O_CREAT. Nothing to do here... */ - if (xi->disfile && xi->dcreat) + if (xi->data.isfile && xi->data.create) return; /* @@ -1279,9 +1277,9 @@ zero_old_xfs_structures( * return zero bytes. It's not a failure we need to warn about in this * case. */ - off = pread(xi->dfd, buf, new_sb->sb_sectsize, 0); + off = pread(xi->data.fd, buf, new_sb->sb_sectsize, 0); if (off != new_sb->sb_sectsize) { - if (!xi->disfile) + if (!xi->data.isfile) fprintf(stderr, _("error reading existing superblock: %s\n"), strerror(errno)); @@ -1316,7 +1314,7 @@ zero_old_xfs_structures( off = 0; for (i = 1; i < sb.sb_agcount; i++) { off += sb.sb_agblocks; - if (pwrite(xi->dfd, buf, new_sb->sb_sectsize, + if (pwrite(xi->data.fd, buf, new_sb->sb_sectsize, off << sb.sb_blocklog) == -1) break; } @@ -1561,10 +1559,10 @@ data_opts_parser( cli->agsize = getstr(value, opts, subopt); break; case D_FILE: - cli->xi->disfile = getnum(value, opts, subopt); + cli->xi->data.isfile = getnum(value, opts, subopt); break; case D_NAME: - cli->xi->dname = getstr(value, opts, subopt); + cli->xi->data.name = getstr(value, opts, subopt); break; case D_SIZE: cli->dsize = getstr(value, opts, subopt); @@ -1673,7 +1671,7 @@ log_opts_parser( cli->logagno = getnum(value, opts, subopt); break; case L_FILE: - cli->xi->lisfile = getnum(value, opts, subopt); + cli->xi->log.isfile = getnum(value, opts, subopt); break; case L_INTERNAL: cli->loginternal = getnum(value, opts, subopt); @@ -1686,7 +1684,7 @@ log_opts_parser( break; case L_NAME: case L_DEV: - cli->xi->logname = getstr(value, opts, subopt); + cli->xi->log.name = getstr(value, opts, subopt); cli->loginternal = 0; break; case L_VERSION: @@ -1819,11 +1817,11 @@ rtdev_opts_parser( cli->rtextsize = getstr(value, opts, subopt); break; case R_FILE: - cli->xi->risfile = getnum(value, opts, subopt); + cli->xi->rt.isfile = getnum(value, opts, subopt); break; case R_NAME: case R_DEV: - cli->xi->rtname = getstr(value, opts, subopt); + cli->xi->rt.name = getstr(value, opts, subopt); break; case R_SIZE: cli->rtsize = getstr(value, opts, subopt); @@ -1962,24 +1960,18 @@ validate_sectorsize( * Before anything else, verify that we are correctly operating on * files or block devices and set the control parameters correctly. */ - check_device_type(cli->xi->dname, &cli->xi->disfile, - !cli->dsize, !cli->xi->dname, - dry_run ? NULL : &cli->xi->dcreat, "d"); + check_device_type(&cli->xi->data, !cli->dsize, dry_run, "d"); if (!cli->loginternal) - check_device_type(cli->xi->logname, &cli->xi->lisfile, - !cli->logsize, !cli->xi->logname, - dry_run ? NULL : &cli->xi->lcreat, "l"); - if (cli->xi->rtname) - check_device_type(cli->xi->rtname, &cli->xi->risfile, - !cli->rtsize, !cli->xi->rtname, - dry_run ? NULL : &cli->xi->rcreat, "r"); + check_device_type(&cli->xi->log, !cli->logsize, dry_run, "l"); + if (cli->xi->rt.name) + check_device_type(&cli->xi->rt, !cli->rtsize, dry_run, "r"); /* * Explicitly disable direct IO for image files so we don't error out on * sector size mismatches between the new filesystem and the underlying * host filesystem. */ - if (cli->xi->disfile || cli->xi->lisfile || cli->xi->risfile) + if (cli->xi->data.isfile || cli->xi->log.isfile || cli->xi->rt.isfile) cli->xi->flags &= ~LIBXFS_DIRECT; memset(ft, 0, sizeof(*ft)); @@ -2294,7 +2286,7 @@ _("inode btree counters not supported without finobt support\n")); cli->sb_feat.inobtcnt = false; } - if (cli->xi->rtname) { + if (cli->xi->rt.name) { if (cli->sb_feat.reflink && cli_opt_set(&mopts, M_REFLINK)) { fprintf(stderr, _("reflink not supported with realtime devices\n")); @@ -2461,8 +2453,8 @@ validate_rtextsize( */ uint64_t rswidth; - if (!cfg->sb_feat.nortalign && !cli->xi->risfile && - !(!cli->rtsize && cli->xi->disfile)) + if (!cfg->sb_feat.nortalign && !cli->xi->rt.isfile && + !(!cli->rtsize && cli->xi->data.isfile)) rswidth = ft->rtswidth; else rswidth = 0; @@ -2840,7 +2832,7 @@ open_devices( xi->setblksize = cfg->sectorsize; if (!libxfs_init(xi)) usage(); - if (!xi->ddev) { + if (!xi->data.dev) { fprintf(stderr, _("no device name given in argument list\n")); usage(); } @@ -2856,9 +2848,9 @@ open_devices( * multiple of the sector size, or 1024, whichever is larger. */ sector_mask = (uint64_t)-1 << (max(cfg->sectorlog, 10) - BBSHIFT); - xi->dsize &= sector_mask; - xi->rtsize &= sector_mask; - xi->logBBsize &= (uint64_t)-1 << (max(cfg->lsectorlog, 10) - BBSHIFT); + xi->data.size &= sector_mask; + xi->rt.size &= sector_mask; + xi->log.size &= (uint64_t)-1 << (max(cfg->lsectorlog, 10) - BBSHIFT); } static void @@ -2870,12 +2862,12 @@ discard_devices( * This function has to be called after libxfs has been initialized. */ - if (!xi->disfile) - discard_blocks(xi->dfd, xi->dsize, quiet); - if (xi->rtdev && !xi->risfile) - discard_blocks(xi->rtfd, xi->rtsize, quiet); - if (xi->logdev && xi->logdev != xi->ddev && !xi->lisfile) - discard_blocks(xi->logfd, xi->logBBsize, quiet); + if (!xi->data.isfile) + discard_blocks(xi->data.fd, xi->data.size, quiet); + if (xi->rt.dev && !xi->rt.isfile) + discard_blocks(xi->rt.fd, xi->rt.size, quiet); + if (xi->log.dev && xi->log.dev != xi->data.dev && !xi->log.isfile) + discard_blocks(xi->log.fd, xi->log.size, quiet); } static void @@ -2885,29 +2877,29 @@ validate_datadev( { struct libxfs_init *xi = cli->xi; - if (!xi->dsize) { + if (!xi->data.size) { /* * if the device is a file, we can't validate the size here. * Instead, the file will be truncated to the correct length * later on. if it's not a file, we've got a dud device. */ - if (!xi->disfile) { + if (!xi->data.isfile) { fprintf(stderr, _("can't get size of data subvolume\n")); usage(); } ASSERT(cfg->dblocks); } else if (cfg->dblocks) { /* check the size fits into the underlying device */ - if (cfg->dblocks > DTOBT(xi->dsize, cfg->blocklog)) { + if (cfg->dblocks > DTOBT(xi->data.size, cfg->blocklog)) { fprintf(stderr, _("size %s specified for data subvolume is too large, maximum is %lld blocks\n"), cli->dsize, - (long long)DTOBT(xi->dsize, cfg->blocklog)); + (long long)DTOBT(xi->data.size, cfg->blocklog)); usage(); } } else { /* no user size, so use the full block device */ - cfg->dblocks = DTOBT(xi->dsize, cfg->blocklog); + cfg->dblocks = DTOBT(xi->data.size, cfg->blocklog); } if (cfg->dblocks < XFS_MIN_DATA_BLOCKS(cfg)) { @@ -2917,11 +2909,11 @@ _("size %lld of data subvolume is too small, minimum %lld blocks\n"), usage(); } - if (xi->dbsize > cfg->sectorsize) { + if (xi->data.bsize > cfg->sectorsize) { fprintf(stderr, _( "Warning: the data subvolume sector size %u is less than the sector size \n\ reported by the device (%u).\n"), - cfg->sectorsize, xi->dbsize); + cfg->sectorsize, xi->data.bsize); } } @@ -2961,31 +2953,31 @@ _("log size %lld too large for internal log\n"), } /* External/log subvolume checks */ - if (!*xi->logname || !xi->logdev) { + if (!*xi->log.name || !xi->log.dev) { fprintf(stderr, _("no log subvolume or external log.\n")); usage(); } if (!cfg->logblocks) { - if (xi->logBBsize == 0) { + if (xi->log.size == 0) { fprintf(stderr, _("unable to get size of the log subvolume.\n")); usage(); } - cfg->logblocks = DTOBT(xi->logBBsize, cfg->blocklog); - } else if (cfg->logblocks > DTOBT(xi->logBBsize, cfg->blocklog)) { + cfg->logblocks = DTOBT(xi->log.size, cfg->blocklog); + } else if (cfg->logblocks > DTOBT(xi->log.size, cfg->blocklog)) { fprintf(stderr, _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), cli->logsize, - (long long)DTOBT(xi->logBBsize, cfg->blocklog)); + (long long)DTOBT(xi->log.size, cfg->blocklog)); usage(); } - if (xi->lbsize > cfg->lsectorsize) { + if (xi->log.bsize > cfg->lsectorsize) { fprintf(stderr, _( "Warning: the log subvolume sector size %u is less than the sector size\n\ reported by the device (%u).\n"), - cfg->lsectorsize, xi->lbsize); + cfg->lsectorsize, xi->log.bsize); } } @@ -2996,7 +2988,7 @@ validate_rtdev( { struct libxfs_init *xi = cli->xi; - if (!xi->rtdev) { + if (!xi->rt.dev) { if (cli->rtsize) { fprintf(stderr, _("size specified for non-existent rt subvolume\n")); @@ -3008,28 +3000,28 @@ _("size specified for non-existent rt subvolume\n")); cfg->rtbmblocks = 0; return; } - if (!xi->rtsize) { + if (!xi->rt.size) { fprintf(stderr, _("Invalid zero length rt subvolume found\n")); usage(); } if (cli->rtsize) { - if (cfg->rtblocks > DTOBT(xi->rtsize, cfg->blocklog)) { + if (cfg->rtblocks > DTOBT(xi->rt.size, cfg->blocklog)) { fprintf(stderr, _("size %s specified for rt subvolume is too large, maxi->um is %lld blocks\n"), cli->rtsize, - (long long)DTOBT(xi->rtsize, cfg->blocklog)); + (long long)DTOBT(xi->rt.size, cfg->blocklog)); usage(); } - if (xi->rtbsize > cfg->sectorsize) { + if (xi->rt.bsize > cfg->sectorsize) { fprintf(stderr, _( "Warning: the realtime subvolume sector size %u is less than the sector size\n\ reported by the device (%u).\n"), - cfg->sectorsize, xi->rtbsize); + cfg->sectorsize, xi->rt.bsize); } } else { /* grab volume size */ - cfg->rtblocks = DTOBT(xi->rtsize, cfg->blocklog); + cfg->rtblocks = DTOBT(xi->rt.size, cfg->blocklog); } cfg->rtextents = cfg->rtblocks / cfg->rtextblocks; @@ -3770,9 +3762,9 @@ prepare_devices( * needed so that the reads for the end of the device in the mount code * will succeed. */ - if (xi->disfile && - xi->dsize * xi->dbsize < cfg->dblocks * cfg->blocksize) { - if (ftruncate(xi->dfd, cfg->dblocks * cfg->blocksize) < 0) { + if (xi->data.isfile && + xi->data.size * xi->data.bsize < cfg->dblocks * cfg->blocksize) { + if (ftruncate(xi->data.fd, cfg->dblocks * cfg->blocksize) < 0) { fprintf(stderr, _("%s: Growing the data section failed\n"), progname); @@ -3780,7 +3772,7 @@ prepare_devices( } /* update size to be able to whack blocks correctly */ - xi->dsize = BTOBB(cfg->dblocks * cfg->blocksize); + xi->data.size = BTOBB(cfg->dblocks * cfg->blocksize); } /* @@ -3788,7 +3780,7 @@ prepare_devices( * the end of the device. (MD sb is ~64k from the end, take out a wider * swath to be sure) */ - buf = alloc_write_buf(mp->m_ddev_targp, (xi->dsize - whack_blks), + buf = alloc_write_buf(mp->m_ddev_targp, (xi->data.size - whack_blks), whack_blks); memset(buf->b_addr, 0, WHACK_SIZE); libxfs_buf_mark_dirty(buf); @@ -4183,7 +4175,7 @@ main( fprintf(stderr, _("extra arguments\n")); usage(); } else if (argc - optind == 1) { - xi.dname = getstr(argv[optind], &dopts, D_NAME); + xi.data.name = getstr(argv[optind], &dopts, D_NAME); } /* @@ -4236,7 +4228,7 @@ main( * Open and validate the device configurations */ open_devices(&cfg, &xi); - validate_overwrite(xi.dname, force_overwrite); + validate_overwrite(xi.data.name, force_overwrite); validate_datadev(&cfg, &cli); validate_logdev(&cfg, &cli); validate_rtdev(&cfg, &cli); @@ -4280,7 +4272,7 @@ main( struct xfs_fsop_geom geo; libxfs_fs_geometry(mp, &geo, XFS_FS_GEOM_MAX_STRUCT_VER); - xfs_report_geom(&geo, xi.dname, xi.logname, xi.rtname); + xfs_report_geom(&geo, xi.data.name, xi.log.name, xi.rt.name); if (dry_run) exit(0); } diff --git a/repair/init.c b/repair/init.c index 2dc439a22..3788d00f2 100644 --- a/repair/init.c +++ b/repair/init.c @@ -56,19 +56,19 @@ xfs_init(struct libxfs_init *args) { memset(args, 0, sizeof(*args)); - args->dname = fs_name; - args->disfile = isa_file; + args->data.name = fs_name; + args->data.isfile = isa_file; if (log_spec) { /* External log specified */ - args->logname = log_name; - args->lisfile = (isa_file?1:0); + args->log.name = log_name; + args->log.isfile = isa_file; /* XXX assume data file also means log file */ /* REVISIT: Need to do fs sanity / log validity checking */ } if (rt_spec) { /* RT device specified */ - args->rtname = rt_name; - args->risfile = (isa_file?1:0); + args->rt.name = rt_name; + args->rt.isfile = isa_file; /* XXX assume data file also means rt file */ } diff --git a/repair/phase2.c b/repair/phase2.c index 48263e161..063748179 100644 --- a/repair/phase2.c +++ b/repair/phase2.c @@ -341,11 +341,11 @@ phase2( /* Check whether this fs has internal or external log */ if (mp->m_sb.sb_logstart == 0) { - if (!x.logname) + if (!x.log.name) do_error(_("This filesystem has an external log. " "Specify log device with the -l option.\n")); - do_log(_("Phase 2 - using external log on %s\n"), x.logname); + do_log(_("Phase 2 - using external log on %s\n"), x.log.name); } else do_log(_("Phase 2 - using internal log\n")); diff --git a/repair/sb.c b/repair/sb.c index b823ba3a9..dedac53af 100644 --- a/repair/sb.c +++ b/repair/sb.c @@ -125,13 +125,11 @@ __find_secondary_sb( /* * read disk 1 MByte at a time. */ - if (lseek(x.dfd, off, SEEK_SET) != off) { + if (lseek(x.data.fd, off, SEEK_SET) != off) done = 1; - } - if (!done && (bsize = read(x.dfd, sb, BSIZE)) <= 0) { + if (!done && (bsize = read(x.data.fd, sb, BSIZE)) <= 0) done = 1; - } do_warn("."); @@ -192,7 +190,7 @@ guess_default_geometry( */ blocklog = 12; multidisk = ft.dswidth | ft.dsunit; - dblocks = x->dsize >> (blocklog - BBSHIFT); + dblocks = x->data.size >> (blocklog - BBSHIFT); calc_default_ag_geometry(blocklog, dblocks, multidisk, agsize, agcount); @@ -533,7 +531,7 @@ write_primary_sb(xfs_sb_t *sbp, int size) } memset(buf, 0, size); - if (lseek(x.dfd, 0LL, SEEK_SET) != 0LL) { + if (lseek(x.data.fd, 0LL, SEEK_SET) != 0LL) { free(buf); do_error(_("couldn't seek to offset 0 in filesystem\n")); } @@ -543,7 +541,7 @@ write_primary_sb(xfs_sb_t *sbp, int size) if (xfs_sb_version_hascrc(sbp)) xfs_update_cksum((char *)buf, size, XFS_SB_CRC_OFF); - if (write(x.dfd, buf, size) != size) { + if (write(x.data.fd, buf, size) != size) { free(buf); do_error(_("primary superblock write failed!\n")); } @@ -572,7 +570,7 @@ get_sb(xfs_sb_t *sbp, xfs_off_t off, int size, xfs_agnumber_t agno) /* try and read it first */ - if (lseek(x.dfd, off, SEEK_SET) != off) { + if (lseek(x.data.fd, off, SEEK_SET) != off) { do_warn( _("error reading superblock %u -- seek to offset %" PRId64 " failed\n"), agno, off); @@ -580,7 +578,7 @@ get_sb(xfs_sb_t *sbp, xfs_off_t off, int size, xfs_agnumber_t agno) return(XR_EOF); } - if ((rval = read(x.dfd, buf, size)) != size) { + if ((rval = read(x.data.fd, buf, size)) != size) { error = errno; do_warn( _("superblock read failed, offset %" PRId64 ", size %d, ag %u, rval %d\n"), diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index cdbdbe855..ba9d28330 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -728,7 +728,7 @@ check_fs_vs_host_sectsize( long old_flags; struct xfs_fsop_geom geom = { 0 }; - ret = -xfrog_geometry(x.dfd, &geom); + ret = -xfrog_geometry(x.data.fd, &geom); if (ret) { do_log(_("Cannot get host filesystem geometry.\n" "Repair may fail if there is a sector size mismatch between\n" @@ -737,8 +737,8 @@ check_fs_vs_host_sectsize( } if (sb->sb_sectsize < geom.sectsize) { - old_flags = fcntl(x.dfd, F_GETFL, 0); - if (fcntl(x.dfd, F_SETFL, old_flags & ~O_DIRECT) < 0) { + old_flags = fcntl(x.data.fd, F_GETFL, 0); + if (fcntl(x.data.fd, F_SETFL, old_flags & ~O_DIRECT) < 0) { do_warn(_( "Sector size on host filesystem larger than image sector size.\n" "Cannot turn off direct IO, so exiting.\n")); @@ -986,7 +986,7 @@ main(int argc, char **argv) if (!isa_file) { struct stat statbuf; - if (fstat(x.dfd, &statbuf) < 0) + if (fstat(x.data.fd, &statbuf) < 0) do_warn(_("%s: couldn't stat \"%s\"\n"), progname, fs_name); else if (S_ISREG(statbuf.st_mode)) -- 2.39.2