Bug 7476

Summary: Не создаются файлы при использовании ядра 2.6.39-std-def-alt2.1
Product: CIFS@Etersoft Reporter: Александр Морозов <amorozov>
Component: блокировки файлов и доступAssignee: Pavel Shilovsky <piastry>
Status: CLOSED FIXED QA Contact:
Severity: major    
Priority: P4 CC: kondratyuk, lav, sin, sonner
Version: не указана   
Target Milestone: ---   
Hardware: PC   
OS: Linux   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 3043, 3044    
Deadline: 2011-09-05   

Description Александр Морозов 2011-07-25 21:31:24 MSK
При использовании etercifs-4.8.2-alt1 и ядра 2.6.39-std-def-alt2.1 системный вызов
open("testfile", O_RDWR | O_CREAT | O_NOCTTY | O_NONBLOCK | O_LARGEFILE | ((~0 & 7) << 21), 0666)
завершается с ошибкой, если файла testfile не существует. Из-за этого возникают проблемы с работой 1С 8.1:

trace:file:CreateFileW L"F:/base/1Cv8.1CL" GENERIC_READ GENERIC_WRITE  creation 5 attributes 0x0
trace:file:RtlDosPathNameToNtPathName_U (L"F:/base/1Cv8.1CL",0x32dfb0,(nil),(nil))
trace:file:RtlGetFullPathName_U (L"F:/base/1Cv8.1CL" 520 0x32dccc (nil))
trace:file:wine_nt_to_unix_file_name L"\\base\\1Cv8.1CL" not found in /home/amorozov/.wine/dosdevices/f:/base
warn:file:CreateFileW Unable to create file L"F:/base/1Cv8.1CL" (status c0000034)
trace:file:CreateFileW returning 0xffffffff
trace:file:CreateFileW L"F:/base/1Cv8.1CL" GENERIC_READ GENERIC_WRITE  creation 4 attributes 0x0
trace:file:RtlDosPathNameToNtPathName_U (L"F:/base/1Cv8.1CL",0x32dfb0,(nil),(nil))
trace:file:RtlGetFullPathName_U (L"F:/base/1Cv8.1CL" 520 0x32dccc (nil))
trace:file:wine_nt_to_unix_file_name L"\\??\\F:\\base\\1Cv8.1CL" -> "/home/amorozov/.wine/dosdevices/f:/base/1Cv8.1CL"
warn:file:CreateFileW Unable to create file L"F:/base/1Cv8.1CL" (status c000000f)
trace:file:CreateFileW returning 0xffffffff

При запуске на NFS файл создаётся:

trace:file:CreateFileW L"C:/base/1Cv8.1CL" GENERIC_READ GENERIC_WRITE  creation 5 attributes 0x0
trace:file:RtlDosPathNameToNtPathName_U (L"C:/base/1Cv8.1CL",0x32dfb0,(nil),(nil))
trace:file:RtlGetFullPathName_U (L"C:/base/1Cv8.1CL" 520 0x32dccc (nil))
trace:file:wine_nt_to_unix_file_name L"\\base\\1Cv8.1CL" not found in /home/amorozov/.wine/dosdevices/c:/base
warn:file:CreateFileW Unable to create file L"C:/base/1Cv8.1CL" (status c0000034)
trace:file:CreateFileW returning 0xffffffff
trace:file:CreateFileW L"C:/base/1Cv8.1CL" GENERIC_READ GENERIC_WRITE  creation 4 attributes 0x0
trace:file:RtlDosPathNameToNtPathName_U (L"C:/base/1Cv8.1CL",0x32dfb0,(nil),(nil))
trace:file:RtlGetFullPathName_U (L"C:/base/1Cv8.1CL" 520 0x32dccc (nil))
trace:file:wine_nt_to_unix_file_name L"\\??\\C:\\base\\1Cv8.1CL" -> "/home/amorozov/.wine/dosdevices/c:/base/1Cv8.1CL"
trace:file:CreateFileW returning 0x404

Монтирование производилось командой
etermount //192.168.4.181/share2 /mnt/winxp
192.168.4.181 - система Windows XP SP3 на virtualbox

На ядре 2.6.32-5-686 (debian 6.0.2 x32 на virtualbox) проблемы нет.
Comment 1 Александр Морозов 2011-07-25 21:35:47 MSK
Тест: cifs/lincifs4.c в репозитории git.office:/projects/wine/wine-etersoft-devel.git
Comment 2 Pavel Shilovsky 2011-07-27 14:03:00 MSK
Проблема в следующем: в ядре 2.6.39 появился новый флаг, актуальный при открытии файла:

+#ifndef O_PATH
+#define O_PATH         010000000
+#endif
+

Данный флаг используется для того, чтобы получить дескриптор для чтения атрибутов файла и любые операции вроде read/write/lseek/ioct выдают на нём ошибку -EBADF.

Соответственно, ((~0 & 7) << 21) его включает и получается, не то, что требуется.

В данной ситуации видится только один выход - подвинуть наши флаги. Причём, лучше убрать их в самый конец, чтобы подольше избежать подобных ситуаций.
Comment 3 Pavel Shilovsky 2011-07-27 14:05:47 MSK
Поэтому, данный вызов падает не только на CIFS, но и на всех ядерных файловых системах, так как обработка нового флага происходит в VFS.
Comment 4 Pavel Shilovsky 2011-07-27 14:24:12 MSK
Обсудили с amorozov@ ситуацию. Надо будет согласовать изменения в CIFS и  WINE, чтобы в последнем можно было различать какое смещение использовать.
Comment 5 Pavel Shilovsky 2011-08-02 10:30:18 MSK
Написал письмо в devel@.
Comment 6 Pavel Shilovsky 2011-08-21 20:06:13 MSK
Ответил в devel@.
Comment 7 Pavel Shilovsky 2011-08-31 23:06:03 MSK
Поправил сдвиг с 21 на 28 во всех ветках в репозитории cifs-2.6. Обновил ветку master в репозитории etercifs.
Comment 8 Pavel Shilovsky 2011-09-05 17:24:02 MSK
Собрал etericifs-5.0.0 с необходимыми исправлениями (сдвиг на 28). amorozov@, надо поправить соответствующий кода в wine.
Comment 9 Pavel Shilovsky 2011-09-05 17:26:39 MSK
Решена.
Comment 10 Александр Морозов 2011-09-06 19:48:25 MSK
Добавил поддержку etercifs-5.0.0 в wine. Чтобы работало, надо собрать новую закрытую часть.
Comment 11 Александр Морозов 2011-09-28 20:04:22 MSK
Теперь работает.
Ядро 2.6.39-std-def-alt2.1, etercifs-5.0.0-alt1.
Монтирование производилось командой
etermount //192.168.4.181/share /mnt/winxp
Comment 12 Александр Морозов 2011-09-28 20:04:54 MSK
1.0.12-eter13.2/26