libxfs: clean up libxfs_destroy
It's weird that libxfs_init opens the three devices passed in via the
libxfs_xinit structure but libxfs_destroy doesn't actually close them.
Fix this inconsistency and remove all the open-coded device closing.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c
index a6d6703..7f4615a 100644
--- a/copy/xfs_copy.c
+++ b/copy/xfs_copy.c
@@ -1200,7 +1200,7 @@
check_errors();
libxfs_umount(mp);
- libxfs_destroy();
+ libxfs_destroy(&xargs);
return 0;
}
diff --git a/db/init.c b/db/init.c
index 0ac3736..e5450d2 100644
--- a/db/init.c
+++ b/db/init.c
@@ -217,13 +217,7 @@
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;
}
diff --git a/include/libxfs.h b/include/libxfs.h
index aaac00f..504f6e9 100644
--- a/include/libxfs.h
+++ b/include/libxfs.h
@@ -136,7 +136,7 @@
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);
diff --git a/libxfs/init.c b/libxfs/init.c
index 197690d..913f546 100644
--- a/libxfs/init.c
+++ b/libxfs/init.c
@@ -259,6 +259,21 @@
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.
@@ -385,12 +400,9 @@
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;
}
@@ -913,9 +925,12 @@
* 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();
diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
index 1038e60..7f315d8 100644
--- a/mkfs/xfs_mkfs.c
+++ b/mkfs/xfs_mkfs.c
@@ -3945,11 +3945,6 @@
if (error)
exit(1);
- 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;
}
diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c
index ccb13f4..3857812 100644
--- a/repair/xfs_repair.c
+++ b/repair/xfs_repair.c
@@ -1111,12 +1111,7 @@
if (error)
exit(1);
- 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();