2018-03-23 11:26 GMT-07:00 Pavel Shilovsky <piastryyy@xxxxxxxxx>: > 2018-03-22 20:34 GMT-07:00 Xiong Zhou <xzhou@xxxxxxxxxx>: >> On Fri, Mar 23, 2018 at 03:08:53AM +0000, Steve French wrote: >>> Do you mean smb2 vs smb3 dialect? Or do you mean the 10 year old samba >>> server >> >> I mean this: >> " >> vers= >> SMB protocol version. Allowed values are: >> · 1.0 - The classic CIFS/SMBv1 protocol. This is the default. >> · 2.0 - The SMBv2.002 protocol. This was initially introduced in Windows Vista Service Pack 1, and Windows Server 2008. Note that the >> initial release version of Windows Vista spoke a slightly different dialect (2.000) that is not supported. >> · 2.1 - The SMBv2.1 protocol that was introduced in Microsoft Windows 7 and Windows Server 2008R2. >> · 3.0 - The SMBv3.0 protocol that was introduced in Microsoft Windows 8 and Windows Server 2012. >> " >> >> Do you mean v2 is not worth the time.. >> >> Thanks, >> Xiong >> >>> >>> On Thu, Mar 22, 2018, 22:05 Xiong Zhou <xzhou@xxxxxxxxxx> wrote: >>> >>> > Hi, >>> > >>> > Process A open(2) file1 in samba 2.0 cifs mountpoint then sleep. >>> > Process B try to open(2) the same file1. B is blocked in open >>> > until A stops sleep and exit. >>> > >>> > O_NONBLOCK is not working either. >>> > >>> > This does not happen on samba 3.0. >>> > >>> > Reproduced on 4.16-rc5 Linus tree. >>> > >>> > Thanks, >>> > Xiong >>> > >>> > Reproducer: >>> > >>> > --------------------- start test.sh ------------------------------ >>> > #! /bin/bash >>> > >>> > err_exit() { echo -e $1; exit 1; } >>> > >>> > setup_cifs() >>> > { >>> > local cifs_tst_export=/export/cifstest >>> > local cifs_sch_export=/export/cifsscratch >>> > mkdir -p $cifs_tst_export $cifs_sch_export >>> > >>> > \cp -f /etc/samba/smb.conf{,.bak} >>> > cat > /etc/samba/smb.conf << EOF >>> > [test] >>> > path = $cifs_tst_export >>> > writeable = yes >>> > [scratch] >>> > path = $cifs_sch_export >>> > writeable = yes >>> > EOF >>> > which systemctl && systemctl restart smb > /dev/null 2>&1 >>> > service stop smb > /dev/null 2>&1 >>> > restorecon /etc/samba/smb.conf >>> > testparm -s >>> > chcon -t samba_share_t $cifs_sch_export >>> > chcon -t samba_share_t $cifs_tst_export >>> > echo -e "redhat\nredhat" | smbpasswd -a root >>> > service start smb > /dev/null 2>&1 >>> > } >>> > >>> > preset_cifs() >>> > { >>> > local vers=${1:-3.0} >>> > echo Testing $vers >>> > TEST_DEV=//localhost/test >>> > SCRATCH_DEV=//localhost/scratch >>> > TEST_DIR=/cifsmnt >>> > SCRATCH_MNT=/cifssch >>> > umount $TEST_DEV $SCRATCH_DEV $TEST_DIR $SCRATCH_MNT > /dev/null >>> > 2>&1 >>> > mkdir -p $TEST_DIR $SCRATCH_MNT >>> > MOUNT_OPTIONS="-o vers=${vers},username=root,password=redhat" >>> > TEST_FS_MOUNT_OPTS="-o vers=${vers},username=root,password=redhat" >>> > >>> > mount.cifs $TEST_DEV $TEST_DIR $MOUNT_OPTIONS || err_exit "cifs >>> > mount $TEST_DEV failed" >>> > mount.cifs $SCRATCH_DEV $SCRATCH_MNT $MOUNT_OPTIONS || err_exit >>> > "cifs mount $SCRATCH_DEV failed" >>> > } >>> > >>> > cleanup_cifs() >>> > { >>> > umount $SCRATCH_MNT $TEST_DIR >>> > \cp -f /etc/samba/smb.conf{.bak,} >>> > which systemctl && systemctl restart smb >>> > service stop smb > /dev/null 2>&1 >>> > service start smb > /dev/null 2>&1 >>> > } >>> > >>> > do_test() >>> > { >>> > touch $SCRATCH_MNT/testfile >>> > mount | grep $SCRATCH_MNT >>> > ./open_wait $SCRATCH_MNT/testfile & >>> > ./open $SCRATCH_MNT/testfile >>> > echo "" >>> > wait >>> > } >>> > >>> > rpm -qv cifs-utils || yum intsall -y cifs-utils >>> > rpm -qv samba || yum intsall -y samba samba-client >>> > setup_cifs >>> > cc open_wait.c -o open_wait >>> > cc open.c -o open >>> > preset_cifs 3.0 >>> > do_test >>> > preset_cifs 2.0 >>> > do_test >>> > preset_cifs 2.1 >>> > do_test >>> > preset_cifs 1.0 >>> > do_test >>> > cleanup_cifs >>> > rm -f open_wait open a.out >>> > exit >>> > --------------------- end test.sh ------------------------------ >>> > --------------------- start open.c ------------------------------ >>> > #ifndef _GNU_SOURCE >>> > #define _GNU_SOURCE >>> > #endif >>> > #include <unistd.h> >>> > #include <fcntl.h> >>> > #include <errno.h> >>> > #include <stdio.h> >>> > #include <unistd.h> >>> > #include <string.h> >>> > #include <stdlib.h> >>> > #include <sched.h> >>> > #include <sys/stat.h> >>> > #include <sys/types.h> >>> > #include <sys/wait.h> >>> > #include <sys/ipc.h> >>> > #include <sys/sem.h> >>> > >>> > static int fd; >>> > >>> > static void err_exit(char *op, int errn) >>> > { >>> > fprintf(stderr, "%s: %s\n", op, strerror(errn)); >>> > if (fd > 0) >>> > close(fd); >>> > exit(errn); >>> > } >>> > >>> > int main(int argc, char **argv) >>> > { >>> > struct timeval tv1, tv2; >>> > long double t1, t2; >>> > >>> > gettimeofday(&tv1, NULL); >>> > //fd = open(argv[1], O_RDWR|O_NONBLOCK); >>> > fd = open(argv[1], O_RDWR); >>> > gettimeofday(&tv2, NULL); >>> > >>> > t1 = (long double)(tv1.tv_sec) + (long >>> > double)(tv1.tv_usec/1000000.0); >>> > t2 = (long double)(tv2.tv_sec) + (long >>> > double)(tv2.tv_usec/1000000.0); >>> > printf("open %s: %llf seconds\n", argv[1], t2 - t1); >>> > err_exit("open", errno); >>> > } >>> > --------------------- end open.c ------------------------------ >>> > --------------------- start open_wait.c ------------------------------ >>> > #ifndef _GNU_SOURCE >>> > #define _GNU_SOURCE >>> > #endif >>> > #include <errno.h> >>> > #include <stdio.h> >>> > #include <stdlib.h> >>> > #include <unistd.h> >>> > #include <sys/types.h> >>> > #include <sys/stat.h> >>> > #include <fcntl.h> >>> > >>> > static int fd; >>> > >>> > static void err_exit(char *op, int errn) >>> > { >>> > fprintf(stderr, "%s: %s\n", op, strerror(errn)); >>> > if (fd > 0) >>> > close(fd); >>> > exit(errn); >>> > } >>> > >>> > int main(int argc, char **argv) >>> > { >>> > fd = open(argv[1], O_RDWR); >>> > if (fd == -1) >>> > err_exit("open", errno); >>> > >>> > sleep(2); >>> > close(fd); >>> > return 0; >>> > } >>> > --------------------- end open_wait.c ------------------------------ > > I suspect there might be a problem with handling SMB 2.0 oplock break > by the client. Adding Ronnie and Long to take a look since they > changed the request handling code recently. > Xiong, In the meantime could you provide a kernel debug output during the execution of your test program as described in https://wiki.samba.org/index.php/LinuxCIFS_troubleshooting ? -- Best regards, Pavel Shilovsky -- To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html