server was samba 4.6.7 ubuntu On Fri, Mar 23, 2018 at 6:26 PM, Steve French <smfrench@xxxxxxxxx> wrote: > I tried his test script on current mainline and didn't reproduce the problem. > > On Fri, Mar 23, 2018 at 1:43 PM, Pavel Shilovsky <piastryyy@xxxxxxxxx> wrote: >> 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 > > > > -- > Thanks, > > Steve -- Thanks, Steve -- 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