bio의 inode number 출력
현재 커널내에서 read write가 발생시 그에(디스크에서 파일 write,read) 대한 bio의 inode 정보를 가져오려고하는데요..
bio가 생성되는 submit_bio함수에서
if(bio->bi_io_vec->bv_page->mapping->host)
inode = bio->bi_io_vec->bv_page->mapping->host;
printk("%ld", inode->i_ino);
이런식으로 출력을 해보려고하는데 커널 패닉이 나네요.
submit_bio함수에서는 inode로 접근이 안되는건가요?.. 혼자 해결하려다보니 한계가 있어서 결국 선배님들께 여쭤봅니다.. 답변기다리겠습니다..
/* 커널 패닉 메시지 */
///////////
Modules linked in: dm_mod asus_atk0110 pcspkr i2c_i801 iTCO_wdt iTCO_vendor_support atl1e sg snd_hda_codec_realtek snd_hda_intel snd_hda_codec snd_hwdep snd_seq snd_seq_device snd_pcm snd_timer snd soundcore snd_page_alloc ext4 mbcache jbd2 floppy sr_mod cdrom firewire_ohci firewire_core crc_itu_t sd_mod crc_t10dif ata_piix ata_generic pata_acpi pata_marvell nouveau ttm drm_kms_helper drm i2c_algo_bit i2c_core [last unloaded: scsi_wait_scan]
Pid: 790, comm: vgs Tainted: G D 2.6.35.7 #9 P5Q-PRO/P5Q-PRO
RIP: 0010:[] [] submit_bio+0xc7/0x180
RSP: 0018:ffff880124bb9b68 EFLAGS: 00010282
RAX: 5800000000006700 RBX: ffff8801269e2680 RCX: 0000000000000000
RDX: 0000000000000008 RSI: ffff880123ef7410 RDI: ffffffff817a4522
RBP: ffff880124bb9ba8 R08: 0000000000000000 R09: 0000000000000000
R10: 0000000000000000 R11: 0000000000000207 R12: 0000000000000000
R13: ffff8801256b5d20 R14: 0000000000000001 R15: 000000000000000c
FS: 00007f1e34f0e7a0(0000) GS:ffff880002500000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00007f9b7f60c000 CR3: 00000001292bc000 CR4: 00000000000006e0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Process vgs (pid: 790, threadinfo ffff880124bb8000, task ffff8801218ae0c0)
Stack:
0000000000000000 0000000000000000 0000000000000001 000000000000000c
<0> ffff880124bb9b98 0000000024ab83b7 ffff8801256b5c00 ffff8801269e2680
<0> ffff880124bb9bd8 ffffffff811764ec 0000000000000000 ffff8801256b5c00
Call Trace:
[] dio_bio_submit+0xbc/0xc0
[] __blockdev_direct_IO_newtrunc+0x651/0xb90
[] blkdev_direct_IO+0x57/0x60
[] ? blkdev_get_blocks+0x0/0xc0
[] generic_file_aio_read+0x6c1/0x720
[] do_sync_read+0xda/0x120
[] ? scsi_disk_put+0x46/0x60 [sd_mod]
[] ? block_ioctl+0x3c/0x40
[] ? vfs_ioctl+0x3d/0xf0
[] ? selinux_file_permission+0xfb/0x150
[] ? security_file_permission+0x16/0x20
[] vfs_read+0xb5/0x1a0
[] sys_read+0x51/0x90
[] system_call_fastpath+0x16/0x1b
Code: 8b b0 98 00 00 00 48 83 c6 0c f3 a6 75 2e 48 8b 43 48 48 85 c0 74 25 48 8b 00 48 85 c0 74 1d 48 8b 40 18 48 85 c0 74 14 48 8b 00 <48> 81 78 40 00 04 00 00 74 40 0f 1f 80 00 00 00 00 48 89 df e8
RIP [] submit_bio+0xc7/0x180
RSP
---[ end trace 3f9e734467bb0019 ]---
/* 소스 */
함수는 submit_bio
if ( 0 == strcmp(bio->bi_bdev->bd_disk->disk_name, "sdb") ) { if (bio && bio->bi_io_vec && bio->bi_io_vec->bv_page && bio->bi_io_vec->bv_page->mapping) { struct inode *inode; inode = NULL; if ( bio->bi_io_vec->bv_page->mapping->host ) inode = bio->bi_io_vec->bv_page->mapping->host; else return; if ( inode && inode->i_ino != 0 ) { <- 이 부분이 문제인듯 합니다. if( rw & WRITE ) { printk("TEST"); } } } } } }
댓글 달기