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