check_errors();
libxfs_umount(mp);
- libxfs_destroy();
+ libxfs_destroy(&xargs);
return 0;
}
while (iocur_sp > start_iocur_sp)
pop_cur();
libxfs_umount(mp);
- if (x.ddev)
- libxfs_device_close(x.ddev);
- if (x.logdev && x.logdev != x.ddev)
- libxfs_device_close(x.logdev);
- if (x.rtdev)
- libxfs_device_close(x.rtdev);
- libxfs_destroy();
+ libxfs_destroy(&x);
return exitcode;
}
extern char *progname;
extern xfs_lsn_t libxfs_max_lsn;
extern int libxfs_init (libxfs_init_t *);
-extern void libxfs_destroy (void);
+void libxfs_destroy(struct libxfs_xinit *li);
extern int libxfs_device_to_fd (dev_t);
extern dev_t libxfs_device_open (char *, int, int, int);
extern void libxfs_device_close (dev_t);
return leaked;
}
+static void
+libxfs_close_devices(
+ struct libxfs_xinit *li)
+{
+ if (li->ddev)
+ libxfs_device_close(li->ddev);
+ if (li->logdev && li->logdev != li->ddev)
+ libxfs_device_close(li->logdev);
+ if (li->rtdev)
+ libxfs_device_close(li->rtdev);
+
+ li->ddev = li->logdev = li->rtdev = 0;
+ li->dfd = li->logfd = li->rtfd = -1;
+}
+
/*
* libxfs initialization.
* Caller gets a 0 on failure (and we print a message), 1 on success.
unlink(rtpath);
if (fd >= 0)
close(fd);
- if (!rval && a->ddev)
- libxfs_device_close(a->ddev);
- if (!rval && a->logdev)
- libxfs_device_close(a->logdev);
- if (!rval && a->rtdev)
- libxfs_device_close(a->rtdev);
+ if (!rval)
+ libxfs_close_devices(a);
+
return rval;
}
* Release any global resources used by libxfs.
*/
void
-libxfs_destroy(void)
+libxfs_destroy(
+ struct libxfs_xinit *li)
{
- int leaked;
+ int leaked;
+
+ libxfs_close_devices(li);
/* Free everything from the buffer cache before freeing buffer zone */
libxfs_bcache_purge();
libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE);
libxfs_umount(mp);
- if (xi.rtdev)
- libxfs_device_close(xi.rtdev);
- if (xi.logdev && xi.logdev != xi.ddev)
- libxfs_device_close(xi.logdev);
- libxfs_device_close(xi.ddev);
- libxfs_destroy();
+ libxfs_destroy(&xi);
return 0;
}
format_log_max_lsn(mp);
libxfs_umount(mp);
- if (x.rtdev)
- libxfs_device_close(x.rtdev);
- if (x.logdev && x.logdev != x.ddev)
- libxfs_device_close(x.logdev);
- libxfs_device_close(x.ddev);
- libxfs_destroy();
+ libxfs_destroy(&x);
if (verbose)
summary_report();