Problem with sock_create in KLM

Submitted by Anonymous
on April 18, 2010 - 3:05pm

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