LINUX.ORG.RU

реализация системного вызова open


0

0

Я ядре, функции вызываемые косвенно из sys_open, присваивают
dentry->d_inode->f_op адрес ссответсвующей структуры фаловой систмемы к которой принадлежит открываемый файл. Таким образом при работе с файлами на reiserfs используются методы reiserfs.

А если на это reiserfs файл не регулярный, а блочное устройство, то не нужно вызывать методы reiserfs, нужно вызывать методы работы с болчным учтройством!

Я НЕ МОГУ В ЯДРЕ НАЙТИ ГДЕ ПРИСВАИВАЕТСЯ ИМЕННО УКАЗАТЕЛЬ ПРИ ОТКРЫТИИ ФАЙЛА НА МЕТОДЫ БОЛЧНЫЙ УСТРОЙСТВ А НЕ ФАЙЛОВОЙ СИТЕМЫ!!! подскажите плиз!!!!!!!

anonymous

Чувак, это называется rawdecive и тебе подходит обычный open ;)

int fd;
if((fd = open("/dev/device", O_RDWR | O_NONBLOCK))<0){
perror("/dev/device");
exit(1);
}

// тут работаем с девайсом как хотим ;)
// мы его открыли как на запись так и на чтение так что мона делать seek и писать в любое место. так как и читать

godexsoft
()
Ответ на: комментарий от cvv

А чего тут поддерживать то? Вопрос не поставлен толком.

В каком ядре, непример ? И вообще в чем задача?

В общем, можно конечно в лоб ответить что надо копать буферный кэш и VFS. Но разве это что-нибудь даст?

ЗЫ. А про sys_open можно вообще забыть, нет там этого и не будет :)

KIV
()
Ответ на: комментарий от KIV

>ЗЫ. А про sys_open можно вообще забыть, нет там этого и не будет :)

ты в отличие от некоторых хоть догадываешся о чём вообще речь идёт %-)

cvv ★★★★★
()
Ответ на: комментарий от KIV

Спросили херню.. ответили так же :)
2all: Я лично понимаю то что девайс можно открыть как файл.. это юникс.. привыкайте.

godexsoft
()
Ответ на: комментарий от cvv

>ты в отличие от некоторых хоть догадываешся о чём вообще речь идёт %-)

Ни капли. Так, написал что первое на ум пришло :)

Попросим автора уточнить вопрос, подробностями??

KIV
()

Я конечно могу быть не прав, но судя по linux/fs/reiserfs/file.c:1385 reiser open не экспортирует, поэтому проверки в open.c на f->f_op->open просто пролетают, поскольку рейзеру нефиг делать при открытии, а вот уж как чтение реализовано, надо смотреть соотв. процедуру generic_file_read

anonymous
()
Ответ на: комментарий от anonymous

в дополнение, действительно какая хрен разница в опен что открываем, inode получили и все, вот потом действительно надо соображать как читать и какой модуль за это отвечает

anonymous
()
Ответ на: комментарий от idle

2ALL, кроме idle

идиоты, не шарите и не отвечайте

2idle:

в том то и дело что файл блочного устройства распологается на какой-то файловой системе и как раз inode->i_fop ссылается на операции файловой системы (этой), а не на оперции блочного устройства. Я весь sys_open последовательно прошел до строчки которую привел ты и сделал такие выводы. ПОПРАВЬ меня если я ошибаюсь!!!

anonymous
()
Ответ на: комментарий от anonymous

> inode->i_fop ссылается на операции файловой системы (этой),
> а не на оперции блочного устройства.

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

fs/ext2/inode.c:ext2_read_inode()
        init_special_inode()
                if (S_ISBLK(mode))
                        inode->i_fop = &def_blk_fops;

idle ★★★★★
()
Ответ на: комментарий от idle

2idle:

СПАСИБО!!! Я именно это и хотел найти! Поймаю тебя ..... пиво поставлю =)

anonymous
()
Ответ на: комментарий от anonymous

>идиоты, не шарите и не отвечайте

му ха-ха какойто перец копаеться в коде ядра и уже считает всех идиотами, не много-ли самоуверенности молодой человек ? Ж-)

PS: Скромнее надо быть.

anonymous
()
Ответ на: комментарий от anonymous

