The latest patches.
[rsync.git/patches.git] / checksum-updating.diff
index 7f8f5f67a02c5ddb8f4666e09f910583ae76d430..2b85f4e10218aa60a544a2245831c1bf08a4a236 100644 (file)
@@ -29,7 +29,7 @@ diff --git a/flist.c b/flist.c
  extern int am_root;
  extern int am_server;
  extern int am_daemon;
-@@ -107,6 +108,9 @@ extern iconv_t ic_send, ic_recv;
+@@ -112,6 +113,9 @@ extern iconv_t ic_send, ic_recv;
  
  #define PTR_SIZE (sizeof (struct file_struct *))
  
@@ -37,11 +37,11 @@ diff --git a/flist.c b/flist.c
 +#define FLAG_SUM_KEEP (1<<2) /* keep entry when rewriting */
 +
  int io_error;
- int checksum_len;
+ int flist_csum_len;
  dev_t filesystem_dev; /* used to implement -x */
-@@ -147,8 +151,13 @@ static char tmp_sum[MAX_DIGEST_LEN];
- static char empty_sum[MAX_DIGEST_LEN];
+@@ -154,8 +158,13 @@ static char empty_sum[MAX_DIGEST_LEN];
  static int flist_count_offset; /* for --delete --progress */
+ static int show_filelist_progress;
  
 +#define REGULAR_SKIPPED(flist) ((flist)->to_redo)
 +
@@ -52,8 +52,8 @@ diff --git a/flist.c b/flist.c
 +      int checksum_updates;
  } *csum_cache = NULL;
  
- static void flist_sort_and_clean(struct file_list *flist, int flags);
-@@ -365,7 +374,79 @@ static void flist_done_allocating(struct file_list *flist)
+ static struct file_list *flist_new(int flags, const char *msg);
+@@ -351,7 +360,79 @@ static void flist_done_allocating(struct file_list *flist)
                flist->pool_boundary = ptr;
  }
  
