Bug 2929

Summary: Чувствительность к регистру названий файлов на смонтированном ресурсе
Product: CIFS@Etersoft Reporter: Vitaly Lipatov <lav>
Component: блокировки файлов и доступAssignee: Евгений Синельников <sin>
Status: CLOSED FIXED QA Contact:
Severity: critical    
Priority: P3 CC: baraka, kipruss, lbeasty, night, piastry
Version: не указана   
Target Milestone: ---   
Hardware: PC   
OS: Ubuntu   
URL: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/220658
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 2822    

Description Vitaly Lipatov 2008-11-16 21:56:30 MSK
# 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) - нет.
Comment 1 Vitaly Lipatov 2008-11-16 22:00:33 MSK
На ALT такой эффект достигается монтированием с параметром nocase.
Comment 2 Vitaly Lipatov 2008-11-16 22:06:43 MSK
(In reply to comment #1)
> На ALT такой эффект достигается
> монтированием с параметром nocase.
Но при этом начинает и cat видеть файл, а в на Ubuntu - нет.

Comment 3 Евгений Синельников 2008-11-16 23:39:33 MSK
А можно получить лог сборки модуля под убунту со всеми предупреждениями компилятора?
Comment 4 Vitaly Lipatov 2008-11-16 23:58:58 MSK
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'
Comment 5 Konstantin Baev 2008-11-17 17:52:03 MSK
Я воспроизвел описанное в заглавном сообщении под 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
Comment 6 Konstantin Baev 2008-11-17 18:17:37 MSK
Более того, [ -f test ] возвращает 0 на Убунту на примонтированной шаре по CIFS (независимо от драйвера), если существует файл tEsT и не существует файла test.

Нашлась бага соответствующая на лаунчпаде: stat broken for CIFS filesystem

https://bugs.launchpad.net/ubuntu/+source/linux/+bug/220658
Comment 7 Vitaly Lipatov 2008-11-17 18:35:11 MSK
Постановка задачи: нужно проверить наличие файла.
Текущая проверка через stat обламывает wine, потому что
из-за баги stat говорит, что файл есть, а open его потом не открывает.

Что, для проверки наличия файла open использовать, или есть варианты эффективнее?
Comment 8 Konstantin Baev 2008-11-17 19:08:21 MSK
Надо выставить 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
Comment 9 Konstantin Baev 2008-11-17 19:20:24 MSK
вот ещё дона ссылка на багу на лаунчпаде:

SMB Sharing not case sensitive

https://bugs.launchpad.net/ubuntu/+source/samba/+bug/132233
Comment 10 Konstantin Baev 2008-11-17 19:25:23 MSK
(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"

Comment 11 Vitaly Lipatov 2008-11-27 16:28:01 MSK
Хотелось бы по этой баге увидеть тест в RECT и заключение - где
находится проблема, в SAMBA, в CIFS, в ядре Ubuntu.
Comment 12 Andrey Vusik 2008-12-05 11:38:37 MSK
(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-машин заходит нормально.
Comment 13 Andrey Vusik 2008-12-06 13:02:27 MSK
Есть запись
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/220658
Comment 14 Konstantin Baev 2008-12-07 01:13:59 MSK
(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
> 

Comment 15 Konstantin Baev 2008-12-16 18:27:25 MSK
Итак, выжимаю сюда результаты двухдневной работы (хотя патчик получился маленький):

полный вариант в рассылке, тема: [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 ядра.

А то, получается или они не знали, что конфигурили, или это у них фича такая странная.
Comment 16 Konstantin Baev 2008-12-16 18:32:55 MSK
Забыл указать, что это реализовано в etercifs-4.0.1