'2019/06'에 해당되는 글 '1'건

kernel의 I/O stack은 VFS->Filesystem->Block->driver 의 계층으로 이루어지고,
각 단계에서 식별할 수 있는 filesystem 관련 kernel 자료구조들이 있다.

inode, dentry, bio, request 등의 자료구조들은 I/O stack을 거치면서 해당 stack에 맞게
처리되는데 디버깅이 필요하거나 특별한 파일을 식별하여 tracing이 필요할떄 상호간에 변환이
필요한 경우가 있다.

예를 들어, file에 대한 요청은 filesystem을 거치면서 bio로 변환되어 block device driver로
전달되는데, 이때 어떤 파일에 대한 request인지 확인하기 위해서는 driver level에 전달된
bio를 file name, inode 등으로 변환해야할 필요가 있다는 것이다.

bio에서 inode를 추출하기 위해서 아래와 같은 과정을 거치면 된다.
#sample code

struct inode *inode_from_bio(struct bio *bio)
{
if (bio && bio_has_data(bio) && bio->bi_io_vec && bio->bi_io_vec->bv_page)          {
if (PageAnon(bio->bi_io_vec->bv_page)) {
struct inode *inode;
inode = dio_bio_get_inode(bio);
return inode;
} else {
if (page_mapping(bio->bi_io_vec->bv_page)) {
return page_mapping(bio->bi_io_vec->bv_page)->host;
}
}
}

return NULL;
}

그리고 inode에서 filename을 얻어내기 위해서 아래와 같은 코드를 사용하면 되는데, inode에는 inode와 연결된 dentry들이 list로 연결되어 있어 가능하다.


char *fname_from_inode(struct inode* inode)
{
struct dentry *dentry = NULL;
char *filename = NULL;

if (!inode)
return NULL;

if (hlist_empty(&inode->i_dentry))
return NULL;

dentry = hlist_entry(inode->i_dentry.first, struct dentry, d_u.d_alias);
filename = dentry->d_iname;

return filename;
}


2019/06/18 14:36 2019/06/18 14:36
Posted by scott