diff --git a/src/lib-sieve/plugins/include/ext-include-common.c b/src/lib-sieve/plugins/include/ext-include-common.c
index f9eac908c8704da14347059fabff2d9a9de0da09..479ae5687b5dddf6268f31111fcb7531183453d4 100644
--- a/src/lib-sieve/plugins/include/ext-include-common.c
+++ b/src/lib-sieve/plugins/include/ext-include-common.c
@@ -142,11 +142,11 @@ ext_include_get_script_storage(const struct sieve_extension *ext,
 
 	switch (location) {
 	case EXT_INCLUDE_LOCATION_PERSONAL:
-		if (ctx->personal_storage == NULL) {
-			ctx->personal_storage =
-				sieve_storage_create_personal(svinst, NULL, 0,
-							      error_code_r);
-		}
+		if (ctx->personal_storage == NULL &&
+		    sieve_storage_create_personal(svinst, NULL, 0,
+						  &ctx->personal_storage,
+						  error_code_r) < 0)
+			return NULL;
 		return ctx->personal_storage;
 	case EXT_INCLUDE_LOCATION_GLOBAL:
 		if (ctx->global_location == NULL) {
diff --git a/src/lib-sieve/sieve-storage.c b/src/lib-sieve/sieve-storage.c
index 9db3a4ade61890b21edd234ad3ef41e2c5211893..8c3588ca95e5cbbac02085ab1fdc5e1d97bfe2d5 100644
--- a/src/lib-sieve/sieve-storage.c
+++ b/src/lib-sieve/sieve-storage.c
@@ -398,10 +398,11 @@ int sieve_storage_create(struct sieve_instance *svinst, const char *location,
 				  storage_r, error_code_r);
 }
 
-static struct sieve_storage *
+static int
 sieve_storage_do_create_personal(struct sieve_instance *svinst,
 				 struct mail_user *user,
 				 enum sieve_storage_flags flags,
+				 struct sieve_storage **storage_r,
 				 enum sieve_error *error_code_r)
 {
 	struct sieve_storage *storage = NULL;
@@ -421,14 +422,14 @@ sieve_storage_do_create_personal(struct sieve_instance *svinst,
 			e_debug(svinst->event, "storage: "
 				"Personal storage is disabled (sieve=\"\")");
 			*error_code_r = SIEVE_ERROR_NOT_FOUND;
-			return NULL;
+			return -1;
 		}
 
 		data = set_sieve;
 		if ((ret = sieve_storage_driver_parse(svinst, &data,
 						      &sieve_class)) < 0) {
 			*error_code_r = SIEVE_ERROR_TEMP_FAILURE;
-			return NULL;
+			return -1;
 		}
 
 		if (ret > 0) {
@@ -436,7 +437,7 @@ sieve_storage_do_create_personal(struct sieve_instance *svinst,
 			if (sieve_storage_init(svinst, sieve_class, data,
 					       flags, TRUE,
 					       &storage, error_code_r) < 0)
-				return NULL;
+				return -1;
 		}
 
 		/* No driver name */
@@ -445,12 +446,12 @@ sieve_storage_do_create_personal(struct sieve_instance *svinst,
 	if (storage == NULL) {
 		if (sieve_file_storage_init_default(svinst, set_sieve, flags,
 						    &storage, error_code_r) < 0)
-			return NULL;
+			return -1;
 		i_assert(storage != NULL);
 	}
 
 	if (storage == NULL)
-		return NULL;
+		return -1;
 
 	(void)sieve_storage_sync_init(storage, user);
 
@@ -478,19 +479,22 @@ sieve_storage_do_create_personal(struct sieve_instance *svinst,
 			"Script count limit: %llu scripts",
 			(unsigned long long int) storage->max_scripts);
 	}
-	return storage;
+	*storage_r = storage;
+	return 0;
 }
 
-struct sieve_storage *
-sieve_storage_create_personal(struct sieve_instance *svinst,
-			      struct mail_user *user,
-			      enum sieve_storage_flags flags,
-			      enum sieve_error *error_code_r)
+int sieve_storage_create_personal(struct sieve_instance *svinst,
+				  struct mail_user *user,
+				  enum sieve_storage_flags flags,
+				  struct sieve_storage **storage_r,
+				  enum sieve_error *error_code_r)
 {
-	struct sieve_storage *storage;
+	struct sieve_storage *storage = NULL;
 	const char *set_enabled, *set_default, *set_default_name;
 	enum sieve_error error_code;
+	int ret;
 
+	*storage_r = NULL;
 	if (error_code_r != NULL)
 		*error_code_r = SIEVE_ERROR_NONE;
 	else
@@ -502,16 +506,16 @@ sieve_storage_create_personal(struct sieve_instance *svinst,
 		e_debug(svinst->event,
 			"Sieve is disabled for this user");
 		*error_code_r = SIEVE_ERROR_NOT_POSSIBLE;
-		return NULL;
+		return -1;
 	}
 
 	/* Determine location for default script */
 	set_default = sieve_setting_get(svinst, "sieve_default");
 
 	/* Attempt to locate user's main storage */
-	storage = sieve_storage_do_create_personal(svinst, user, flags,
-						   error_code_r);
-	if (storage != NULL) {
+	ret = sieve_storage_do_create_personal(svinst, user, flags,
+					       &storage, error_code_r);
+	if (ret == 0) {
 		/* Success; record default script location for later use */
 		storage->default_location =
 			p_strdup_empty(storage->pool, set_default);
@@ -548,8 +552,9 @@ sieve_storage_create_personal(struct sieve_instance *svinst,
 				"Trying default script location '%s'",
 				set_default);
 
-			if (sieve_storage_create(svinst, set_default, 0,
-						 &storage, error_code_r) < 0) {
+			ret = sieve_storage_create(svinst, set_default, 0,
+						   &storage, error_code_r);
+			if (ret < 0) {
 				switch (*error_code_r) {
 				case SIEVE_ERROR_NOT_FOUND:
 					e_debug(svinst->event, "storage: "
@@ -573,7 +578,8 @@ sieve_storage_create_personal(struct sieve_instance *svinst,
 		if (storage != NULL)
 			storage->is_default = TRUE;
 	}
-	return storage;
+	*storage_r = storage;
+	return ret;
 }
 
 void sieve_storage_ref(struct sieve_storage *storage)
diff --git a/src/lib-sieve/sieve-storage.h b/src/lib-sieve/sieve-storage.h
index a4ad973460f513974f9fc43ae520357604e0c95c..ffb25a0861ade4871cc591106eea094150ce9fbf 100644
--- a/src/lib-sieve/sieve-storage.h
+++ b/src/lib-sieve/sieve-storage.h
@@ -29,11 +29,11 @@ int sieve_storage_create(struct sieve_instance *svinst, const char *location,
 			 enum sieve_storage_flags flags,
 			 struct sieve_storage **storage_r,
 			 enum sieve_error *error_code_r);
-struct sieve_storage *
-sieve_storage_create_personal(struct sieve_instance *svinst,
-			      struct mail_user *user,
-			      enum sieve_storage_flags flags,
-			      enum sieve_error *error_code_r);
+int sieve_storage_create_personal(struct sieve_instance *svinst,
+				  struct mail_user *user,
+				  enum sieve_storage_flags flags,
+				  struct sieve_storage **storage_r,
+				  enum sieve_error *error_code_r);
 
 void sieve_storage_ref(struct sieve_storage *storage);
 void sieve_storage_unref(struct sieve_storage **_storage);
diff --git a/src/managesieve/managesieve-client.c b/src/managesieve/managesieve-client.c
index f6627d8acceee04b712786c73ca06e2805d2cdd6..3a23226fbeb23bab2305c1004b6341979c36bb38 100644
--- a/src/managesieve/managesieve-client.c
+++ b/src/managesieve/managesieve-client.c
@@ -71,10 +71,9 @@ client_get_storage(struct sieve_instance *svinst, struct event *event,
 
 	/* Open personal script storage */
 
-	storage = sieve_storage_create_personal(svinst, user,
-						SIEVE_STORAGE_FLAG_READWRITE,
-						&error_code);
-	if (storage == NULL) {
+	if (sieve_storage_create_personal(svinst, user,
+					  SIEVE_STORAGE_FLAG_READWRITE,
+					  &storage, &error_code) < 0) {
 		switch (error_code) {
 		case SIEVE_ERROR_NOT_POSSIBLE:
 			byemsg = "BYE \"Sieve processing is disabled for this user.\"\r\n";
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c b/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c
index c851e5f28e0c847cbd702f4c5c2a7273ec4b51ba..7d98d1e02a52faf55125212950c203e90b67632d 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c
@@ -116,9 +116,9 @@ doveadm_sieve_cmd_run(struct doveadm_mail_cmd_context *_ctx,
 		       user->set->mail_debug, &ctx->svinst) < 0)
 		return -1;
 
-	ctx->storage = sieve_storage_create_personal(
-		ctx->svinst, user, SIEVE_STORAGE_FLAG_READWRITE, &error_code);
-	if (ctx->storage == NULL) {
+	if (sieve_storage_create_personal(ctx->svinst, user,
+					  SIEVE_STORAGE_FLAG_READWRITE,
+					  &ctx->storage, &error_code) < 0) {
 		switch (error_code) {
 		case SIEVE_ERROR_NOT_POSSIBLE:
 			error_code = SIEVE_ERROR_NOT_FOUND;
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-sync.c b/src/plugins/doveadm-sieve/doveadm-sieve-sync.c
index 3d23e8e7602f1915abfa8c900e06c44e0c49bd9f..64c4d326e252d2ecca0308320df6b2cee1aa839b 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-sync.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-sync.c
@@ -98,10 +98,9 @@ mail_sieve_user_init(struct mail_user *user, struct sieve_storage **svstorage_r)
 		       user->set->mail_debug, &suser->svinst) < 0)
 		return -1;
 
-	suser->sieve_storage =
-		sieve_storage_create_personal(suser->svinst, user,
-					      storage_flags, &error_code);
-	if (suser->sieve_storage == NULL) {
+	if (sieve_storage_create_personal(suser->svinst, user, storage_flags,
+					  &suser->sieve_storage,
+					  &error_code) < 0) {
 		switch (error_code) {
 		/* Sieve disabled for user */
 		case SIEVE_ERROR_NOT_POSSIBLE:
diff --git a/src/plugins/imap-filter-sieve/imap-filter-sieve.c b/src/plugins/imap-filter-sieve/imap-filter-sieve.c
index c77220e21e2babdd2a052b71f345de322e189ba9..eb2c9caa04c5172d8cdf47f3707ac8ff8a0a0b8b 100644
--- a/src/plugins/imap-filter-sieve/imap-filter-sieve.c
+++ b/src/plugins/imap-filter-sieve/imap-filter-sieve.c
@@ -189,10 +189,9 @@ imap_filter_sieve_get_personal_storage(struct imap_filter_sieve_context *sctx,
 		return -1;
 	}
 
-	ifsuser->storage = sieve_storage_create_personal(svinst, user,
-							 storage_flags,
-							 &error_code);
-	if (ifsuser->storage != NULL) {
+	if (sieve_storage_create_personal(svinst, user, storage_flags,
+					  &ifsuser->storage,
+					  &error_code) == 0) {
 		*storage_r = ifsuser->storage;
 		return 0;
 	}
diff --git a/src/plugins/imapsieve/imap-sieve.c b/src/plugins/imapsieve/imap-sieve.c
index 935a6f89745e187ab43a70563cfff2d332d316e9..54631d7012d4c680a0e9113775e26e48f74f5e70 100644
--- a/src/plugins/imapsieve/imap-sieve.c
+++ b/src/plugins/imapsieve/imap-sieve.c
@@ -143,10 +143,8 @@ imap_sieve_get_storage(struct imap_sieve *isieve,
 		return -1;
 	}
 
-	isieve->storage = sieve_storage_create_personal(isieve->svinst, user,
-							storage_flags,
-							&error_code);
-	if (isieve->storage == NULL) {
+	if (sieve_storage_create_personal(isieve->svinst, user, storage_flags,
+					  &isieve->storage, &error_code) < 0) {
 		if (error_code == SIEVE_ERROR_TEMP_FAILURE)
 			return -1;
 		return 0;
diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c
index 3695574d1b85c482569882d20f14718c22e1277b..8dba440d953181efc6c292ace76e5afc93176165 100644
--- a/src/plugins/lda-sieve/lda-sieve-plugin.c
+++ b/src/plugins/lda-sieve/lda-sieve-plugin.c
@@ -256,9 +256,8 @@ lda_sieve_get_personal_storage(struct sieve_instance *svinst,
 			       struct sieve_storage **storage_r,
 			       enum sieve_error *error_code_r)
 {
-	*storage_r = sieve_storage_create_personal(svinst, user, 0,
-						   error_code_r);
-	if (*storage_r == NULL) {
+	if (sieve_storage_create_personal(svinst, user, 0,
+					  storage_r, error_code_r) < 0) {
 		switch (*error_code_r) {
 		case SIEVE_ERROR_NOT_POSSIBLE:
 		case SIEVE_ERROR_NOT_FOUND: