diff --git a/flist.c b/flist.c
--- a/flist.c
+++ b/flist.c
-@@ -70,6 +70,7 @@ extern int need_unsorted_flist;
+@@ -71,6 +71,7 @@ extern int sender_symlink_iconv;
extern int unsort_ndx;
extern struct stats stats;
extern char *filesfrom_host;
extern char curr_dir[MAXPATHLEN];
-@@ -834,7 +835,7 @@ static struct file_struct *recv_file_entry(struct file_list *flist,
+@@ -844,7 +845,7 @@ static struct file_struct *recv_file_entry(struct file_list *flist,
extra_len += EXTRA_LEN;
#endif
+ if ((always_checksum || link_by_hash_dir) && S_ISREG(mode))
extra_len += SUM_EXTRA_CNT * EXTRA_LEN;
- if (file_length > 0xFFFFFFFFu && S_ISREG(mode))
+ #if SIZEOF_INT64 >= 8
diff --git a/hashlink.c b/hashlink.c
new file mode 100644
--- /dev/null
default:
/* A large opt value means that set_refuse_options()
* turned this option off. */
-@@ -2023,6 +2041,11 @@ void server_options(char **args, int *argc_p)
+@@ -2036,6 +2054,11 @@ void server_options(char **args, int *argc_p)
} else if (inplace)
args[ac++] = "--inplace";
extern struct file_list *cur_flist, *first_flist, *dir_flist;
extern struct chmod_mode_struct *daemon_chmod_modes;
#ifdef ICONV_OPTION
-@@ -574,8 +575,15 @@ int finish_transfer(const char *fname, const char *fnametmp,
+@@ -575,8 +576,15 @@ int finish_transfer(const char *fname, const char *fnametmp,
/* move tmp file over real file */
if (verbose > 2)
rprintf(FINFO, "renaming %s to %s\n", fnametmp, fname);
diff --git a/rsync.h b/rsync.h
--- a/rsync.h
+++ b/rsync.h
-@@ -824,6 +824,14 @@ struct stats {
+@@ -830,6 +830,14 @@ struct stats {
int num_transferred_files;
};