diff --git a/src/port/copydir.c b/src/port/copydir.c
index 0927e62fe61f23f99364d3d56986a9ccdbcbd58a..b9c6a9a6104519e4a8f89c2fca301944fcc59fab 100644
--- a/src/port/copydir.c
+++ b/src/port/copydir.c
@@ -11,7 +11,7 @@
  *	as a service.
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/port/copydir.c,v 1.36 2010/03/01 14:54:00 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/port/copydir.c,v 1.37 2010/07/01 20:12:40 rhaas Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -23,6 +23,7 @@
 #include <sys/stat.h>
 
 #include "storage/fd.h"
+#include "miscadmin.h"
 
 /*
  *	On Windows, call non-macro versions of palloc; we can't reference
@@ -69,6 +70,9 @@ copydir(char *fromdir, char *todir, bool recurse)
 	{
 		struct stat fst;
 
+        /* If we got a cancel signal during the copy of the directory, quit */
+        CHECK_FOR_INTERRUPTS();
+
 		if (strcmp(xlde->d_name, ".") == 0 ||
 			strcmp(xlde->d_name, "..") == 0)
 			continue;
@@ -172,6 +176,9 @@ copy_file(char *fromfile, char *tofile)
 	 */
 	for (offset = 0;; offset += nbytes)
 	{
+        /* If we got a cancel signal during the copy of the file, quit */
+        CHECK_FOR_INTERRUPTS();
+
 		nbytes = read(srcfd, buffer, COPY_BUF_SIZE);
 		if (nbytes < 0)
 			ereport(ERROR,