При использовании 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) проблемы нет.
Тест: cifs/lincifs4.c в репозитории git.office:/projects/wine/wine-etersoft-devel.git
Проблема в следующем: в ядре 2.6.39 появился новый флаг, актуальный при открытии файла: +#ifndef O_PATH +#define O_PATH 010000000 +#endif + Данный флаг используется для того, чтобы получить дескриптор для чтения атрибутов файла и любые операции вроде read/write/lseek/ioct выдают на нём ошибку -EBADF. Соответственно, ((~0 & 7) << 21) его включает и получается, не то, что требуется. В данной ситуации видится только один выход - подвинуть наши флаги. Причём, лучше убрать их в самый конец, чтобы подольше избежать подобных ситуаций.
Поэтому, данный вызов падает не только на CIFS, но и на всех ядерных файловых системах, так как обработка нового флага происходит в VFS.
Обсудили с amorozov@ ситуацию. Надо будет согласовать изменения в CIFS и WINE, чтобы в последнем можно было различать какое смещение использовать.
Написал письмо в devel@.
Ответил в devel@.
Поправил сдвиг с 21 на 28 во всех ветках в репозитории cifs-2.6. Обновил ветку master в репозитории etercifs.
Собрал etericifs-5.0.0 с необходимыми исправлениями (сдвиг на 28). amorozov@, надо поправить соответствующий кода в wine.
Решена.
Добавил поддержку etercifs-5.0.0 в wine. Чтобы работало, надо собрать новую закрытую часть.
Теперь работает. Ядро 2.6.39-std-def-alt2.1, etercifs-5.0.0-alt1. Монтирование производилось командой etermount //192.168.4.181/share /mnt/winxp
1.0.12-eter13.2/26