https://bugzilla.samba.org/show_bug.cgi?id=4899

           Summary: When a mounted dir cannot be visited, rsync will halt
                    there and the shell is halted, even "ctrl -c" can't quit
                    it.
           Product: rsync
           Version: 2.6.9
          Platform: x86
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P3
         Component: core
        AssignedTo: [EMAIL PROTECTED]
        ReportedBy: [EMAIL PROTECTED]
         QAContact: [EMAIL PROTECTED]


Problem: When a mounted dir(for example, "mnt") cannot be visited, rsync will
halt there and the shell is halted, even "ctrl -c" can't quit it. If the mountd
dir is filtered out, rsync still fail to work.

dirA_________dir1
          |__ mnt

dirB_________dir1
$rsync -r -vvvvvvv -L --include-from=filter --exclude="*" dirA/ dirB/

Root cause:
related brief process of rsync:
1 client_run(), called once the connection has been negotiated.
2 read the filter.
3 send_file_list(). 
4 send_files().

In step 3, rsync will examine the file one by one, to decide whether it is a
symblic, whether it is filtered, and so on. It revokes  do_stat to check the
file status.
int do_stat(const char *fname, STRUCT_STAT *st)
{
#if HAVE_OFF64_T
 return stat64(fname, st);
#else
 return stat(fname, st);
#endif
}

It revokes system function "stat", which will halt when the mounted dir is
crashed. 
The "stat" issue is not due to rsync. But if the mountd dir is filtered out,
rsync should work well.

Solution:
Modified "flist.c", 
struct file_struct *make_file(char *fname, struct file_list *flist,
                              STRUCT_STAT *stp, unsigned short flags,
                              int filter_level)
{
...
        memset(sum, 0, SUM_LENGTH);

        /* In case a mounted dir crashed, than stat will hang there even
           the dir has been filtered */
        if (filter_level != NO_FILTERS
            && is_excluded(thisname, 1, filter_level)) {
                rprintf(FINFO, "Excluding %s\n", thisname);
                return NULL;
        } else if (stp && S_ISDIR(stp->st_mode)) {
                st = *stp; /* Needed for "symlink/." with --relative. */
                *linkname = '\0'; /* make IBM code checker happy */
        } else if (readlink_stat(thisname, &st, linkname) != 0) {
...
}


}


-- 
Configure bugmail: https://bugzilla.samba.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug, or are watching the QA contact.
-- 
To unsubscribe or change options: https://lists.samba.org/mailman/listinfo/rsync
Before posting, read: http://www.catb.org/~esr/faqs/smart-questions.html

Reply via email to