return 0;
 }
+
+int
+do_fill_pattern (const char *pattern, int len, const char *path)
+{
+  size_t patlen = strlen (pattern);
+
+  if (patlen < 1) {
+    reply_with_error ("pattern string must be non-empty");
+    return -1;
+  }
+
+  if (len < 0) {
+    reply_with_error ("%d: length is < 0", len);
+    return -1;
+  }
+  size_t len_sz = (size_t) len;
+
+  int fd;
+  CHROOT_IN;
+  fd = open (path, O_WRONLY | O_CREAT | O_NOCTTY, 0666);
+  CHROOT_OUT;
+
+  if (fd == -1) {
+    reply_with_perror ("open: %s", path);
+    return -1;
+  }
+
+  /* XXX This implementation won't be very efficient for large files. */
+  size_t n = 0;
+  while (n < len_sz) {
+    size_t wrlen = len_sz - n < patlen ? len_sz - n : patlen;
+    if (xwrite (fd, pattern, wrlen) == -1) {
+      reply_with_perror ("write: %s", path);
+      close (fd);
+      return -1;
+    }
+    n += wrlen;
+  }
+
+  if (close (fd) == -1) {
+    reply_with_perror ("close: %s", path);
+    return -1;
+  }
+
+  return 0;
+}
 
 must be a number in the range C<[0..255]>.
 
 To fill a file with zero bytes (sparsely), it is
-much more efficient to use C<guestfs_truncate_size>.");
+much more efficient to use C<guestfs_truncate_size>.
+To create a file with a pattern of repeating bytes
+use C<guestfs_fill_pattern>.");
 
   ("available", (RErr, [StringList "groups"]), 216, [],
    [InitNone, Always, TestRun [["available"; ""]]],
 backslash syntax.  For more information, see the GNU
 coreutils info file.");
 
+  ("fill_pattern", (RErr, [String "pattern"; Int "len"; Pathname "path"]), 245, [],
+   [InitBasicFS, Always, TestOutputBuffer (
+      [["fill_pattern"; "abcdefghijklmnopqrstuvwxyz"; "28"; "/test"];
+       ["read_file"; "/test"]], "abcdefghijklmnopqrstuvwxyzab")],
+   "fill a file with a repeating pattern of bytes",
+   "\
+This function is like C<guestfs_fill> except that it creates
+a new file of length C<len> containing the repeating pattern
+of bytes in C<pattern>.  The pattern is truncated if necessary
+to ensure the length of the file is exactly C<len> bytes.");
+
 ]
 
 let all_functions = non_daemon_functions @ daemon_functions