Ключевые слова:disk, bsd, ioctl, (найти похожие документы)
- RU.UNIX (2:5077/15.22) -------------------------------------------- RU.UNIX -
From : Aleksey Fedorov 2:5025/3.7 14 Apr 00 13:13:16
Subj : *bsd* disk size - размер конкретного слайса в разделе
-------------------------------------------------------------------------------
Hello Andy!
At 13 Apr 00 14:16:28, Andy Igoshin wrote to All:
[...]
AF>> ioctl DIOCGDINFO возвращает struct disklabel. Если надо посмотреть
AF>> размер конкретного слайса в разделе, то ioctl'у нужно подсовывать имя
AF>> раздела а не слайса и уже в struct disklabel искать что надо. Это
AF>> работает даже с псевдоустройствами vn. Единственное что требуется - это
AF>> чтобы на устройстве был записан disklabel.
AI> Леш, ты сам это делал, или в теории?
Я видел как это сделано в системе amass. У них там кеш в raw разделе.
AI> Я прежде чем в конфу писать уже получил
AI> по этому ioctl disklabel. Он _всегда_ возвращает _весь_ disklabel диска
AI> подсунь ему раздел или диск. Без какого-либо указания что именно подсунуто
AI> раздел или диск (или я такового указания не нашел).
Hужно сделать fstat. Из него можно узнать номер слайса.
AI> Как делают сами fbsd'шники я уже сюда написал.
Вот пример:
>===== Start cut [partsize.c] =====<
int get_part_size(int fd)
{
struct disklabel disklab;
struct stat statbuf;
int ret;
int partno;
int size;
if (fstat ( fd, &statbuf)==-1)
{
printf("Fstat failed; %s\n",strerror(errno));
}
if (! S_ISCHR (statbuf.st_mode ))
{
printf("Not char special device\n");
return 0;
}
if ((ret = ioctl(fd,(int) DIOCGDINFO, &disklab)) == -1)
{
printf("Ioctl to read cache partition size failed; %s",
strerror(errno));
return 0;
}
if ( disklab.d_magic != DISKMAGIC ||
disklab.d_npartitions > MAXPARTITIONS )
{
printf("Bad disklabel\n");
return 0;
}
partno = statbuf.st_rdev & 0x7;
size = disklab.d_partitions[partno].p_size;
return size;
}
>===== End cut [partsize.c] =====<
Размер естественно в блоках.
--- QDed alpha v3.57pl9.1g / FreeBSD / COMPAQ Proliant 1850R * Origin: Воронежсвязьинформ ISP (2:5025/3.7)