Skip to content

Commit

Permalink
libzfs: get rid of libzfs_handle::libzfs_mnttab
Browse files Browse the repository at this point in the history
All users did a freopen() on it. Even some non-users did!
This is point-less ‒ just open the mtab when needed

If I understand Solaris' getextmntent(3C) correctly, the non-user
freopen()s are very likely an odd, twisted vestigial tail of that ‒
but it's got a completely different calling convention and caching
semantics than any platform we support

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz>
Closes openzfs#11868
  • Loading branch information
nabijaczleweli authored and mcmilk committed Apr 15, 2021
1 parent 421503a commit 445fb07
Show file tree
Hide file tree
Showing 7 changed files with 2,609 additions and 2,759 deletions.
31 changes: 11 additions & 20 deletions cmd/zfs/zfs_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,6 @@

libzfs_handle_t *g_zfs;

static FILE *mnttab_file;
static char history_str[HIS_MAX_RECORD_LEN];
static boolean_t log_history = B_TRUE;

Expand Down Expand Up @@ -7063,8 +7062,7 @@ share_mount(int op, int argc, char **argv)
get_all_datasets(&cb, verbose);

if (cb.cb_used == 0) {
if (options != NULL)
free(options);
free(options);
return (0);
}

Expand Down Expand Up @@ -7094,6 +7092,7 @@ share_mount(int op, int argc, char **argv)
zfs_close(cb.cb_handles[i]);
free(cb.cb_handles);
} else if (argc == 0) {
FILE *mnttab;
struct mnttab entry;

if ((op == OP_SHARE) || (options != NULL)) {
Expand All @@ -7109,14 +7108,12 @@ share_mount(int op, int argc, char **argv)
* automatically.
*/

/* Reopen MNTTAB to prevent reading stale data from open file */
if (freopen(MNTTAB, "r", mnttab_file) == NULL) {
if (options != NULL)
free(options);
if ((mnttab = fopen(MNTTAB, "re")) == NULL) {
free(options);
return (ENOENT);
}

while (getmntent(mnttab_file, &entry) == 0) {
while (getmntent(mnttab, &entry) == 0) {
if (strcmp(entry.mnt_fstype, MNTTYPE_ZFS) != 0 ||
strchr(entry.mnt_special, '@') != NULL)
continue;
Expand All @@ -7125,6 +7122,7 @@ share_mount(int op, int argc, char **argv)
entry.mnt_mountp);
}

(void) fclose(mnttab);
} else {
zfs_handle_t *zhp;

Expand All @@ -7145,9 +7143,7 @@ share_mount(int op, int argc, char **argv)
}
}

if (options != NULL)
free(options);

free(options);
return (ret);
}

Expand Down Expand Up @@ -7210,10 +7206,6 @@ unshare_unmount_path(int op, char *path, int flags, boolean_t is_manual)
* Search for the given (major,minor) pair in the mount table.
*/

/* Reopen MNTTAB to prevent reading stale data from open file */
if (freopen(MNTTAB, "r", mnttab_file) == NULL)
return (ENOENT);

if (getextmntent(path, &entry, &statbuf) != 0) {
if (op == OP_SHARE) {
(void) fprintf(stderr, gettext("cannot %s '%s': not "
Expand Down Expand Up @@ -7353,6 +7345,7 @@ unshare_unmount(int op, int argc, char **argv)
* the special type (dataset name), and walk the result in
* reverse to make sure to get any snapshots first.
*/
FILE *mnttab;
struct mnttab entry;
uu_avl_pool_t *pool;
uu_avl_t *tree = NULL;
Expand Down Expand Up @@ -7385,11 +7378,10 @@ unshare_unmount(int op, int argc, char **argv)
((tree = uu_avl_create(pool, NULL, UU_DEFAULT)) == NULL))
nomem();

/* Reopen MNTTAB to prevent reading stale data from open file */
if (freopen(MNTTAB, "r", mnttab_file) == NULL)
if ((mnttab = fopen(MNTTAB, "re")) == NULL)
return (ENOENT);

while (getmntent(mnttab_file, &entry) == 0) {
while (getmntent(mnttab, &entry) == 0) {

/* ignore non-ZFS entries */
if (strcmp(entry.mnt_fstype, MNTTYPE_ZFS) != 0)
Expand Down Expand Up @@ -7459,6 +7451,7 @@ unshare_unmount(int op, int argc, char **argv)
free(node);
}
}
(void) fclose(mnttab);

/*
* Walk the AVL tree in reverse, unmounting each filesystem and
Expand Down Expand Up @@ -8649,8 +8642,6 @@ main(int argc, char **argv)
return (1);
}

mnttab_file = g_zfs->libzfs_mnttab;

zfs_save_arguments(argc, argv, history_str, sizeof (history_str));

libzfs_print_on_error(g_zfs, B_TRUE);
Expand Down
1 change: 0 additions & 1 deletion include/libzfs_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ extern "C" {
struct libzfs_handle {
int libzfs_error;
int libzfs_fd;
FILE *libzfs_mnttab;
zpool_handle_t *libzfs_pool_handles;
uu_avl_pool_t *libzfs_ns_avlpool;
uu_avl_t *libzfs_ns_avl;
Expand Down
4 changes: 0 additions & 4 deletions lib/libspl/os/linux/getmntany.c
Original file line number Diff line number Diff line change
Expand Up @@ -127,11 +127,7 @@ getextmntent(const char *path, struct extmnttab *entry, struct stat64 *statbuf)
}


#ifdef HAVE_SETMNTENT
if ((fp = setmntent(MNTTAB, "re")) == NULL) {
#else
if ((fp = fopen(MNTTAB, "re")) == NULL) {
#endif
(void) fprintf(stderr, "cannot open %s\n", MNTTAB);
return (-1);
}
Expand Down
Loading

0 comments on commit 445fb07

Please sign in to comment.