как получить доступ к данным на RAID10 (состоящем из 2 дисков), используя только 1 диск?

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

В частности, смещение поиска, адрес буфера и размер ввода-вывода должны быть кратны 4096 (или другой степени двойки в зависимости от устройства).

Если вы измените свой код, удалив текущее объявление liveBuffer и включив следующий код в начале, вы обнаружите, что он работает.

#define PAGE 4096
#define STARTBYTE (272384/PAGE*PAGE) // must align
#define OFFSET (272384-STARTBYTE)
#define ITEMSIZE (sizeof(*liveBuffer))
#define LIVEBUFSIZE ((OFFSET+NUM_VARS*ITEMSIZE+PAGE-1)/PAGE*PAGE)

signed short *liveBuffer;
if(posix_memalign((void**)&liveBuffer, PAGE, LIVEBUFSIZE)!=0)
   exit(5);
if (fcntl(fileno(input), F_SETFL, O_DIRECT) == -1)
   exit(6);

Теперь вы должны fread() использовать LIVEBUFSIZE/ITEMSIZE, а не NUM_VARS. Поскольку STARTBYTE должен быть выровнен, теперь вам нужно начать дальше в массиве liveBuffer по адресу OFFSET/ITEMSIZE, чтобы найти нужные данные. Вы также должны изменить все вызовы, чтобы проверить правильные коды возврата.

1
15.09.2015, 11:15
0 ответов

Теги

Похожие вопросы