+ if (S_ISDIR(mode) && !(flags & DEL_DIR_IS_EMPTY)) {
+ ignore_perishable = 1;
+ /* If DEL_RECURSE is not set, this just reports emptiness. */
+@@ -253,7 +261,7 @@ static enum delret delete_dir_contents(c
+ if (S_ISDIR(fp->mode)
+ && delete_dir_contents(fname, flags | DEL_RECURSE) != DR_SUCCESS)
+ ret = DR_NOT_EMPTY;
+- if (delete_item(fname, fp->mode, NULL, flags) != DR_SUCCESS)
++ if (delete_item(fname, fp->mode, FILEFLAGS(fp->fileflags), NULL, flags) != DR_SUCCESS)
+ ret = DR_NOT_EMPTY;
+ }
+
+@@ -309,8 +317,9 @@ static int remember_delete(struct file_s
+
+ while (1) {
+ len = snprintf(deldelay_buf + deldelay_cnt,
+- deldelay_size - deldelay_cnt,
+- "%x %s%c", (int)file->mode, fname, '\0');
++ deldelay_size - deldelay_cnt, "%x %x %s%c",
++ (int)file->mode, (int)FILEFLAGS(file->fileflags),
++ fname, '\0');
+ if ((deldelay_cnt += len) <= deldelay_size)
+ break;
+ if (deldelay_fd < 0 && !start_delete_delay_temp())
+@@ -323,7 +332,7 @@ static int remember_delete(struct file_s
+ return 1;
+ }
+
+-static int read_delay_line(char *buf)
++static int read_delay_line(char *buf, int *fileflags_p)
+ {
+ static int read_pos = 0;
+ int j, len, mode;
+@@ -365,7 +374,7 @@ static int read_delay_line(char *buf)
+
+ bp = deldelay_buf + read_pos;
+
+- if (sscanf(bp, "%x ", &mode) != 1) {
++ if (sscanf(bp, "%x %x ", &mode, fileflags_p) != 2) {
+ invalid_data:
+ rprintf(FERROR, "ERROR: invalid data in delete-delay file.\n");
+ return -1;
+@@ -388,15 +397,15 @@ static int read_delay_line(char *buf)
+
+ static void do_delayed_deletions(char *delbuf)
+ {
+- int mode;
++ int mode, fileflags;
+
+ if (deldelay_fd >= 0) {
+ if (deldelay_cnt && !flush_delete_delay())
+ return;
+ lseek(deldelay_fd, 0, 0);
+ }
+- while ((mode = read_delay_line(delbuf)) >= 0)
+- delete_item(delbuf, mode, NULL, DEL_RECURSE);
++ while ((mode = read_delay_line(delbuf, &fileflags)) >= 0)
++ delete_item(delbuf, mode, fileflags, NULL, DEL_RECURSE);
+ if (deldelay_fd >= 0)
+ close(deldelay_fd);
+ }
+@@ -477,7 +486,7 @@ static void delete_in_dir(struct file_li
+ if (!remember_delete(fp, delbuf))
+ break;
+ } else
+- delete_item(delbuf, fp->mode, NULL, DEL_RECURSE);
++ delete_item(delbuf, fp->mode, FILEFLAGS(fp->fileflags), NULL, DEL_RECURSE);
+ }
+ }
+
+@@ -1181,7 +1190,7 @@ static void recv_generator(char *fname,
+ * we need to delete it. If it doesn't exist, then
+ * (perhaps recursively) create it. */
+ if (statret == 0 && !S_ISDIR(st.st_mode)) {
+- if (delete_item(fname, st.st_mode, "directory", del_opts) != 0)
++ if (delete_item(fname, st.st_mode, FILEFLAGS(st.st_flags), "directory", del_opts) != 0)
+ return;
+ statret = -1;
+ }
+@@ -1278,7 +1287,7 @@ static void recv_generator(char *fname,
+ }
+ /* Not the right symlink (or not a symlink), so
+ * delete it. */
+- if (delete_item(fname, st.st_mode, "symlink", del_opts) != 0)
++ if (delete_item(fname, st.st_mode, FILEFLAGS(st.st_flags), "symlink", del_opts) != 0)
+ return;
+ } else if (basis_dir[0] != NULL) {
+ int j = try_dests_non(file, fname, ndx, fnamecmpbuf, &st,
+@@ -1355,7 +1364,7 @@ static void recv_generator(char *fname,
+ goto return_with_success;
+ return;
+ }
+- if (delete_item(fname, st.st_mode, t, del_opts) != 0)
++ if (delete_item(fname, st.st_mode, FILEFLAGS(st.st_flags), t, del_opts) != 0)
+ return;
+ } else if (basis_dir[0] != NULL) {
+ int j = try_dests_non(file, fname, ndx, fnamecmpbuf, &st,
+@@ -1444,7 +1453,7 @@ static void recv_generator(char *fname,
+ fnamecmp_type = FNAMECMP_FNAME;
+
+ if (statret == 0 && !S_ISREG(st.st_mode)) {
+- if (delete_item(fname, st.st_mode, "regular file", del_opts) != 0)
++ if (delete_item(fname, st.st_mode, FILEFLAGS(st.st_flags), "regular file", del_opts) != 0)
+ return;
+ statret = -1;
+ stat_errno = ENOENT;