+--- old/flist.c
++++ new/flist.c
+@@ -60,6 +60,7 @@ extern int copy_unsafe_links;
+ extern int protocol_version;
+ extern int sanitize_paths;
+ extern struct stats stats;
++extern char *link_by_hash_dir;
+
+ extern char curr_dir[MAXPATHLEN];
+
+@@ -747,7 +748,7 @@ static struct file_struct *recv_file_ent
+ extra_len += (S_ISDIR(mode) ? 2 : 1) * EXTRA_LEN;
+ #endif
+
+- if (always_checksum && S_ISREG(mode))
++ if ((always_checksum || link_by_hash_dir) && S_ISREG(mode))
+ extra_len += SUM_EXTRA_CNT * EXTRA_LEN;
+
+ if (file_length > 0xFFFFFFFFu && S_ISREG(mode))
+--- old/hashlink.c
++++ new/hashlink.c
+@@ -0,0 +1,336 @@