안녕하세요. 이희태입니다.
오늘 A조 스터디 도중 어느 한 분이 vfs inode에 대한 질문을 했는데, 제가 질문을 잘못이해해서
엉뚱한 대답을 하고(그냥 inode에 대해서 얘기함), vfs inode는 어떻게 되는지 몰라서 집에가서 궁금해서 찾아봤는데요.
우선 이 사이트 참조하시구요.
https://www.win.tue.nl/~aeb/linux/lk/lk-8.html
초기 버전에는
struct inode
타입은 아래의 union u 멤버 필드를 가졌다고 합니다.
union { struct minix_inode_info minix_i; struct ext2_inode_info ext2_i; struct ext3_inode_info ext3_i; struct hpfs_inode_info hpfs_i; ... } u;
즉, inode->u.ext3_i 를 통해서 struct ext3_inode_info 정보를 가질 수 있었습니다. 이 union을 이용한 방식은
파일 시스템을 하나 발명할 때마다 union u의 멤버를 모두 수정해야하고, union u의 사이즈는 여러가지 struct ***_info 중 가장
사이즈가 큰 타입의 사이즈로 설정되는 단점이 있습니다.
그래서 리눅스 커널 2.5.3부터는 아예 VFS 부분에 이러한 파일시스템 의존적인 부분들을 따로 빼주었는데, 이 방식은
각각의 파일시스템의 inode 정보를 담는 구조체(struct ext2_inode_info, struct ext3_inode_info ....) 마다
struct inode vfs_inode; 를 추가적으로 넣어줍니다.
그리고 EXT3_I( ), EXT4_I( ), NTFS_I( )와 같은 container_of()함수를 리턴하는
인라인 코드를 통해 vfs_inode에게 해당 파일시스템의 정보를 제공해줍니다.
예)
687 static inline struct ext3_inode_info *EXT3_I(struct inode *inode) 688 { 689 return container_of(inode, struct ext3_inode_info, vfs_inode); 690 }
240 static inline ntfs_inode *NTFS_I(struct inode *inode) 241 { 242 return (ntfs_inode *)container_of(inode, big_ntfs_inode, vfs_inode); 243 }
container_of 함수는 링크 건 사이트의 설명대로
#define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );})
Thus,
container_of(x, struct inode, i_dentry)
returns the address of the inode that has an i_dentry
field with address x
.
따라서 EXT3_I( x ) 의 경우 x를 주소값으로 하는 vfs_inode 필드를 가지는 struct ext3_inode_info의 주소값을 리턴하여
해당 vfs_inode의 실제 파일시스템 정보를 얻어낼 수 있습니다.
댓글 0
.