2012-07-04 1 views
0

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

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, если данные находятся во внутреннем кэше накопителя? Или я могу сделать более безопасную запись?

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

ответ

0

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