2011-12-19 9 views
2

경로명을 얻는 방법이나 주어진 inode에서 dentry 또는 struct file을 알아야합니다.주어진 inode에서 pathname이나 dentry 또는 struct 파일을 얻는 방법은 무엇입니까?

경로 이름에서 struct file을 얻기 위해 file_open을 사용하고 있었지만 항상 커널 패닉을주었습니다. 내 inode 목록에서 inode를 pathname으로 비교하거나 디스크의 모든 inode를 비교하여 해당 경로명을 찾고 내 inode 목록과 비교할 방법이 필요합니다.

답변

0

일반적으로 매우 어렵습니다.

아이 노드에는 수천 개의 경로 이름이있을 수 있습니다. 모든 이름은 똑같이 "유효"합니다. 다중 링크를 지원하지 않는 파일 시스템 일지라도 파일은 시스템의 다른 곳으로 수천 번 바인드 마운트 될 수 있습니다. 모두 AppArmorTOMOYOmandatory access control 시스템

는 패스에 의존 -하지만있는 거대한 차이 : 액세스 제어는 특정 이름으로 개설 된 특정 파일 기술자, 수행하고, 두 도구는 를 사용하는 특정 이름. 추가 지원 정보를 제공 - 아이 노드에서 경로 이름을 찾기에 대한 자세한 내용은 security/apparmor/path.c 기능 aa_get_name() 또는 security/tomoyo/file.c 기능 tomoyo_get_realpath()

봐. 그냥 평범한 inode 객체에서부터, 아마도 당신은 운이 좋지 않을 것입니다.

+0

내 작업은 주어진 파일을 읽고 쓰는 것을 차단하는 시스템 호출을 만드는 것입니다. 다음을 구현합니다 : filp_open 함수에 의해 생성 된 inode를 잡은 시스템 호출에 대한 Path 매개 변수를 설정하십시오 (경로, O_CREAT, 00777) (이 작품)을 읽고 링크 된 목록에 추가하십시오. 그렇다면이 파일의 경로를 가져온 inode를 매개 변수로 사용하고, 그렇지 않으면 1을 반환하고 그렇지 않으면 0을 반환하는 함수를 만들었습니다. 이 함수를 open() 시스템 호출 내에 배치하지만 filp_open (path, FLAG, x) 다음에 filp_close()가 오면 다음 오류가 발생합니다. – Leonardo

+0

O_CREAT FLAG = x = 00777 -> 커널 메모리가 곧 커널 부트를 채 웁니다. FLAG = 0 및 x = O_RDONLY -> 커널 부트시 커널 패닉 – Leonardo

+0

아마이 설명으로 원래의 질문을 편집하는 편이 낫습니다. 주석 상자에 들어 맞는 내용을 작성하는 것은 대단히 어렵지 만 여전히 읽을 만합니다. :) – sarnold

1

이 샘플 코드는 각각의 아이 노드 객체가 하나 이상의 dentries있을 것이다 리눅스 커널 버전 2.6.xx

struct dentry *sample_dentry = NULL; 
struct inode *tmp_inode = &inode_need_to_get; 
struct list_head *tmp_list = NULL; 
list_for_each(tmp_list, &(tmp_inode->i_dentry)) 
{ 
    sample_dentry = list_entry(tmp_list, struct dentry, d_alias); 
    printk(KERN_EMERG, "name of file is %s\n", sample_dentry->d_iname); 
} 

에서 잘 작동이 경우이 파일이 하드 링크가 오브젝트.