summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'sys-fs/zfs/files/2.0.0_rc2-exports-d-permissions.patch')
-rw-r--r--sys-fs/zfs/files/2.0.0_rc2-exports-d-permissions.patch189
1 files changed, 189 insertions, 0 deletions
diff --git a/sys-fs/zfs/files/2.0.0_rc2-exports-d-permissions.patch b/sys-fs/zfs/files/2.0.0_rc2-exports-d-permissions.patch
new file mode 100644
index 000000000000..4acaf465a7bc
--- /dev/null
+++ b/sys-fs/zfs/files/2.0.0_rc2-exports-d-permissions.patch
@@ -0,0 +1,189 @@
+From fe413a4d901a243d98cfef16ea330f7114a104ea Mon Sep 17 00:00:00 2001
+From: George Wilson <george.wilson@delphix.com>
+Date: Tue, 15 Sep 2020 22:57:16 -0400
+Subject: [PATCH] zpool command complains about /etc/exports.d
+
+If the /etc/exports.d directory does not exist, then we should only
+create it when we're performing an action which already requires root
+privileges.
+
+This commit moves the directory creation to the enable/disable code
+path which ensures that we have the appropriate privileges.
+
+Signed-off-by: George Wilson <gwilson@delphix.com>
+Closes #10785
+---
+ lib/libshare/os/freebsd/nfs.c | 36 +++++++++++-------
+ lib/libshare/os/linux/nfs.c | 71 ++++++++++++++++++++---------------
+ 2 files changed, 64 insertions(+), 43 deletions(-)
+
+diff --git a/lib/libshare/os/freebsd/nfs.c b/lib/libshare/os/freebsd/nfs.c
+index 65f3b11bf9b..5951b9eafa2 100644
+--- a/lib/libshare/os/freebsd/nfs.c
++++ b/lib/libshare/os/freebsd/nfs.c
+@@ -228,21 +228,33 @@ nfs_copy_entries(char *filename, const char *mountpoint)
+ int error = SA_OK;
+ char *line;
+
+- /*
+- * If the file doesn't exist then there is nothing more
+- * we need to do.
+- */
+ FILE *oldfp = fopen(ZFS_EXPORTS_FILE, "r");
+- if (oldfp == NULL)
+- return (SA_OK);
+-
+ FILE *newfp = fopen(filename, "w+");
++ if (newfp == NULL) {
++ fprintf(stderr, "failed to open %s file: %s", filename,
++ strerror(errno));
++ fclose(oldfp);
++ return (SA_SYSTEM_ERR);
++ }
+ fputs(FILE_HEADER, newfp);
+- while ((line = zgetline(oldfp, mountpoint)) != NULL)
+- fprintf(newfp, "%s\n", line);
+- if (ferror(oldfp) != 0) {
+- error = ferror(oldfp);
++
++ /*
++ * The ZFS_EXPORTS_FILE may not exist yet. If that's the
++ * case then just write out the new file.
++ */
++ if (oldfp != NULL) {
++ while ((line = zgetline(oldfp, mountpoint)) != NULL)
++ fprintf(newfp, "%s\n", line);
++ if (ferror(oldfp) != 0) {
++ error = ferror(oldfp);
++ }
++ if (fclose(oldfp) != 0) {
++ fprintf(stderr, "Unable to close file %s: %s\n",
++ filename, strerror(errno));
++ error = error != 0 ? error : SA_SYSTEM_ERR;
++ }
+ }
++
+ if (error == 0 && ferror(newfp) != 0) {
+ error = ferror(newfp);
+ }
+@@ -252,8 +264,6 @@ nfs_copy_entries(char *filename, const char *mountpoint)
+ filename, strerror(errno));
+ error = error != 0 ? error : SA_SYSTEM_ERR;
+ }
+- fclose(oldfp);
+-
+ return (error);
+ }
+
+diff --git a/lib/libshare/os/linux/nfs.c b/lib/libshare/os/linux/nfs.c
+index a6a9b33d765..1efa321b7bc 100644
+--- a/lib/libshare/os/linux/nfs.c
++++ b/lib/libshare/os/linux/nfs.c
+@@ -393,6 +393,14 @@ static char *
+ nfs_init_tmpfile(void)
+ {
+ char *tmpfile = NULL;
++ struct stat sb;
++
++ if (stat(ZFS_EXPORTS_DIR, &sb) < 0 &&
++ mkdir(ZFS_EXPORTS_DIR, 0755) < 0) {
++ fprintf(stderr, "failed to create %s: %s\n",
++ ZFS_EXPORTS_DIR, strerror(errno));
++ return (NULL);
++ }
+
+ if (asprintf(&tmpfile, "%s%s", ZFS_EXPORTS_FILE, ".XXXXXXXX") == -1) {
+ fprintf(stderr, "Unable to allocate temporary file\n");
+@@ -481,36 +489,49 @@ nfs_copy_entries(char *filename, const char *mountpoint)
+ size_t buflen = 0;
+ int error = SA_OK;
+
+- /*
+- * If the file doesn't exist then there is nothing more
+- * we need to do.
+- */
+ FILE *oldfp = fopen(ZFS_EXPORTS_FILE, "r");
+- if (oldfp == NULL)
+- return (SA_OK);
+-
+ FILE *newfp = fopen(filename, "w+");
++ if (newfp == NULL) {
++ fprintf(stderr, "failed to open %s file: %s", filename,
++ strerror(errno));
++ fclose(oldfp);
++ return (SA_SYSTEM_ERR);
++ }
+ fputs(FILE_HEADER, newfp);
+- while ((getline(&buf, &buflen, oldfp)) != -1) {
+- char *space = NULL;
+
+- if (buf[0] == '\n' || buf[0] == '#')
+- continue;
+-
+- if ((space = strchr(buf, ' ')) != NULL) {
+- int mountpoint_len = strlen(mountpoint);
++ /*
++ * The ZFS_EXPORTS_FILE may not exist yet. If that's the
++ * case then just write out the new file.
++ */
++ if (oldfp != NULL) {
++ while (getline(&buf, &buflen, oldfp) != -1) {
++ char *space = NULL;
+
+- if (space - buf == mountpoint_len &&
+- strncmp(mountpoint, buf, mountpoint_len) == 0) {
++ if (buf[0] == '\n' || buf[0] == '#')
+ continue;
++
++ if ((space = strchr(buf, ' ')) != NULL) {
++ int mountpoint_len = strlen(mountpoint);
++
++ if (space - buf == mountpoint_len &&
++ strncmp(mountpoint, buf,
++ mountpoint_len) == 0) {
++ continue;
++ }
+ }
++ fputs(buf, newfp);
+ }
+- fputs(buf, newfp);
+- }
+
+- if (oldfp != NULL && ferror(oldfp) != 0) {
+- error = ferror(oldfp);
++ if (ferror(oldfp) != 0) {
++ error = ferror(oldfp);
++ }
++ if (fclose(oldfp) != 0) {
++ fprintf(stderr, "Unable to close file %s: %s\n",
++ filename, strerror(errno));
++ error = error != 0 ? error : SA_SYSTEM_ERR;
++ }
+ }
++
+ if (error == 0 && ferror(newfp) != 0) {
+ error = ferror(newfp);
+ }
+@@ -521,8 +542,6 @@ nfs_copy_entries(char *filename, const char *mountpoint)
+ filename, strerror(errno));
+ error = error != 0 ? error : SA_SYSTEM_ERR;
+ }
+- fclose(oldfp);
+-
+ return (error);
+ }
+
+@@ -701,13 +720,5 @@ static const sa_share_ops_t nfs_shareops = {
+ void
+ libshare_nfs_init(void)
+ {
+- struct stat sb;
+-
+ nfs_fstype = register_fstype("nfs", &nfs_shareops);
+-
+- if (stat(ZFS_EXPORTS_DIR, &sb) < 0 &&
+- mkdir(ZFS_EXPORTS_DIR, 0755) < 0) {
+- fprintf(stderr, "failed to create %s: %s\n",
+- ZFS_EXPORTS_DIR, strerror(errno));
+- }
+ }