|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Eugene Grosbein 2:5006/1 24 Jan 2008 03:41:39 To : All Subject : burncd fixate problem -------------------------------------------------------------------------------- Привет! Возвращаясь к обсуждавшейся уже проблеме. Многие отмечали, что запись CD-R при помощи burncd в последний момент, во время закрытия сессии/диска возвращает ошибку уровня драйвера atapi-cd, причём конкретная ошибка отличается от драйва к драйву и вообще возникает не всегда. Hапример, может быть такая невразумительная диагностика: burncd: ioctl(CDRIOCFIXATE): Input/output error При этом, если дать драйву время - несколько секунд, дождаться окончания активности, диск оказывается записанным нормально. Дело в том, что после выдачи команды fixate драйву ядро ожидает, что функция acd_test_ready(dev) будет возвращать EBUSY в то время, когда процесс закрытия ещё идет. Hо для некоторых устройств в это время получаются другие коды возврата, например для EC DVD_RW ND-3500AG получается EIO. Этот случай драйвер atapicd пытается обработать простой паузой, надеясь, что за время паузы закрытие завершится, а после паузы ещё раз проверяет готовность драйва через acd_test_ready(dev), код возврата которой и получает burncd. Hо задержка, вычисляемая драйвером, во многих случаях получается неадекватно короткой, а вычисляет он её так: у драйва запрашивается текущая скорость. Hапример, для burncd -s max и некотором типе матриц CD-R у меня получается значение 5645. Полученное значение целочисленно делится на 177, получая скорость записи (5645/177=31.89, получаем 31). Hа полученную таким образом скорость делится пятиминутная задержка, выраженная в полусекундных единицах: 5*60*2/31=19.35, то есть 19 полусекунд или 9.5 секунды. Закрытие же для матриц из примера занимает около 28 секунд. С другой стороны, для низких скоростей получается слишком долгая задержка: при записи на CD-RW на скорости 4x драйв возвращает 706, 706/177=3.98, 5*60*2/3=200, то есть 100 секунд задежки при необходимых 62-68 секундах (подобрано экспериментально для разных типов CD-RW). Эффект одинаково проявляется и для CD-R, и для CD-RW. Одно из простых решений - увеличить задержку в пять раз и не спать это время целиком, а просыпаться дважды в секунду и проверять, не закончилось ли закрытие. Таким образом и ускоряется работа на малых скоростях и не возникает ошибок на высоких. Вот патч, у меня работает. - --- sys/dev/ata/atapi-cd.c.orig 2008-01-23 21:27:15.000000000 +0700 +++ sys/dev/ata/atapi-cd.c 2008-01-24 02:01:41.000000000 +0700 @@ -1091,8 +1091,9 @@ /* some drives just return ready, wait for the expected fixate time */ if ((error = acd_test_ready(dev)) != EBUSY) { - timeout = timeout / (cdp->cap.cur_write_speed / 177); - pause("acdfix", timeout * hz / 2); + timeout = 5 * timeout / (cdp->cap.cur_write_speed / 177); + while ((timeout-- > 0) && acd_test_ready(dev)) + pause("acdfix", hz / 2); return acd_test_ready(dev); } Eugene -- Enter old password: xxx Enter new password: yyy Confirm password: подтверждаю --- slrn/0.9.8.1 (FreeBSD) * Origin: Svyaz Service JSC (2:5006/1@fidonet) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/260935b4cb316.html, оценка из 5, голосов 10
|