Re: the second open(2) call to file in samba 2.0 cifs mountpoint hang

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux