2014-02-25 4 views
6

Kann jemand den Code zur Verfügung stellen, um dieses Problem zu lösen?Abrufen von Dateideskriptoren und Details im Kernelraum ohne Öffnen()

Effektiv wie erhalten wir die struct inode* von Kernel-Ebene angesichts der Datei /dev/driver1?

im User-Space Da:

int fd; 
fd = open("/dev/driver1", O_RDWR | O_SYNC); 

In Kernel Raum:

static long dev_ioctl(struct file *file, unsigned cmd, unsigned long arg) 
struct dev_handle *handle; 
handle = file->private_data;  

dass Angenommen, wir gehen nicht von diesem Pfad,

Wie wir innerhalb des Kernels erhalten selbst, durch zB. hart codieren die file->private_data zur Hand gegeben werden?

+2

Warum benötigen Sie die Datei-Deskriptor-Nummer? Das sollte Ihr Dateisystemcode nicht wissen müssen. – tangrs

+0

Ich weiß, aber einige hochrangige Typ spezifiziert die Anforderungen. Niemand kann es ändern. – Babbit

+1

Was sind diese Anforderungen? Das klingt wie ein XY-Problem. – tangrs

Antwort

2

Sie suchen nach filp_open Funktion. Aus Datei include/linux/fs.h:

struct file *filp_open(const char *filename, int flags, umode_t mode); 

Hier ist ein Link Quelle und Dokumentation funktionieren: http://lxr.free-electrons.com/source/fs/open.c#L937

Wenn Sie wirklich FD benötigen, können Sie verwenden sys_open (nicht in neuerer Kernel exportiert):

long sys_open(const char __user *filename, int flags, int mode); 

Sie können eine sehr gute Antwort auf eine ähnliche Frage finden: How to read/write files within a Linux kernel module?

Edit (wie inode zu bekommen):

Sie im Cache erhalten können inode von struct file:

struct file *file = ...; 
struct inode *inode = file->inode; 

Wenn Sie es mit Verriegelungs wollen: hier ist ein Hintergrund: Documentation/filesystems/path-lookup.txt

Der Ausgangspunkt zum Verfahren ist current->fs->root. Es gibt eine Reihe von Funktionen im Kernel, die bereits die Arbeit erledigen, Sie können sie in fs/namei.c Quelldatei finden.

Es gibt eine Funktion: kern_path:

int error; 
struct inode *inode; 
struct path path; 

error = kern_path(pathname, LOOKUP_FOLLOW, &path); 
if (error) ...; 

inode = path.dentry->d_inode; 
+1

Dies scheint eine 'struct file *' oder ein 'fd' zu ergeben, und nicht ein' struct inode * ', was das OP wollte. – abligh

+1

Wie können wir den 'struct inode *' bekommen? – Babbit

1

Der Code ist in der dev_ioctl Funktion? Wenn ja, dann

static long dev_ioctl(struct file *file, unsigned cmd, unsigned long arg) 
    struct dev_handle *handle; 
    struct inode *inode; 
    handle = file->private_data;  
    inode = file->f_inode; 

Es scheint für die Verriegelung Anforderungen keine vernünftige Dokumentation zu sein, so sollten Sie vielleicht versuchen, eine ähnlichen Code zu graben und sehen, wie es auf das f_inode Mitglied arbeitet.

+1

Nein, _ioctl wird nicht aufgerufen. – Babbit

Verwandte Themen