|
|
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
|