changeset 12630:82f984d7a241

lib-storage: Merged returning dir mode into mailbox_list_get_[root_]permissions().
author Timo Sirainen <tss@iki.fi>
date Tue, 01 Feb 2011 20:59:21 +0200
parents 02370eda76f8
children 7701fb66d82a
files src/lib-storage/index/dbox-multi/mdbox-map.c src/lib-storage/list/mailbox-list-fs.c src/lib-storage/list/mailbox-list-maildir.c src/lib-storage/list/subscription-file.c src/lib-storage/mail-storage.c src/lib-storage/mailbox-list.c src/lib-storage/mailbox-list.h src/lib-storage/mailbox-uidvalidity.c src/plugins/acl/acl-backend-vfile-acllist.c src/plugins/acl/acl-backend-vfile.c src/plugins/lazy-expunge/lazy-expunge-plugin.c src/plugins/quota/quota-maildir.c
diffstat 12 files changed, 100 insertions(+), 143 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/dbox-multi/mdbox-map.c	Tue Feb 01 20:41:54 2011 +0200
+++ b/src/lib-storage/index/dbox-multi/mdbox-map.c	Tue Feb 01 20:59:21 2011 +0200
@@ -50,6 +50,7 @@
 {
 	struct mdbox_map *map;
 	const char *root, *index_root;
+	mode_t dir_mode;
 
 	root = mailbox_list_get_path(root_list, NULL,
 				     MAILBOX_LIST_PATH_TYPE_DIR);
@@ -77,7 +78,8 @@
 	map->ref_ext_id = mail_index_ext_register(map->index, "ref", 0,
 				sizeof(uint16_t), sizeof(uint16_t));
 
-	mailbox_list_get_root_permissions(root_list, &map->create_mode,
+	mailbox_list_get_root_permissions(root_list,
+					  &map->create_mode, &dir_mode,
 					  &map->create_gid,
 					  &map->create_gid_origin);
 	mail_index_set_permissions(map->index, map->create_mode,
--- a/src/lib-storage/list/mailbox-list-fs.c	Tue Feb 01 20:41:54 2011 +0200
+++ b/src/lib-storage/list/mailbox-list-fs.c	Tue Feb 01 20:59:21 2011 +0200
@@ -265,7 +265,7 @@
 			   enum mailbox_dir_create_type type)
 {
 	const char *path, *gid_origin, *p;
-	mode_t mode;
+	mode_t file_mode, dir_mode;
 	gid_t gid;
 	bool directory, create_parent_dir;
 	int ret;
@@ -284,8 +284,9 @@
 		path = t_strdup_until(path, p);
 	}
 
-	mailbox_list_get_root_dir_permissions(list, &mode, &gid, &gid_origin);
-	if (mkdir_parents_chgrp(path, mode, gid, gid_origin) == 0)
+	mailbox_list_get_root_permissions(list, &file_mode, &dir_mode,
+					  &gid, &gid_origin);
+	if (mkdir_parents_chgrp(path, dir_mode, gid, gid_origin) == 0)
 		return 0;
 	else if (errno == EEXIST) {
 		if (create_parent_dir)
@@ -448,7 +449,7 @@
 	const char *p, *origin;
 	enum mailbox_list_path_type path_type, alt_path_type;
 	struct stat st;
-	mode_t mode;
+	mode_t file_mode, dir_mode;
 	gid_t gid;
 	bool rmdir_parent = FALSE;
 
@@ -487,10 +488,10 @@
 	/* create the hierarchy */
 	p = strrchr(newpath, '/');
 	if (p != NULL) {
-		mailbox_list_get_root_dir_permissions(newlist, &mode,
-						      &gid, &origin);
+		mailbox_list_get_root_permissions(newlist, &file_mode,
+						  &dir_mode, &gid, &origin);
 		p = t_strdup_until(newpath, p);
-		if (mkdir_parents_chgrp(p, mode, gid, origin) < 0 &&
+		if (mkdir_parents_chgrp(p, dir_mode, gid, origin) < 0 &&
 		    errno != EEXIST) {
 			if (mailbox_list_set_error_from_errno(oldlist))
 				return -1;
--- a/src/lib-storage/list/mailbox-list-maildir.c	Tue Feb 01 20:41:54 2011 +0200
+++ b/src/lib-storage/list/mailbox-list-maildir.c	Tue Feb 01 20:59:21 2011 +0200
@@ -265,17 +265,18 @@
 				       const char *dir)
 {
 	const char *path, *gid_origin;
-	mode_t mode, old_mask;
+	mode_t file_mode, dir_mode, old_mask;
 	gid_t gid;
 	int fd;
 
 	/* Maildir++ spec wants that maildirfolder named file is created for
 	   all subfolders. */
-	mailbox_list_get_root_permissions(list, &mode, &gid, &gid_origin);
+	mailbox_list_get_root_permissions(list, &file_mode, &dir_mode,
+					  &gid, &gid_origin);
 
 	path = t_strconcat(dir, "/" MAILDIR_SUBFOLDER_FILENAME, NULL);
 	old_mask = umask(0);
-	fd = open(path, O_CREAT | O_WRONLY, mode);
+	fd = open(path, O_CREAT | O_WRONLY, file_mode);
 	umask(old_mask);
 	if (fd != -1) {
 		/* ok */
@@ -310,7 +311,7 @@
 				enum mailbox_dir_create_type type)
 {
 	const char *path, *root_dir, *gid_origin, *p;
-	mode_t mode;
+	mode_t file_mode, dir_mode;
 	gid_t gid;
 	bool create_parent_dir;
 
@@ -334,9 +335,9 @@
 
 	root_dir = mailbox_list_get_path(list, NULL,
 					 MAILBOX_LIST_PATH_TYPE_MAILBOX);
-	mailbox_list_get_root_dir_permissions(list, &mode,
-					      &gid, &gid_origin);
-	if (mkdir_parents_chgrp(path, mode, gid, gid_origin) == 0) {
+	mailbox_list_get_root_permissions(list, &file_mode, &dir_mode,
+					  &gid, &gid_origin);
+	if (mkdir_parents_chgrp(path, dir_mode, gid, gid_origin) == 0) {
 		/* ok */
 	} else if (errno == EEXIST) {
 		if (create_parent_dir)
--- a/src/lib-storage/list/subscription-file.c	Tue Feb 01 20:41:54 2011 +0200
+++ b/src/lib-storage/list/subscription-file.c	Tue Feb 01 20:59:21 2011 +0200
@@ -94,7 +94,7 @@
 	struct istream *input;
 	struct ostream *output;
 	int fd_in, fd_out;
-	mode_t mode;
+	mode_t file_mode, dir_mode;
 	gid_t gid;
 	bool found, changed = FALSE, failed = FALSE;
 
@@ -108,15 +108,17 @@
 	dotlock_set.timeout = SUBSCRIPTION_FILE_LOCK_TIMEOUT;
 	dotlock_set.stale_timeout = SUBSCRIPTION_FILE_CHANGE_TIMEOUT;
 
-	mailbox_list_get_root_permissions(list, &mode, &gid, &origin);
+	mailbox_list_get_root_permissions(list, &file_mode, &dir_mode,
+					  &gid, &origin);
 	fd_out = file_dotlock_open_group(&dotlock_set, path, 0,
-					 mode, gid, origin, &dotlock);
+					 file_mode, gid, origin, &dotlock);
 	if (fd_out == -1 && errno == ENOENT) {
 		/* directory hasn't been created yet. */
 		if (mailbox_list_create_parent_dir(list, NULL, path) < 0)
 			return -1;
 		fd_out = file_dotlock_open_group(&dotlock_set, path, 0,
-						 mode, gid, origin, &dotlock);
+						 file_mode, gid,
+						 origin, &dotlock);
 	}
 	if (fd_out == -1) {
 		if (errno == EAGAIN) {
--- a/src/lib-storage/mail-storage.c	Tue Feb 01 20:41:54 2011 +0200
+++ b/src/lib-storage/mail-storage.c	Tue Feb 01 20:59:21 2011 +0200
@@ -216,7 +216,7 @@
 			 enum mail_storage_flags flags, const char **error_r)
 {
 	const char *root_dir, *origin, *error;
-	mode_t mode;
+	mode_t file_mode, dir_mode;
 	gid_t gid;
 	bool autocreate;
 	int ret;
@@ -247,8 +247,9 @@
 		return ret;
 
 	/* we need to create the root directory. */
-	mailbox_list_get_root_dir_permissions(list, &mode, &gid, &origin);
-	if (mkdir_parents_chgrp(root_dir, mode, gid, origin) < 0 &&
+	mailbox_list_get_root_permissions(list, &file_mode, &dir_mode,
+					  &gid, &origin);
+	if (mkdir_parents_chgrp(root_dir, dir_mode, gid, origin) < 0 &&
 	    errno != EEXIST) {
 		*error_r = mail_error_create_eacces_msg("mkdir", root_dir);
 		return -1;
@@ -1480,8 +1481,7 @@
 
 static void mailbox_get_permissions_if_not_set(struct mailbox *box)
 {
-	const char *origin, *dir_origin;
-	gid_t dir_gid;
+	const char *origin;
 
 	if (box->_perm.file_create_mode != 0)
 		return;
@@ -1496,11 +1496,9 @@
 
 	mailbox_list_get_permissions(box->list, box->name,
 				     &box->_perm.file_create_mode,
+				     &box->_perm.dir_create_mode,
 				     &box->_perm.file_create_gid, &origin);
 	box->_perm.file_create_gid_origin = p_strdup(box->pool, origin);
-	mailbox_list_get_dir_permissions(box->list, box->name,
-					 &box->_perm.dir_create_mode,
-					 &dir_gid, &dir_origin);
 }
 
 const struct mailbox_permissions *mailbox_get_permissions(struct mailbox *box)
--- a/src/lib-storage/mailbox-list.c	Tue Feb 01 20:41:54 2011 +0200
+++ b/src/lib-storage/mailbox-list.c	Tue Feb 01 20:59:21 2011 +0200
@@ -519,8 +519,8 @@
 	return list->v.get_hierarchy_sep(list);
 }
 
-static void
-mailbox_list_get_permissions_full(struct mailbox_list *list, const char *name,
+void mailbox_list_get_permissions(struct mailbox_list *list,
+				  const char *name,
 				  mode_t *file_mode_r, mode_t *dir_mode_r,
 				  gid_t *gid_r, const char **gid_origin_r)
 {
@@ -546,10 +546,9 @@
 		}
 		if (name != NULL) {
 			/* return defaults */
-			mailbox_list_get_permissions_full(list, NULL,
-							  file_mode_r,
-							  dir_mode_r, gid_r,
-							  gid_origin_r);
+			mailbox_list_get_permissions(list, NULL,
+						     file_mode_r, dir_mode_r,
+						     gid_r, gid_origin_r);
 			return;
 		}
 	} else {
@@ -597,61 +596,19 @@
 	}
 }
 
-void mailbox_list_get_permissions(struct mailbox_list *list,
-				  const char *name,
-				  mode_t *mode_r, gid_t *gid_r,
-				  const char **gid_origin_r)
+void mailbox_list_get_root_permissions(struct mailbox_list *list,
+				       mode_t *file_mode_r, mode_t *dir_mode_r,
+				       gid_t *gid_r, const char **gid_origin_r)
 {
-	mode_t dir_mode;
-
-	i_assert(name != NULL);
-
-	mailbox_list_get_permissions_full(list, name, mode_r, &dir_mode, gid_r,
-					  gid_origin_r);
-}
-
-void mailbox_list_get_root_permissions(struct mailbox_list *list,
-				       mode_t *mode_r, gid_t *gid_r,
-				       const char **gid_origin_r)
-{
-	mode_t dir_mode;
-
 	if (list->file_create_mode != (mode_t)-1) {
-		*mode_r = list->file_create_mode;
+		*file_mode_r = list->file_create_mode;
+		*dir_mode_r = list->dir_create_mode;
 		*gid_r = list->file_create_gid;
 		*gid_origin_r = list->file_create_gid_origin;
 	} else {
-		mailbox_list_get_permissions_full(list, NULL, mode_r, &dir_mode,
-						  gid_r, gid_origin_r);
-	}
-}
-
-void mailbox_list_get_dir_permissions(struct mailbox_list *list,
-				      const char *name,
-				      mode_t *mode_r, gid_t *gid_r,
-				      const char **gid_origin_r)
-{
-	mode_t file_mode;
-
-	i_assert(name != NULL);
-
-	mailbox_list_get_permissions_full(list, name, &file_mode,
-					  mode_r, gid_r, gid_origin_r);
-}
-
-void mailbox_list_get_root_dir_permissions(struct mailbox_list *list,
-					   mode_t *mode_r, gid_t *gid_r,
-					   const char **gid_origin_r)
-{
-	mode_t file_mode;
-
-	if (list->dir_create_mode != (mode_t)-1) {
-		*mode_r = list->dir_create_mode;
-		*gid_r = list->file_create_gid;
-		*gid_origin_r = list->file_create_gid_origin;
-	} else {
-		mailbox_list_get_permissions_full(list, NULL, &file_mode,
-						  mode_r, gid_r, gid_origin_r);
+		mailbox_list_get_permissions(list, NULL,
+					     file_mode_r, dir_mode_r,
+					     gid_r, gid_origin_r);
 	}
 }
 
@@ -724,10 +681,11 @@
 {
 	const char *expanded, *unexpanded, *root_dir, *p, *origin;
 	struct stat st;
-	mode_t mode;
+	mode_t file_mode, dir_mode;
 	gid_t gid;
 
-	mailbox_list_get_root_dir_permissions(list, &mode, &gid, &origin);
+	mailbox_list_get_root_permissions(list, &file_mode, &dir_mode,
+					  &gid, &origin);
 
 	/* get the directory path up to last %variable. for example
 	   unexpanded path may be "/var/mail/%d/%2n/%n/Maildir", and we want
@@ -762,7 +720,7 @@
 				return -1;
 			}
 		}
-		if (gid == (gid_t)-1 && (mode & S_ISGID) == 0) {
+		if (gid == (gid_t)-1 && (dir_mode & S_ISGID) == 0) {
 			/* change the group for user directories */
 			gid = getegid();
 		}
@@ -770,7 +728,7 @@
 
 	/* the rest of the directories exist only for one user. create them
 	   with default directory permissions */
-	if (mkdir_parents_chgrp(path, mode, gid, origin) < 0 &&
+	if (mkdir_parents_chgrp(path, dir_mode, gid, origin) < 0 &&
 	    errno != EEXIST) {
 		mailbox_list_set_critical(list, "mkdir(%s) failed: %m", path);
 		return -1;
@@ -1220,7 +1178,7 @@
 static bool mailbox_list_init_changelog(struct mailbox_list *list)
 {
 	const char *path;
-	mode_t mode;
+	mode_t file_mode, dir_mode;
 	gid_t gid;
 	const char *gid_origin;
 
@@ -1236,8 +1194,9 @@
 	path = t_strconcat(path, "/"MAILBOX_LOG_FILE_NAME, NULL);
 	list->changelog = mailbox_log_alloc(path);
 
-	mailbox_list_get_root_permissions(list, &mode, &gid, &gid_origin);
-	mailbox_log_set_permissions(list->changelog, mode, gid, gid_origin);
+	mailbox_list_get_root_permissions(list, &file_mode, &dir_mode,
+					  &gid, &gid_origin);
+	mailbox_log_set_permissions(list->changelog, dir_mode, gid, gid_origin);
 	return TRUE;
 }
 
@@ -1515,15 +1474,16 @@
 {
 	const char *p, *dir, *origin;
 	gid_t gid;
-	mode_t mode;
+	mode_t file_mode, dir_mode;
 
 	p = strrchr(path, '/');
 	if (p == NULL)
 		return 0;
 
 	dir = t_strdup_until(path, p);
-	mailbox_list_get_dir_permissions(list, mailbox, &mode, &gid, &origin);
-	if (mkdir_parents_chgrp(dir, mode, gid, origin) < 0 &&
+	mailbox_list_get_permissions(list, mailbox, &file_mode, &dir_mode,
+				     &gid, &origin);
+	if (mkdir_parents_chgrp(dir, dir_mode, gid, origin) < 0 &&
 	    errno != EEXIST) {
 		mailbox_list_set_critical(list, "mkdir_parents(%s) failed: %m",
 					  dir);
@@ -1536,7 +1496,7 @@
 					  const char *name)
 {
 	const char *root_dir, *index_dir, *parent_dir, *p, *origin;
-	mode_t mode;
+	mode_t file_mode, dir_mode;
 	gid_t gid;
 	unsigned int n = 0;
 
@@ -1549,13 +1509,13 @@
 		return 0;
 
 	if (name == NULL) {
-		mailbox_list_get_root_dir_permissions(list, &mode,
-						      &gid, &origin);
+		mailbox_list_get_root_permissions(list, &file_mode, &dir_mode,
+						  &gid, &origin);
 	} else {
-		mailbox_list_get_dir_permissions(list, name, &mode,
-						 &gid, &origin);
+		mailbox_list_get_permissions(list, name, &file_mode, &dir_mode,
+					     &gid, &origin);
 	}
-	while (mkdir_chgrp(index_dir, mode, gid, origin) < 0) {
+	while (mkdir_chgrp(index_dir, dir_mode, gid, origin) < 0) {
 		if (errno == EEXIST)
 			break;
 
--- a/src/lib-storage/mailbox-list.h	Tue Feb 01 20:41:54 2011 +0200
+++ b/src/lib-storage/mailbox-list.h	Tue Feb 01 20:59:21 2011 +0200
@@ -165,25 +165,17 @@
 				      struct mail_storage **storage);
 char mailbox_list_get_hierarchy_sep(struct mailbox_list *list);
 
-/* Returns the mode and GID that should be used when creating new files to
-   the specified mailbox or to mailbox list root. (gid_t)-1 is
-   returned if it's not necessary to change the default gid. */
-void mailbox_list_get_permissions(struct mailbox_list *list,
-				  const char *name,
-				  mode_t *mode_r, gid_t *gid_r,
-				  const char **gid_origin_r);
+/* Returns the mode and GID that should be used when creating new files and
+   directories to the specified mailbox. (gid_t)-1 is returned if it's not
+   necessary to change the default gid. */
+void mailbox_list_get_permissions(struct mailbox_list *list, const char *name,
+				  mode_t *file_mode_r, mode_t *dir_mode_r,
+				  gid_t *gid_r, const char **gid_origin_r);
+/* Like mailbox_list_get_permissions(), but for creating files/dirs to the
+   mail root directory (or even the root dir itself). */
 void mailbox_list_get_root_permissions(struct mailbox_list *list,
-				       mode_t *mode_r, gid_t *gid_r,
-				       const char **gid_origin_r);
-/* Like mailbox_list_get_permissions(), but add execute-bits for mode
-   if either read or write bit is set (e.g. 0640 -> 0750). */
-void mailbox_list_get_dir_permissions(struct mailbox_list *list,
-				      const char *name,
-				      mode_t *mode_r, gid_t *gid_r,
-				      const char **gid_origin_r);
-void mailbox_list_get_root_dir_permissions(struct mailbox_list *list,
-					   mode_t *mode_r, gid_t *gid_r,
-					   const char **gid_origin_r);
+				       mode_t *file_mode_r, mode_t *dir_mode_r,
+				       gid_t *gid_r, const char **gid_origin_r);
 /* Create path's parent directory with proper permissions. Since most
    directories are created lazily, this function can be used to easily create
    them whenever file creation fails with ENOENT. */
--- a/src/lib-storage/mailbox-uidvalidity.c	Tue Feb 01 20:41:54 2011 +0200
+++ b/src/lib-storage/mailbox-uidvalidity.c	Tue Feb 01 20:59:21 2011 +0200
@@ -37,13 +37,14 @@
 {
 	char buf[8+1];
 	int fd;
-	mode_t mode, old_mask;
+	mode_t file_mode, dir_mode, old_mask;
 	gid_t gid;
 	const char *gid_origin;
 
-	mailbox_list_get_root_permissions(list, &mode, &gid, &gid_origin);
+	mailbox_list_get_root_permissions(list, &file_mode, &dir_mode,
+					  &gid, &gid_origin);
 
-	old_mask = umask(0666 & ~mode);
+	old_mask = umask(0666 & ~file_mode);
 	fd = open(path, O_RDWR | O_CREAT, 0666);
 	umask(old_mask);
 	if (fd == -1) {
--- a/src/plugins/acl/acl-backend-vfile-acllist.c	Tue Feb 01 20:41:54 2011 +0200
+++ b/src/plugins/acl/acl-backend-vfile-acllist.c	Tue Feb 01 20:59:21 2011 +0200
@@ -205,7 +205,7 @@
 	struct ostream *output;
 	struct stat st;
 	string_t *path;
-	mode_t mode;
+	mode_t file_mode, dir_mode;
 	gid_t gid;
 	int fd, ret;
 
@@ -227,13 +227,14 @@
 	/* Build it into a temporary file and rename() over. There's no need
 	   to use locking, because even if multiple processes are rebuilding
 	   the file at the same time the result should be the same. */
-	mailbox_list_get_root_permissions(list, &mode, &gid, &origin);
-	fd = safe_mkstemp_group(path, mode, gid, origin);
+	mailbox_list_get_root_permissions(list, &file_mode, &dir_mode,
+					  &gid, &origin);
+	fd = safe_mkstemp_group(path, file_mode, gid, origin);
 	if (fd == -1 && errno == ENOENT) {
 		if (mailbox_list_create_parent_dir(backend->backend.list, NULL,
 						   str_c(path)) < 0)
 			return -1;
-		fd = safe_mkstemp_group(path, mode, gid, origin);
+		fd = safe_mkstemp_group(path, file_mode, gid, origin);
 	}
 	if (fd == -1) {
 		if (errno == EACCES) {
--- a/src/plugins/acl/acl-backend-vfile.c	Tue Feb 01 20:41:54 2011 +0200
+++ b/src/plugins/acl/acl-backend-vfile.c	Tue Feb 01 20:59:21 2011 +0200
@@ -900,7 +900,7 @@
 {
 	struct acl_object *_aclobj = &aclobj->aclobj;
 	const char *gid_origin;
-	mode_t mode;
+	mode_t file_mode, dir_mode;
 	gid_t gid;
 	int fd;
 
@@ -912,9 +912,9 @@
 
 	/* first lock the ACL file */
 	mailbox_list_get_permissions(_aclobj->backend->list, _aclobj->name,
-				     &mode, &gid, &gid_origin);
+				     &file_mode, &dir_mode, &gid, &gid_origin);
 	fd = file_dotlock_open_group(&dotlock_set, aclobj->local_path, 0,
-				     mode, gid, gid_origin, dotlock_r);
+				     file_mode, gid, gid_origin, dotlock_r);
 	if (fd == -1) {
 		i_error("file_dotlock_open(%s) failed: %m", aclobj->local_path);
 		return -1;
--- a/src/plugins/lazy-expunge/lazy-expunge-plugin.c	Tue Feb 01 20:41:54 2011 +0200
+++ b/src/plugins/lazy-expunge/lazy-expunge-plugin.c	Tue Feb 01 20:59:21 2011 +0200
@@ -235,14 +235,15 @@
 	struct mailbox *dest_box;
 	const char *dir, *origin;
 	enum mail_error error;
-	mode_t mode;
+	mode_t file_mode, dir_mode;
 	gid_t gid;
 	int ret;
 
 	/* make sure the destination root directory exists */
-	mailbox_list_get_root_dir_permissions(dest_list, &mode, &gid, &origin);
+	mailbox_list_get_root_permissions(dest_list, &file_mode, &dir_mode,
+					  &gid, &origin);
 	dir = mailbox_list_get_path(dest_list, NULL, MAILBOX_LIST_PATH_TYPE_DIR);
-	if (mkdir_parents_chgrp(dir, mode, gid, origin) < 0 &&
+	if (mkdir_parents_chgrp(dir, dir_mode, gid, origin) < 0 &&
 	    errno != EEXIST) {
 		mail_storage_set_critical(src_box->storage,
 			"mkdir_parents(%s) failed: %m", dir);
--- a/src/plugins/quota/quota-maildir.c	Tue Feb 01 20:41:54 2011 +0200
+++ b/src/plugins/quota/quota-maildir.c	Tue Feb 01 20:59:21 2011 +0200
@@ -222,18 +222,18 @@
 	struct mail_namespace *const *namespaces;
 	unsigned int i, count;
 	struct dotlock *dotlock;
-	const char *p, *dir, *gid_origin, *dir_gid_origin;
+	const char *p, *dir, *gid_origin;
 	string_t *str;
-	mode_t mode, dir_mode;
-	gid_t gid, dir_gid;
+	mode_t file_mode, dir_mode;
+	gid_t gid;
 	int fd;
 
 	i_assert(root->fd == -1);
 
 	/* figure out what permissions we should use for maildirsize.
 	   use the inbox namespace's permissions if possible. */
-	mode = 0600; dir_mode = 0700; dir_gid_origin = gid_origin = "default";
-	gid = dir_gid = (gid_t)-1;
+	file_mode = 0600; dir_mode = 0700; gid_origin = "default";
+	gid = (gid_t)-1;
 	namespaces = array_get(&root->root.quota->namespaces, &count);
 	i_assert(count > 0);
 	for (i = 0; i < count; i++) {
@@ -241,10 +241,8 @@
 			continue;
 
 		mailbox_list_get_root_permissions(namespaces[i]->list,
-						  &mode, &gid, &gid_origin);
-		mailbox_list_get_root_dir_permissions(namespaces[i]->list,
-						      &dir_mode, &dir_gid,
-						      &dir_gid_origin);
+						  &file_mode, &dir_mode,
+						  &gid, &gid_origin);
 		break;
 	}
 
@@ -252,20 +250,20 @@
 	dotlock_settings.nfs_flush = set->mail_nfs_storage;
 	fd = file_dotlock_open_group(&dotlock_settings, path,
 				     DOTLOCK_CREATE_FLAG_NONBLOCK,
-				     mode, gid, gid_origin, &dotlock);
+				     file_mode, gid, gid_origin, &dotlock);
 	if (fd == -1 && errno == ENOENT) {
 		/* the control directory doesn't exist yet? create it */
 		p = strrchr(path, '/');
 		dir = t_strdup_until(path, p);
-		if (mkdir_parents_chgrp(dir, dir_mode, dir_gid,
-					dir_gid_origin) < 0 &&
+		if (mkdir_parents_chgrp(dir, dir_mode, gid, gid_origin) < 0 &&
 		    errno != EEXIST) {
 			i_error("mkdir_parents(%s) failed: %m", dir);
 			return -1;
 		}
 		fd = file_dotlock_open_group(&dotlock_settings, path,
 					     DOTLOCK_CREATE_FLAG_NONBLOCK,
-					     mode, gid, gid_origin, &dotlock);
+					     file_mode, gid, gid_origin,
+					     &dotlock);
 	}
 	if (fd == -1) {
 		if (errno == EAGAIN) {