diff --git a/src/lib-sieve/sieve-storage-private.h b/src/lib-sieve/sieve-storage-private.h
index 7ed7f31dc301cd85a3919482ca6ab1c61711f3c4..64bb8f138386938547c1af6c45ad5c591dc746db 100644
--- a/src/lib-sieve/sieve-storage-private.h
+++ b/src/lib-sieve/sieve-storage-private.h
@@ -126,6 +126,13 @@ int sieve_storage_alloc(struct sieve_instance *svinst, struct event *event,
 
 int sieve_storage_setup_bin_path(struct sieve_storage *storage, mode_t mode);
 
+/*
+ * Comparison
+ */
+
+int sieve_storage_cmp(const struct sieve_storage *storage1,
+		      const struct sieve_storage *storage2);
+
 /*
  * Active script
  */
diff --git a/src/lib-sieve/sieve-storage.c b/src/lib-sieve/sieve-storage.c
index c6e4de21a1c0b3d6a8c6dc622c40352bf471b04a..5a8155a69bf35342c15f86b3e3860d73ce79d048 100644
--- a/src/lib-sieve/sieve-storage.c
+++ b/src/lib-sieve/sieve-storage.c
@@ -836,6 +836,24 @@ void sieve_storage_set_modified(struct sieve_storage *storage, time_t mtime)
 	storage->v.set_modified(storage, mtime);
 }
 
+/*
+ * Comparison
+ */
+
+int sieve_storage_cmp(const struct sieve_storage *storage1,
+		      const struct sieve_storage *storage2)
+{
+	if (storage1 == storage2)
+		return 0;
+	if (storage1 == NULL || storage2 == NULL)
+		return (storage1 == NULL ? -1 : 1);
+	if (storage1->storage_class != storage2->storage_class) {
+		return (storage1->storage_class > storage2->storage_class ?
+			1 : -1);
+	}
+	return null_strcmp(storage1->location, storage2->location);
+}
+
 /*
  * Script access
  */