diff --git a/glnx-fdio.c b/glnx-fdio.c
index ad43e61d727d7d8219382a84aa2e9197823f8c15..c8da35e87f6472042f55d531c2e1f4aca7f0b59a 100644
--- a/glnx-fdio.c
+++ b/glnx-fdio.c
@@ -244,6 +244,27 @@ glnx_open_tmpfile_linkable_at (int dfd,
   return FALSE;
 }
 
+/* A variant of `glnx_open_tmpfile_linkable_at()` which doesn't support linking.
+ * Useful for true temporary storage. The fd will be allocated in /var/tmp to
+ * ensure maximum storage space.
+ */
+gboolean
+glnx_open_anonymous_tmpfile (int          flags,
+                             GLnxTmpfile *out_tmpf,
+                             GError     **error)
+{
+  if (!glnx_open_tmpfile_linkable_at (AT_FDCWD, "/var/tmp", flags, out_tmpf, error))
+    return FALSE;
+  if (out_tmpf->path)
+    {
+      (void) unlinkat (out_tmpf->src_dfd, out_tmpf->path, 0);
+      g_clear_pointer (&out_tmpf->path, g_free);
+    }
+  out_tmpf->anonymous = TRUE;
+  out_tmpf->src_dfd = -1;
+  return TRUE;
+}
+
 /* Use this after calling glnx_open_tmpfile_linkable_at() to give
  * the file its final name (link into place).
  */
@@ -257,7 +278,9 @@ glnx_link_tmpfile_at (GLnxTmpfile *tmpf,
   const gboolean replace = (mode == GLNX_LINK_TMPFILE_REPLACE);
   const gboolean ignore_eexist = (mode == GLNX_LINK_TMPFILE_NOREPLACE_IGNORE_EXIST);
 
+  g_return_val_if_fail (!tmpf->anonymous, FALSE);
   g_return_val_if_fail (tmpf->fd >= 0, FALSE);
+  g_return_val_if_fail (tmpf->src_dfd == AT_FDCWD || tmpf->src_dfd >= 0, FALSE);
 
   /* Unlike the original systemd code, this function also supports
    * replacing existing files.
diff --git a/glnx-fdio.h b/glnx-fdio.h
index bdccbe55f8b5408acc3ee39fbc6af0bc095da8a4..14ae57e55e9b2d989a111c88eae5548b0aa9f966 100644
--- a/glnx-fdio.h
+++ b/glnx-fdio.h
@@ -52,6 +52,7 @@ const char *glnx_basename (const char *path)
 
 typedef struct {
   gboolean initialized;
+  gboolean anonymous;
   int src_dfd;
   int fd;
   char *path;
@@ -59,6 +60,11 @@ typedef struct {
 void glnx_tmpfile_clear (GLnxTmpfile *tmpf);
 G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(GLnxTmpfile, glnx_tmpfile_clear);
 
+gboolean
+glnx_open_anonymous_tmpfile (int flags,
+                             GLnxTmpfile *out_tmpf,
+                             GError **error);
+
 gboolean
 glnx_open_tmpfile_linkable_at (int dfd,
                                const char *subpath,