@@ -105,11 +105,11 @@ diff --git a/flist.c b/flist.c
 +      for (i = flist->low; i <= flist->high; i++) {
 +              struct file_struct *file = flist->sorted[i];
 +              const char *cp = F_SUM(file);
-+              const char *end = cp + checksum_len;
++              const char *end = cp + flist_csum_len;
 +              const char *alt_sum = file->basename + strlen(file->basename) + 1;
 +              if (whole_dir && !(file->flags & FLAG_SUM_KEEP))
 +                      continue;
-+              if (protocol_version >= 30)
++              if (file_sum_nni->num == CSUM_MD5)
 +                      fprintf(out_fp, "%s ", alt_sum);
 +              if (file->flags & FLAG_SUM_MISSING) {
 +                      do {
@@ -120,7 +120,7 @@ diff --git a/flist.c b/flist.c
 +                              fprintf(out_fp, "%02x", (int)CVAL(cp, 0));
 +                      } while (++cp != end);
 +              }
-+              if (protocol_version < 30)
++              if (file_sum_nni->num < CSUM_MD5)
 +                      fprintf(out_fp, " %s", alt_sum);
 +              fprintf(out_fp, " %10.0f %10.0f %10lu %10lu %s\n",
 +                      (double)F_LENGTH(file), (double)file->modtime,
@@ -134,7 +134,7 @@ diff --git a/flist.c b/flist.c
  {
        int slot, slots = am_sender ? 1 : basis_dir_cnt + 1;
  
-@@ -379,6 +460,9 @@ void reset_checksum_cache()
+@@ -362,6 +443,9 @@ void reset_checksum_cache()
                struct file_list *flist = csum_cache[slot].flist;
  
                if (flist) {
@@ -144,7 +144,7 @@ diff --git a/flist.c b/flist.c
                        /* Reset the pool memory and empty the file-list array. */
                        pool_free_old(flist->file_pool,
                                      pool_boundary(flist->file_pool, 0));
-@@ -389,6 +473,10 @@ void reset_checksum_cache()
+@@ -372,6 +456,10 @@ void reset_checksum_cache()
                flist->low = 0;
                flist->high = -1;
                flist->next = NULL;
@@ -155,7 +155,7 @@ diff --git a/flist.c b/flist.c
        }
  }
  
-@@ -396,7 +484,7 @@ void reset_checksum_cache()
+@@ -379,7 +467,7 @@ void reset_checksum_cache()
  static int add_checksum(struct file_list *flist, const char *dirname,
                        const char *basename, int basename_len, OFF_T file_length,
                        time_t mtime, uint32 ctime, uint32 inode,
@@ -164,31 +164,31 @@ diff --git a/flist.c b/flist.c
  {
        struct file_struct *file;
        int alloc_len, extra_len;
-@@ -413,7 +501,7 @@ static int add_checksum(struct file_list *flist, const char *dirname,
+@@ -396,7 +484,7 @@ static int add_checksum(struct file_list *flist, const char *dirname,
        if (extra_len & (EXTRA_ROUNDING * EXTRA_LEN))
                extra_len = (extra_len | (EXTRA_ROUNDING * EXTRA_LEN)) + EXTRA_LEN;
  #endif
 -      alloc_len = FILE_STRUCT_LEN + extra_len + basename_len;
-+      alloc_len = FILE_STRUCT_LEN + extra_len + basename_len + checksum_len*2 + 1;
++      alloc_len = FILE_STRUCT_LEN + extra_len + basename_len + flist_csum_len*2 + 1;
        bp = pool_alloc(flist->file_pool, alloc_len, "add_checksum");
  
        memset(bp, 0, extra_len + FILE_STRUCT_LEN);
-@@ -422,7 +510,14 @@ static int add_checksum(struct file_list *flist, const char *dirname,
+@@ -405,7 +493,14 @@ static int add_checksum(struct file_list *flist, const char *dirname,
        bp += FILE_STRUCT_LEN;
  
        memcpy(bp, basename, basename_len);
 +      if (alt_sum)
-+              strlcpy(bp+basename_len, alt_sum, checksum_len*2 + 1);
++              strlcpy(bp+basename_len, alt_sum, flist_csum_len*2 + 1);
 +      else {
-+              memset(bp+basename_len, '=', checksum_len*2);
-+              bp[basename_len+checksum_len*2] = '\0';
++              memset(bp+basename_len, '=', flist_csum_len*2);
++              bp[basename_len+flist_csum_len*2] = '\0';
 +      }
  
 +      file->flags = flags;
        file->mode = S_IFREG;
        file->modtime = mtime;
        file->len32 = (uint32)file_length;
-@@ -451,10 +546,11 @@ static void read_checksums(int slot, struct file_list *flist, const char *dirnam
+@@ -434,10 +529,11 @@ static void read_checksums(int slot, struct file_list *flist, const char *dirnam
        char line[MAXPATHLEN+1024], fbuf[MAXPATHLEN], sum[MAX_DIGEST_LEN];
        FILE *fp;
        char *cp;
@@ -201,32 +201,32 @@ diff --git a/flist.c b/flist.c
        int dlen = dirname ? strlcpy(fbuf, dirname, sizeof fbuf) : 0;
  
        if (dlen >= (int)(sizeof fbuf - 1 - RSYNCSUMS_LEN))
-@@ -475,7 +571,7 @@ static void read_checksums(int slot, struct file_list *flist, const char *dirnam
+@@ -458,7 +554,7 @@ static void read_checksums(int slot, struct file_list *flist, const char *dirnam
        while (fgets(line, sizeof line, fp)) {
                cp = line;
-               if (protocol_version >= 30) {
+               if (file_sum_nni->num == CSUM_MD5) {
 -                      char *alt_sum = cp;
 +                      alt_sum = cp;
                        if (*cp == '=')
                                while (*++cp == '=') {}
                        else
-@@ -486,7 +582,14 @@ static void read_checksums(int slot, struct file_list *flist, const char *dirnam
+@@ -469,7 +565,14 @@ static void read_checksums(int slot, struct file_list *flist, const char *dirnam
                }
  
                if (*cp == '=') {
 -                      continue;
-+                      for (i = 0; i < checksum_len*2; i++, cp++) {
++                      for (i = 0; i < flist_csum_len*2; i++, cp++) {
 +                              if (*cp != '=') {
 +                                      cp = "";
 +                                      break;
 +                              }
 +                      }
-+                      memset(sum, 0, checksum_len);
++                      memset(sum, 0, flist_csum_len);
 +                      flags = FLAG_SUM_MISSING;
                } else {
-                       for (i = 0; i < checksum_len*2; i++, cp++) {
+                       for (i = 0; i < flist_csum_len*2; i++, cp++) {
                                int x;
-@@ -504,13 +607,14 @@ static void read_checksums(int slot, struct file_list *flist, const char *dirnam
+@@ -487,13 +590,14 @@ static void read_checksums(int slot, struct file_list *flist, const char *dirnam
                                else
                                        sum[i/2] = x << 4;
                        }
@@ -236,13 +236,13 @@ diff --git a/flist.c b/flist.c
                        break;
                while (*++cp == ' ') {}
  
-               if (protocol_version < 30) {
+               if (file_sum_nni->num < CSUM_MD5) {
 -                      char *alt_sum = cp;
 +                      alt_sum = cp;
                        if (*cp == '=')
                                while (*++cp == '=') {}
                        else
-@@ -560,24 +664,112 @@ static void read_checksums(int slot, struct file_list *flist, const char *dirnam
+@@ -543,24 +647,112 @@ static void read_checksums(int slot, struct file_list *flist, const char *dirnam
                        continue;
  
                strlcpy(fbuf+dlen, cp, sizeof fbuf - dlen);
@@ -280,22 +280,22 @@ diff --git a/flist.c b/flist.c
 +
 +      if (file_flist != flist->next) {
 +              const char *cp = F_SUM(file);
-+              const char *end = cp + checksum_len;
++              const char *end = cp + flist_csum_len;
 +
 +              if (!(out_fp = fopen(fbuf, "a")))
 +                      return;
 +
-+              if (protocol_version >= 30) {
-+                      for (j = 0; j < checksum_len; j++)
++              if (file_sum_nni->num == CSUM_MD5) {
++                      for (j = 0; j < flist_csum_len; j++)
 +                              fputs("==", out_fp);
 +                      fputc(' ', out_fp);
 +              }
 +              do {
 +                      fprintf(out_fp, "%02x", (int)CVAL(cp, 0));
 +              } while (++cp != end);
-+              if (protocol_version < 30) {
++              if (file_sum_nni->num < CSUM_MD5) {
 +                      fputc(' ', out_fp);
-+                      for (j = 0; j < checksum_len; j++)
++                      for (j = 0; j < flist_csum_len; j++)
 +                              fputs("==", out_fp);
 +              }
 +              fprintf(out_fp, " %10.0f %10.0f %10lu %10lu %s\n",
@@ -357,7 +357,7 @@ diff --git a/flist.c b/flist.c
                read_checksums(slot, flist, file->dirname);
        }
  
-@@ -589,12 +781,31 @@ void get_cached_checksum(int slot, const char *fname, struct file_struct *file,
+@@ -572,12 +764,31 @@ void get_cached_checksum(int slot, const char *fname, struct file_struct *file,
                 && (checksum_files & CSF_LAX
                  || (F_CTIME(fp) == (uint32)stp->st_ctime
                   && F_INODE(fp) == (uint32)stp->st_ino))) {
@@ -390,7 +390,7 @@ diff --git a/flist.c b/flist.c
  }
  
  /* Call this with EITHER (1) "file, NULL, 0" to chdir() to the file's
-@@ -1501,6 +1712,8 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
+@@ -1583,6 +1794,8 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
        if (is_excluded(thisname, S_ISDIR(st.st_mode) != 0, filter_level)) {
                if (ignore_perishable)
                        non_perishable_cnt++;
@@ -399,7 +399,7 @@ diff --git a/flist.c b/flist.c
                return NULL;
        }
  
-@@ -1547,13 +1760,13 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
+@@ -1629,13 +1842,13 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
                        lastdir[len] = '\0';
                        lastdir_len = len;
                        if (checksum_files && am_sender && flist)
@@ -415,7 +415,7 @@ diff --git a/flist.c b/flist.c
                }
        }
        basename_len = strlen(basename) + 1; /* count the '\0' */
-@@ -1661,7 +1874,7 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
+@@ -1759,7 +1972,7 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
  
        if (always_checksum && am_sender && S_ISREG(st.st_mode)) {
                if (flist && checksum_files)
@@ -424,7 +424,7 @@ diff --git a/flist.c b/flist.c
                else
                        file_checksum(thisname, &st, tmp_sum);
                if (sender_keeps_checksum)
-@@ -2037,6 +2250,9 @@ static void send_directory(int f, struct file_list *flist, char *fbuf, int len,
+@@ -2151,6 +2364,9 @@ static void send_directory(int f, struct file_list *flist, char *fbuf, int len,
  
        closedir(d);
  
@@ -434,7 +434,7 @@ diff --git a/flist.c b/flist.c
        if (f >= 0 && recurse && !divert_dirs) {
                int i, end = flist->used - 1;
                /* send_if_directory() bumps flist->used, so use "end". */
-@@ -2696,6 +2912,9 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
+@@ -2816,6 +3032,9 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
                        rprintf(FINFO, "[%s] flist_eof=1\n", who_am_i());
        }
  
@@ -447,24 +447,24 @@ diff --git a/flist.c b/flist.c
 diff --git a/generator.c b/generator.c
 --- a/generator.c
 +++ b/generator.c
-@@ -110,6 +110,7 @@ static int dir_tweaking;
+@@ -113,6 +113,7 @@ static int dir_tweaking;
  static int symlink_timeset_failed_flags;
  static int need_retouch_dir_times;
  static int need_retouch_dir_perms;
 +static int started_whole_dir, upcoming_whole_dir;
  static const char *solo_file = NULL;
  
- enum nonregtype {
-@@ -584,7 +585,7 @@ int unchanged_file(char *fn, struct file_struct *file, STRUCT_STAT *st, int slot
-       if (always_checksum > 0 && S_ISREG(st->st_mode)) {
-               char sum[MAX_DIGEST_LEN];
-               if (checksum_files && slot >= 0)
--                      get_cached_checksum(slot, fn, file, st, sum);
-+                      get_cached_checksum(slot, fn, file, -1, st, sum);
-               else
-                       file_checksum(fn, st, sum);
-               return memcmp(sum, F_SUM(file), checksum_len) == 0;
-@@ -1318,7 +1319,8 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+ /* Forward declarations. */
+@@ -627,7 +628,7 @@ int quick_check_ok(enum filetype ftype, const char *fn, struct file_struct *file
+               if (always_checksum > 0) {
+                       char sum[MAX_DIGEST_LEN];
+                       if (checksum_files && slot >= 0)
+-                              get_cached_checksum(slot, fn, file, st, sum);
++                              get_cached_checksum(slot, fn, file, -1, st, sum);
+                       else
+                               file_checksum(fn, st, sum);
+                       return memcmp(sum, F_SUM(file), flist_csum_len) == 0;
+@@ -1359,7 +1360,8 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
                                }
                        }
                        if (checksum_files) {
@@ -474,7 +474,7 @@ diff --git a/generator.c b/generator.c
                        }
                        need_new_dirscan = 0;
                }
-@@ -1492,6 +1494,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+@@ -1547,6 +1549,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
                        else
                                change_local_filter_dir(fname, strlen(fname), F_DEPTH(file));
                }
@@ -482,16 +482,16 @@ diff --git a/generator.c b/generator.c
                prior_dir_file = file;
                goto cleanup;
        }
-@@ -1771,6 +1774,8 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+@@ -1819,6 +1822,8 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
                        handle_partial_dir(partialptr, PDIR_DELETE);
                }
-               set_file_attrs(fname, file, &sx, NULL, maybe_ATTRS_REPORT);
+               set_file_attrs(fname, file, &sx, NULL, maybe_ATTRS_REPORT | maybe_ATTRS_ACCURATE_TIME);
 +              if (checksum_files & CSF_UPDATE)
 +                      set_cached_checksum(cur_flist, file);
                if (itemizing)
                        itemize(fnamecmp, file, ndx, statret, &sx, 0, 0, NULL);
  #ifdef SUPPORT_HARD_LINKS
-@@ -2264,6 +2269,7 @@ void generate_files(int f_out, const char *local_name)
+@@ -2311,6 +2316,7 @@ void generate_files(int f_out, const char *local_name)
                                } else
                                        change_local_filter_dir(fbuf, strlen(fbuf), F_DEPTH(fp));
                        }
@@ -499,7 +499,7 @@ diff --git a/generator.c b/generator.c
                }
                for (i = cur_flist->low; i <= cur_flist->high; i++) {
                        struct file_struct *file = cur_flist->sorted[i];
-@@ -2358,6 +2364,9 @@ void generate_files(int f_out, const char *local_name)
+@@ -2405,6 +2411,9 @@ void generate_files(int f_out, const char *local_name)
                        wait_for_receiver();
        }
  
@@ -512,15 +512,15 @@ diff --git a/generator.c b/generator.c
 diff --git a/io.c b/io.c
 --- a/io.c
 +++ b/io.c
-@@ -53,6 +53,7 @@ extern int read_batch;
+@@ -55,6 +55,7 @@ extern int read_batch;
  extern int compat_flags;
  extern int protect_args;
  extern int checksum_seed;
 +extern int checksum_files;
+ extern int daemon_connection;
  extern int protocol_version;
  extern int remove_source_files;
- extern int preserve_hard_links;
-@@ -1050,6 +1051,9 @@ static void got_flist_entry_status(enum festatus status, int ndx)
+@@ -1117,6 +1118,9 @@ static void got_flist_entry_status(enum festatus status, int ndx)
                                if (inc_recurse)
                                        flist->in_progress++;
                        }
@@ -533,7 +533,7 @@ diff --git a/io.c b/io.c
 diff --git a/loadparm.c b/loadparm.c
 --- a/loadparm.c
 +++ b/loadparm.c
-@@ -316,6 +316,10 @@ static struct enum_list enum_csum_modes[] = {
+@@ -166,6 +166,10 @@ static struct enum_list enum_checksum_files[] = {
        { CSF_IGNORE_FILES, "none" },
        { CSF_LAX_MODE, "lax" },
        { CSF_STRICT_MODE, "strict" },
@@ -547,7 +547,7 @@ diff --git a/loadparm.c b/loadparm.c
 diff --git a/options.c b/options.c
 --- a/options.c
 +++ b/options.c
-@@ -1681,7 +1681,15 @@ int parse_arguments(int *argc_p, const char ***argv_p)
+@@ -1750,7 +1750,15 @@ int parse_arguments(int *argc_p, const char ***argv_p)
  
                case OPT_SUMFILES:
                        arg = poptGetOptArg(pc);
@@ -567,36 +567,58 @@ diff --git a/options.c b/options.c
 diff --git a/receiver.c b/receiver.c
 --- a/receiver.c
 +++ b/receiver.c
-@@ -49,6 +49,7 @@ extern int sparse_files;
+@@ -51,6 +51,7 @@ extern int sparse_files;
  extern int preallocate_files;
  extern int keep_partial;
  extern int checksum_seed;
 +extern int checksum_files;
  extern int whole_file;
  extern int inplace;
- extern int allowed_lull;
-@@ -431,7 +432,7 @@ static void handle_delayed_updates(char *local_name)
+ extern int inplace_partial;
+@@ -440,7 +441,8 @@ static void handle_delayed_updates(char *local_name)
                                        "rename failed for %s (from %s)",
                                        full_fname(fname), partialptr);
                        } else {
--                              if (remove_source_files
+-                              if (remove_source_files || (preserve_hard_links && F_IS_HLINKED(file)))
 +                              if (remove_source_files || checksum_files & CSF_UPDATE
-                                || (preserve_hard_links && F_IS_HLINKED(file)))
-                                       send_msg_int(MSG_SUCCESS, ndx);
++                               || (preserve_hard_links && F_IS_HLINKED(file)))
+                                       send_msg_success(fname, ndx);
                                handle_partial_dir(partialptr, PDIR_DELETE);
-@@ -893,7 +894,7 @@ int recv_files(int f_in, int f_out, char *local_name)
+                       }
+@@ -926,7 +928,8 @@ int recv_files(int f_in, int f_out, char *local_name)
                case 2:
                        break;
                case 1:
--                      if (remove_source_files || inc_recurse
+-                      if (remove_source_files || inc_recurse || (preserve_hard_links && F_IS_HLINKED(file)))
 +                      if (remove_source_files || inc_recurse || checksum_files & CSF_UPDATE
-                        || (preserve_hard_links && F_IS_HLINKED(file)))
-                               send_msg_int(MSG_SUCCESS, ndx);
++                       || (preserve_hard_links && F_IS_HLINKED(file)))
+                               send_msg_success(fname, ndx);
                        break;
+               case 0: {
+diff --git a/rsync.1.md b/rsync.1.md
+--- a/rsync.1.md
++++ b/rsync.1.md
+@@ -803,9 +803,13 @@ expand it.
+     The MODE value is either "lax", for relaxed checking (which compares size
+     and mtime), "strict" (which also compares ctime and inode), or "none" to
+-    ignore any .rsyncsums files ("none" is the default).  Rsync does not create
+-    or update these files, but there is a perl script in the support directory
+-    named "rsyncsums" that can be used for that.
++    ignore any .rsyncsums files ("none" is the default).
++    If you want rsync to create and/or update these files, specify a prefixed
++    plus ("+lax" or "+strict").  Adding a second prefixed '+' causes the
++    checksum-file updates to happen even when the transfer is in [`--dry-run`](#opt)
++    mode ("++lax" or "++strict").  There is also a perl script in the support
++    directory named "rsyncsums" that can be used to update the .rsyncsums
++    files.
+     This option has no effect unless [`--checksum`](#opt) (`-c`) was also
+     specified.  It also only affects the current side of the transfer, so if
 diff --git a/rsync.h b/rsync.h
 --- a/rsync.h
 +++ b/rsync.h
-@@ -975,6 +975,8 @@ typedef struct {
+@@ -1123,6 +1123,8 @@ typedef struct {
  
  #define CSF_ENABLE (1<<1)
  #define CSF_LAX (1<<2)
@@ -605,46 +627,26 @@ diff --git a/rsync.h b/rsync.h
  
  #define CSF_IGNORE_FILES 0
  #define CSF_LAX_MODE (CSF_ENABLE|CSF_LAX)
-diff --git a/rsync.yo b/rsync.yo
---- a/rsync.yo
-+++ b/rsync.yo
-@@ -661,9 +661,13 @@ computed just as it would be if bf(--sumfiles) was not specified.
- The MODE value is either "lax", for relaxed checking (which compares size
- and mtime), "strict" (which also compares ctime and inode), or "none" to
--ignore any .rsyncsums files ("none" is the default).  Rsync does not create
--or update these files, but there is a perl script in the support directory
--named "rsyncsums" that can be used for that.
-+ignore any .rsyncsums files ("none" is the default).
-+If you want rsync to create and/or update these files, specify a prefixed
-+plus ("+lax" or "+strict").
-+Adding a second prefixed '+' causes the checksum-file updates to happen
-+even when the transfer is in bf(--dry-run) mode ("++lax" or "++strict").
-+There is also a perl script in the support directory named "rsyncsums"
-+that can be used to update the .rsyncsums files.
- This option has no effect unless bf(--checksum, -c) was also specified.  It
- also only affects the current side of the transfer, so if you want the
-diff --git a/rsyncd.conf.yo b/rsyncd.conf.yo
---- a/rsyncd.conf.yo
-+++ b/rsyncd.conf.yo
-@@ -337,13 +337,15 @@ The default is tt(/var/run/rsyncd.lock).
- dit(bf(checksum files)) This parameter tells rsync to make use of any cached
- checksum information it finds in per-directory .rsyncsums files when the
- current transfer is using the bf(--checksum) option.  The value can be set
--to either "lax", "strict", or "none" -- see the client's bf(--sumfiles)
--option for what these choices do.
-+to either "lax", "strict", "+lax", "+strict", "++lax", "++strict", or
-+"none".  See the client's bf(--sumfiles) option for what these choices do.
- Note also that the client's command-line option, bf(--sumfiles), has no
- effect on a daemon.  A daemon will only access checksum files if this
--config option tells it to.  See also the bf(exclude) directive for a way
--to hide the .rsyncsums files from the user.
-+config option tells it to.  You can configure updating of the .rsyncsums
-+files even if the module itself is configured to be read-only.  See also
-+the bf(exclude) directive for a way to hide the .rsyncsums files from the
-+user.
- dit(bf(read only)) This parameter determines whether clients
- will be able to upload files or not. If "read only" is true then any
+diff --git a/rsyncd.conf.5.md b/rsyncd.conf.5.md
+--- a/rsyncd.conf.5.md
++++ b/rsyncd.conf.5.md
+@@ -450,13 +450,15 @@ the values of parameters.  See the GLOBAL PARAMETERS section for more details.
+     This parameter tells rsync to make use of any cached checksum information
+     it finds in per-directory .rsyncsums files when the current transfer is
+     using the `--checksum` option.  The value can be set to either "lax",
+-    "strict", or "none".  See the client's `--sumfiles` option for what these
+-    choices do.
++    "strict", "+lax", "+strict", "++lax", "++strict", or +"none".  See the
++    client's `--sumfiles` option for what these choices do.
+     Note also that the client's command-line option, `--sumfiles`, has no
+     effect on a daemon.  A daemon will only access checksum files if this
+-    config option tells it to.  See also the `exclude` directive for a way to
+-    hide the .rsyncsums files from the user.
++    config option tells it to.  You can configure updating of the .rsyncsums
++    files even if the module itself is configured to be read-only.  See also
++    the `exclude` directive for a way to hide the .rsyncsums files from the
++    user.
+ 0.  `read only`