Почему во время sys_write() считывается команда SCSI?

Я хочу понять, как работает sys_write на устройстве scsi. Поэтому я написал простую тестовую программу и добавил в функцию issue драйвера устройства некоторую отладку printk() для печати файла ata_queued_cmd->scsicmd->cmnd.

int main() {
    int w;
    char buffer[512] = "test string with 512 byte";

    // OPEN
    int fd = open("/dev/sdd", O_WRONLY | O_SYNC);

    // WRITE
    w = write(fd,buffer,sizeof(buffer));

    return 0;
}

В /var/log/messages я вижу следующие выданные команды:

  scsicmd->cmnd
------------------------------
 0x28 | READ(10)
 0x2A | WRITE(10)
 0x35 | SYNCHRONIZE CACHE (10)

512 байт, которые я хочу записать, должны быть размером блока. Вот как я получаю это значение:

root$ blockdev --getsize /dev/sdd # returns size in sectors
488397168
root$ blockdev --getsize64 /dev/sdd # returns size in sectors
250059350016
root$ python -c "print 250059350016.0/488397168"
512.0

Для меня очень важно, чтобы данные записывались с защитой от сбоев питания. Вот почему я хочу дождаться возвращения с O_SYNC. Теперь у меня есть несколько вопросов:

  • Почему READ стоит перед WRITE?
  • Гарантирует ли мне SYNCHRONIZE CACHE, если данные находятся во внутреннем кеше накопителя? Или что еще я мог бы сделать, чтобы иметь безопасную запись?

Большое Вам спасибо :)


person samuirai    schedule 04.07.2012    source источник


Ответы (1)


Хорошо, я понял это сейчас. Они читают его, чтобы загрузить данные во внутренний буфер ядра, поэтому, когда у вас есть несколько операций записи/чтения, данные уже буферизованы.

person samuirai    schedule 13.07.2012