# mount //cellar/sharewine /net/cifs -o file_mode=660,dir_mode=770,uid=guest,gid=guest,iocharset=utf8 $ cd /net/cifs $ touch tEsT $ ls -l -rw-r--r-- 1 guest guest 0 2008-11-16 21:51 tEsT $ cat test cat: test: No such file or directory $ stat test File: `test' Size: 0 Blocks: 0 IO Block: 16384 пустой обычный файл Device: 17h/23d Inode: 374251 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ guest) Gid: ( 1000/ guest) Access: 2008-11-16 21:51:20.000000000 +0300 Modify: 2008-11-16 21:51:20.000000000 +0300 Change: 2008-11-16 21:51:15.000000000 +0300 Таким образом, stat срабатывает регистрово-независимо, в то время как открытие файла - уже нет. Воспроизводится на Ubuntu 8.04(ядро 2.6.24-21-generic, etercifs-3.8.0-eter4ubuntu), на ALT Sisyphus(ядро 2.6.26-wks-smp-alt5, etercifs-3.8.0-alt4) - нет.
На ALT такой эффект достигается монтированием с параметром nocase.
(In reply to comment #1) > На ALT такой эффект достигается > монтированием с параметром nocase. Но при этом начинает и cat видеть файл, а в на Ubuntu - нет.
А можно получить лог сборки модуля под убунту со всеми предупреждениями компилятора?
Building for 2.6.24-21-generic Linux kernel (headers in /lib/modules/2.6.24-21-generic/build) /usr/bin/gcc make: Entering directory `/usr/src/linux-headers-2.6.24-21-generic' make: Leaving directory `/usr/src/linux-headers-2.6.24-21-generic' make: Entering directory `/usr/src/linux-headers-2.6.24-21-generic' CC [M] /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/cifsfs.o CC [M] /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/cifssmb.o /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/cifssmb.c: In function 'SMBLegacyOpen': /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/cifssmb.c:1181: warning: unused variable 'count' /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/cifssmb.c:1180: warning: unused variable 'name_len' /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/cifssmb.c:1179: warning: unused variable 'bytes_returned' /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/cifssmb.c:1178: warning: unused variable 'pSMBr' /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/cifssmb.c:1177: warning: unused variable 'pSMB' /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/cifssmb.c: At top level: /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/cifssmb.c:1140: warning: 'convert_disposition' defined but not used CC [M] /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/cifs_debug.o CC [M] /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/connect.o CC [M] /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/dir.o /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/dir.c: In function 'cifs_ci_compare': /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/dir.c:597: warning: passing argument 1 of '__constant_memcpy' discards qualifiers from pointer target type /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/dir.c:597: warning: passing argument 1 of '__memcpy' discards qualifiers from pointer target type /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/dir.c:597: warning: passing argument 1 of '__constant_memcpy' discards qualifiers from pointer target type /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/dir.c:597: warning: passing argument 1 of '__memcpy' discards qualifiers from pointer target type CC [M] /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/file.o CC [M] /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/inode.o ... CC [M] /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/cifsacl.o CC [M] /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/cifs_spnego.o /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/cifsacl.c:200: warning: 'mode_to_access_flags' defined but not used LD [M] /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/etercifs.o Building modules, stage 2. MODPOST 1 modules CC /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/etercifs.mod.o LD [M] /tmp/Etercifs.yPR20312/kernel-source-etercifs-2.6.24-1.52/etercifs.ko make: Leaving directory `/usr/src/linux-headers-2.6.24-21-generic'
Я воспроизвел описанное в заглавном сообщении под Kubuntu 8.10 (ядро 2.6.27-7-generic), причем _независимо_ от того, какой драйвер загружен: etercifs или ядерный cifs. -- etercifs -- root@Kubuntu-8:/home# lsmod | grep eter etercifs 253940 0 root@Kubuntu-8:/home# mount -t cifs //10.0.2.2/public /home/kipruss/upload/ -o file_mode=0660,dir_mode=0770,uid=kipruss,gid=kipruss,iocharset=utf8 Password: root@Kubuntu-8:/home# cd /home/kipruss/upload/ root@Kubuntu-8:/home/kipruss/upload# ls -l tEsT -rw-r--r-- 1 kipruss kipruss 0 2008-11-17 17:30 tEsT root@Kubuntu-8:/home/kipruss/upload# cat tEsT root@Kubuntu-8:/home/kipruss/upload# cat test cat: test: No such file or directory root@Kubuntu-8:/home/kipruss/upload# stat test File: `test' Size: 0 Blocks: 0 IO Block: 16384 пустой обычный файл Device: 15h/21d Inode: 18726 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ kipruss) Gid: ( 1000/ kipruss) Access: 2008-11-17 17:30:56.000000000 +0300 Modify: 2008-11-17 17:30:56.000000000 +0300 Change: 2008-11-17 17:31:04.000000000 +0300 root@Kubuntu-8:/home/kipruss/upload# cd .. root@Kubuntu-8:/home/kipruss# umount upload/ -- cifs -- root@Kubuntu-8:/home/kipruss# /etc/init.d/etercifs stop Unmounting CIFS resources... [ DONE ] Unloading CIFS kernel module... [ DONE ] root@Kubuntu-8:/home/kipruss# mount -t cifs //10.0.2.2/public /home/kipruss/upload/ -o file_mode=0660,dir_mode=0770,uid=kipruss,gid=kipruss,iocharset=utf8,guest root@Kubuntu-8:/home/kipruss# cd upload/ root@Kubuntu-8:/home/kipruss/upload# ls -l tEsT -rw-r--r-- 1 kipruss kipruss 0 2008-11-17 17:30 tEsT root@Kubuntu-8:/home/kipruss/upload# cat tEsT root@Kubuntu-8:/home/kipruss/upload# cat test cat: test: No such file or directory root@Kubuntu-8:/home/kipruss/upload# stat test File: `test' Size: 0 Blocks: 0 IO Block: 16384 пустой обычный файл Device: 15h/21d Inode: 18829 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ kipruss) Gid: ( 1000/ kipruss) Access: 2008-11-17 17:30:56.000000000 +0300 Modify: 2008-11-17 17:30:56.000000000 +0300 Change: 2008-11-17 17:31:04.000000000 +0300 root@Kubuntu-8:/home/kipruss/upload# lsmod | grep cifs cifs 254964 1
Более того, [ -f test ] возвращает 0 на Убунту на примонтированной шаре по CIFS (независимо от драйвера), если существует файл tEsT и не существует файла test. Нашлась бага соответствующая на лаунчпаде: stat broken for CIFS filesystem https://bugs.launchpad.net/ubuntu/+source/linux/+bug/220658
Постановка задачи: нужно проверить наличие файла. Текущая проверка через stat обламывает wine, потому что из-за баги stat говорит, что файл есть, а open его потом не открывает. Что, для проверки наличия файла open использовать, или есть варианты эффективнее?
Надо выставить case sensitive = yes на самбе, тогда stat будет работать как нужно. Если это ничего другого не сломает - то вот и workaround [kipruss@valhalla ~]$ sudo mcedit /etc/samba/smb.conf | grep sensi # Be very careful with case sensitivity - it can break things! case sensitive = yes
вот ещё дона ссылка на багу на лаунчпаде: SMB Sharing not case sensitive https://bugs.launchpad.net/ubuntu/+source/samba/+bug/132233
(In reply to comment #9) > SMB Sharing not case sensitive Вот 2 фразы оттуда: "I've just added "case sensitive = yes" to my smb.conf and it works well now." "The default value of the case sensitive option is auto"
Хотелось бы по этой баге увидеть тест в RECT и заключение - где находится проблема, в SAMBA, в CIFS, в ядре Ubuntu.
(In reply to comment #10) > (In reply to comment #9) > > SMB Sharing not case sensitive > > Вот 2 фразы оттуда: > > "I've just added "case sensitive = yes" to my smb.conf and it works well now." > > "The default value of the case sensitive option is auto" > Проверял в 1с с выставленным на cellar "case sensitive = yes": Захожу с Windows - "Ошибка загрузки метаданных", С Ubuntu и других Linux-машин заходит нормально.
Есть запись https://bugs.launchpad.net/ubuntu/+source/linux/+bug/220658
(In reply to comment #13) > Есть запись > https://bugs.launchpad.net/ubuntu/+source/linux/+bug/220658 > Я вроде бы уже приводил эту ссылку в этой баге ранее: (In reply to comment #6) > ... > Нашлась бага соответствующая на лаунчпаде: > stat broken for CIFS filesystem > > https://bugs.launchpad.net/ubuntu/+source/linux/+bug/220658 >
Итак, выжимаю сюда результаты двухдневной работы (хотя патчик получился маленький): полный вариант в рассылке, тема: [Devel] Ubuntu: stat + cifs Выявлено, что ошибка проявляется в нескольких версиях Ubuntu и в Slackware 12.1. Сделано предположение, что это зависит от конфигурации ядра. Опытным путем это было подтверждено. В результате добавился патч, включающий два параметра в коде cifs, если они не включены: Надо добавить в файл cifspdu.h строки: #ifndef CONFIG_CIFS_XATTR #define CONFIG_CIFS_XATTR #endif #ifndef CONFIG_CIFS_POSIX #define CONFIG_CIFS_POSIX #endif Послал свой комментарий в Лаунчпад: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/220658/comments/14 где посоветовал конфигурить ядро с поддержкой POSIX-расширений, то есть со строками: CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y в файле .config ядра. А то, получается или они не знали, что конфигурили, или это у них фича такая странная.
Забыл указать, что это реализовано в etercifs-4.0.1