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