Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 burncd fixate problem   Eugene Grosbein   24 Jan 2008 03:41:39 
Архивное /ru.unix.bsd/260935b4cb316.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional