Hello, i am dealing with studiing kernel module. As example i am using block device from lwn
http://lwn.net/Articles/58719/
and so far so good, but i am trying to create simple network disk (just for test, ...)
I found this article.
http://www.linuxjournal.com/node/7660
and this example is working, when aplied in init function, but when i use it instead of read / write, kernel freezes or in better case, sends some warning.(listed here)
Apr 18 22:30:54 Server1 kernel: [ 504.079823] rxdrv:<4>------------[ cut here ]------------
Apr 18 22:30:54 Server1 kernel: [ 504.143539] WARNING: at kernel/softirq.c:141 local_bh_enable+0x27/0x71()
Apr 18 22:30:54 Server1 kernel: [ 504.143539] Modules linked in: rxd(+) vboxvfs nls_base ipv6 loop parport_pc parport pcspkr serio_raw psmouse snd_intel8x0 i2c_piix4 i2c_core snd_ac97_codec ac97_bus battery ac snd_pcm snd_timer snd soundcore snd_page_alloc button vboxguest evdev ext3 jbd mbcache ide_cd_mod cdrom ide_disk ata_generic libata scsi_mod dock floppy ehci_hcd ohci_hcd piix ide_pci_generic pcnet32 mii usbcore ide_core thermal processor fan thermal_sys [last unloaded: scsi_wait_scan]
Apr 18 22:30:54 Server1 kernel: [ 504.143539] Pid: 3171, comm: insmod Tainted: G W 2.6.26-2-686 #1
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] warn_on_slowpath+0x40/0x66
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] __alloc_pages_internal+0xb5/0x34e
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] local_bh_enable+0x27/0x71
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] local_bh_enable+0x27/0x71
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] lock_sock_nested+0x84/0x8c
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] inet_stream_connect+0x1a/0x1fd
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] rx_request+0xfe/0x178 [rxd]
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] __generic_unplug_device+0x1a/0x1c
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] generic_unplug_device+0x1e/0x33
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] blk_unplug+0x55/0x5c
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] sync_page+0x0/0x36
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] block_sync_page+0x2f/0x30
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] sync_page+0x2e/0x36
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] __wait_on_bit_lock+0x2a/0x52
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] __lock_page+0x4e/0x54
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] wake_bit_function+0x0/0x3c
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] read_cache_page_async+0x9e/0xf8
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] blkdev_readpage+0x0/0xc
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] adfspart_check_ICS+0x0/0x14c
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] read_cache_page+0xa/0x3f
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] read_dev_sector+0x26/0x60
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] adfspart_check_ICS+0x0/0x14c
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] adfspart_check_ICS+0x20/0x14c
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] printk+0x14/0x18
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] adfspart_check_ICS+0x0/0x14c
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] rescan_partitions+0x110/0x249
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] do_open+0x1e6/0x28d
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] __blkdev_get+0x63/0x6e
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] blkdev_get+0xa/0xc
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] register_disk+0xc9/0x115
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] add_disk+0x2c/0x6b
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] exact_match+0x0/0x7
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] exact_lock+0x0/0xd
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] init_rxd+0x126/0x151 [rxd]
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] blocking_notifier_call_chain+0x9/0xc
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] sys_init_module+0x187a/0x19ea
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] blk_init_queue+0x0/0x8
Apr 18 22:30:54 Server1 kernel: [ 504.143539] [] syscall_call+0x7/0xb
Apr 18 22:30:54 Server1 kernel: [ 504.143539] =======================
Apr 18 22:30:54 Server1 kernel: [ 504.143539] ---[ end trace 4eaa2a86a8e2da2 ]---
my code:
static void sbd_transfer(struct sbd_device *dev, unsigned long sector,
unsigned long nsect, char *buffer, int write)
{
long long offset = sector*hardsect_size;
unsigned long nbytes = nsect*hardsect_size;
if ((offset + nbytes) > dev->size) {
//printk (KERN_WARNING "sbd: Beyond-end write (%ld %ld)\n", offset, nbytes);
return;
}
if (write){
memcpy(dev->data + offset, buffer, nbytes);
}
else{
struct sockaddr_in servaddr;
int r = -1;
struct socket *control= NULL;
char *response = kmalloc(256,GFP_KERNEL);
unsigned short port;
r = sock_create(PF_INET, SOCK_STREAM,
IPPROTO_TCP, &control);
if(r!=0){
printk(KERN_WARNING "sbd: socketcreation \n" );
return;
}
port = htons(5902);
memset(&servaddr,0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = port;
servaddr.sin_addr.s_addr = htonl(0x10207964); // IP
r = control->ops->connect(control,
(struct sockaddr *) &servaddr,
sizeof(servaddr), O_RDWR);
if(r!=0){
printk(KERN_WARNING "sbd: socket not working, ending\n");
return;
}
sock_release(control);
kfree(response);
//memcpy(buffer, dev->data + offset, nbytes);
}
}
This code causes upper error even if there is no socket->opt->connect
This function is called several times while loading module (for reading)
but I do not know, why there is that bug.
Thank you for response in advance. i can post whole code via mail.
I am running debian lenny kernel 2.6.26-2-686
Pavel