Как узнать раздел? - PullRequest
       30

Как узнать раздел?

0 голосов
/ 19 ноября 2011

Я использую Linux (Ubuntu 11.10).Хорошо, когда я называю системный вызов открытым, например, в программе на Си:

size_t filedesc = open("testfile.txt",O_CREAT | O_WRONLY,0640);

Как я могу получить доступ к разделу, я имею в виду, есть ли способ вернуть используемый раздел?

Системный вызов open определен выше:

SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, int, mode)

Если я хочу, я могу поставить printk("%s",filename) и посмотреть путь.Но как мне получить доступ к разделу?

Пример: у меня есть два архива example.txt в двух разных разделах (например, / dev / sda1 и / dev / sda2).

Затем я вызываю системный вызов open: предположим, что я вызвал example.txt в разделе / ​​dev / sda2.Есть ли способ доступа к разделу (например, printk(KERN_ALERT "%s",partition)) с помощью системного вызова open?

Ответы [ 2 ]

3 голосов
/ 19 ноября 2011

Нет ничего проще, чем вы могли бы надеяться.

В функции do_sys_open() непосредственно перед return fd;, struct file *f указывает на законный, открытый, struct file.

struct file содержит struct path f_path.

struct path содержит struct vfsmount *mnt. struct vfsmount представляет каждую смонтированную файловую систему в системе.

struct vfsmount содержит struct super_block *mnt_sb.

struct super_block содержит struct block_device *s_bdev.

struct block_device содержит struct hd_struct *bd_part.

struct hd_struct содержит struct device __dev и int partno. Вместе эти два определяют, на каком разделе находится ваш файл.

Обновление

Изначально я перестал искать, когда нашел ссылки на номера устройств и разделов, так как предполагал, что это все, что нужно для того, чтобы собрать понятную человеку строку. Но когда я снова смотрю свежими глазами, я вижу, что есть еще:

* struct hd_struct содержит struct partition_meta_info *info.

struct partition_meta_info содержит поле:

    u8 volname[PARTITION_META_INFO_VOLNAMELTH];

Это поле является именем устройства, которое вы ищете.

2 голосов
/ 19 ноября 2011

Через оболочку, df /some/dir дает вам задействованную файловую систему. Программно, с помощью системного вызова stat вы получите поле st_dev.

( добавлено: ) Я не думаю, что именно вы хотите сделать, но, возможно, сделать это с помощью FUSE может быть проще.

...