2anonymous (*) (06.05.2005 19:28:09)

Господин недалекий:

когда ты спрашиваешь "сколько времени" и тебе отвечают "я уже поел"..... ты считаешь человека нормальным??? ... или таким же как ты идиотом?

anonymous
()
Ответ на: комментарий от anonymous

ну вот теперь еще и недалекий :-) Правильно Давай Все сволочи! Мочи козлов! Землю крестьянам ....

anonymous
()
Ответ на: комментарий от anonymous

у тебя нервы в порядке или как? иди почитай книжки вначале, а потом будешь тут всякими словами выражаться.

Special for dummies :

fs/reiserfs/inode.c

// called by *** read_locked_inode *** Типа sys_open да? static void init_inode (struct inode * inode, struct path * path) ... if (S_ISREG (inode->i_mode)) { inode->i_op = &reiserfs_file_inode_operations; inode->i_fop = &reiserfs_file_operations; inode->i_mapping->a_ops = &reiserfs_address_space_operations ; } else if (S_ISDIR (inode->i_mode)) { inode->i_op = &reiserfs_dir_inode_operations; inode->i_fop = &reiserfs_dir_operations; } else if (S_ISLNK (inode->i_mode)) { inode->i_op = &reiserfs_symlink_inode_operations; inode->i_mapping->a_ops = &reiserfs_address_space_operations; } else { inode->i_blocks = 0; inode->i_op = &reiserfs_special_inode_operations; // Achtung!!!! init_special_inode(inode, inode->i_mode,new_decode_dev(rdev)); }

читаем далее:

fs/inode.c

void init_special_inode(struct inode *inode, umode_t mode, dev_t rdev) { inode->i_mode = mode; if (S_ISCHR(mode)) { inode->i_fop = &def_chr_fops; inode->i_rdev = rdev; } else if (S_ISBLK(mode)) { inode->i_fop = &def_blk_fops; inode->i_rdev = rdev; } else if (S_ISFIFO(mode)) inode->i_fop = &def_fifo_fops; else if (S_ISSOCK(mode)) inode->i_fop = &bad_sock_fops; else printk(KERN_DEBUG "init_special_inode: bogus i_mode (%o)\n", mode); }

anonymous
()
Ответ на: комментарий от anonymous

у тебя нервы в порядке или как? иди почитай книжки вначале, а потом будешь тут всякими словами выражаться.

Special for dummies :

fs/reiserfs/inode.c

// called by *** read_locked_inode ***
static void init_inode (struct inode * inode, struct path * path)
...
if (S_ISREG (inode->i_mode))
{ inode->i_op = &reiserfs_file_inode_operations;
inode->i_fop = &reiserfs_file_operations;
inode->i_mapping->a_ops = &reiserfs_address_space_operations ;
} else if (S_ISDIR (inode->i_mode))
{ inode->i_op = &reiserfs_dir_inode_operations;
inode->i_fop = &reiserfs_dir_operations;
} else if (S_ISLNK (inode->i_mode))
{ inode->i_op = &reiserfs_symlink_inode_operations;
inode->i_mapping->a_ops = &reiserfs_address_space_operations;
} else
{ inode->i_blocks = 0;
inode->i_op = &reiserfs_special_inode_operations;
// Achtung!!!!
init_special_inode(inode,inode->i_mode,new_decode_dev(rdev));
}

читаем далее:

fs/inode.c

void init_special_inode(struct inode *inode, umode_t mode, dev_t rdev) { inode->i_mode = mode;
if (S_ISCHR(mode))
{ inode->i_fop = &def_chr_fops;
inode->i_rdev = rdev;
} else if (S_ISBLK(mode))
{ inode->i_fop = &def_blk_fops;
inode->i_rdev = rdev;
} else if (S_ISFIFO(mode))
inode->i_fop = &def_fifo_fops;
else if (S_ISSOCK(mode))
inode->i_fop = &bad_sock_fops;
else
printk(KERN_DEBUG "init_special_inode: bogus i_mode (%o)\n", mode);
}

anonymous
()

Афтар, выпий йаду!
Спрашивать нацчись сначало... потом использывать команду grep ;)
короче фтопку!

godexsoft
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.