diff --git a/glnx-fdio.c b/glnx-fdio.c
index d4eeb24c5000e5e0bcd2a008c734a19a9555395d..3fa73b5d2c18af1d2bfcc88936ca30f75bc4bb4f 100644
--- a/glnx-fdio.c
+++ b/glnx-fdio.c
@@ -1000,8 +1000,11 @@ glnx_file_copy_at (int                   src_dfd,
   if (glnx_regfile_copy_bytes (src_fd, tmp_dest.fd, (off_t) -1) < 0)
     return glnx_throw_errno_prefix (error, "regfile copy");
 
-  if (fchown (tmp_dest.fd, src_stbuf->st_uid, src_stbuf->st_gid) != 0)
-    return glnx_throw_errno_prefix (error, "fchown");
+  if (!(copyflags & GLNX_FILE_COPY_NOCHOWN))
+    {
+      if (fchown (tmp_dest.fd, src_stbuf->st_uid, src_stbuf->st_gid) != 0)
+        return glnx_throw_errno_prefix (error, "fchown");
+    }
 
   if (!(copyflags & GLNX_FILE_COPY_NOXATTRS))
     {
diff --git a/glnx-fdio.h b/glnx-fdio.h
index 40931bfba8e45dad7a0ea335cd6a6e2c9a31dad9..3d1f024cc744b55ecab9fa6edba0fa497c4e6bcf 100644
--- a/glnx-fdio.h
+++ b/glnx-fdio.h
@@ -189,7 +189,8 @@ glnx_regfile_copy_bytes (int fdf, int fdt, off_t max_bytes);
 typedef enum {
   GLNX_FILE_COPY_OVERWRITE = (1 << 0),
   GLNX_FILE_COPY_NOXATTRS = (1 << 1),
-  GLNX_FILE_COPY_DATASYNC = (1 << 2)
+  GLNX_FILE_COPY_DATASYNC = (1 << 2),
+  GLNX_FILE_COPY_NOCHOWN = (1 << 3)
 } GLnxFileCopyFlags;
 
 gboolean