From: Wayne Davison Date: Fri, 12 Jun 2020 23:52:54 +0000 (-0700) Subject: Add hashtable to delete_in_dir() to fix -x deletions X-Git-Tag: v3.2.0pre1~12 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ad9f1571cee2a29232d83fcb13c6924722f492bf;p=thirdparty%2Frsync.git Add hashtable to delete_in_dir() to fix -x deletions --- diff --git a/generator.c b/generator.c index dba97d85..210e5f31 100644 --- a/generator.c +++ b/generator.c @@ -277,6 +277,7 @@ static void do_delayed_deletions(char *delbuf) static void delete_in_dir(char *fbuf, struct file_struct *file, dev_t *fs_dev) { static int already_warned = 0; + static struct hashtable *dev_tbl; struct file_list *dirlist; char delbuf[MAXPATHLEN]; int dlen, i; @@ -305,10 +306,16 @@ static void delete_in_dir(char *fbuf, struct file_struct *file, dev_t *fs_dev) change_local_filter_dir(fbuf, dlen, F_DEPTH(file)); if (one_file_system) { - if (file->flags & FLAG_TOP_DIR) + if (!dev_tbl) + dev_tbl = hashtable_create(16, HT_KEY64); + if (file->flags & FLAG_TOP_DIR) { + hashtable_find(dev_tbl, *fs_dev+1, ""); filesystem_dev = *fs_dev; - else if (filesystem_dev != *fs_dev) - return; + } else if (filesystem_dev != *fs_dev) { + if (!hashtable_find(dev_tbl, *fs_dev+1, NULL)) + return; + filesystem_dev = *fs_dev; /* it's a prior top-dir dev */ + } } dirlist = get_dirlist(fbuf, dlen, 0);