2007-10-02 07:29:14

by kernel coder

[permalink] [raw]
Subject: cann't dump info to user file from kernel

hi,
I'm trying to dump some information from dev.c to user space
file.Following is the code which i'm using to write to user spcae
file.I'm using 2.6.22.x86_64 kernel.


#define _write(f, buf, sz) (f->f_op->write(f, buf, sz, &f->f_pos))
#define WRITABLE(f) (f->f_op && f->f_op->write)

int write_to_file(char *logfile, char *buf,int size)
{
int ret = 0;
struct file *f=NULL;
mm_segment_t old_fs = get_fs();
set_fs(get_ds());
f = filp_open(logfile, O_CREAT|O_APPEND,00600);
if(IS_ERR(f)){
DPRINT("Error %ld openeing %s\n",-PTR_ERR(f), logfile);
ret = -1;
} else {
if (WRITABLE(f))
_write(f, buf, size);
else {
DPRINT("%s does not have a write method\n",
logfile);
ret = -1;
}

if ((ret = filp_close(f,NULL)))
DPRINT("Error %d closing %s\n", -ret, logfile);
}
END_KMEM;

return ret;
}


I'm calling this function from netif_recieve_skb in dev.c

int netif_recieve_skb(struct sk_buff *skb){

---------------------
write_to_file("/root/kernel_log","hello_world",12);
----------------------

}

But whenever this function is called ,the kernel simply halts.Please
tell me what might be the reason.

I just want to dump some information to user spcace file from dev.c
.Is there some better way to do it.


thanks,
shahzad


2007-10-02 07:37:04

by Denis V. Lunev

[permalink] [raw]
Subject: Re: cann't dump info to user file from kernel

This will never work, as you call blocking (non-atomic) functions from
atomic context.

kernel coder wrote:
> hi,
> I'm trying to dump some information from dev.c to user space
> file.Following is the code which i'm using to write to user spcae
> file.I'm using 2.6.22.x86_64 kernel.
>
>
> #define _write(f, buf, sz) (f->f_op->write(f, buf, sz, &f->f_pos))
> #define WRITABLE(f) (f->f_op && f->f_op->write)
>
> int write_to_file(char *logfile, char *buf,int size)
> {
> int ret = 0;
> struct file *f=NULL;
> mm_segment_t old_fs = get_fs();
> set_fs(get_ds());
> f = filp_open(logfile, O_CREAT|O_APPEND,00600);
> if(IS_ERR(f)){
> DPRINT("Error %ld openeing %s\n",-PTR_ERR(f), logfile);
> ret = -1;
> } else {
> if (WRITABLE(f))
> _write(f, buf, size);
> else {
> DPRINT("%s does not have a write method\n",
> logfile);
> ret = -1;
> }
>
> if ((ret = filp_close(f,NULL)))
> DPRINT("Error %d closing %s\n", -ret, logfile);
> }
> END_KMEM;
>
> return ret;
> }
>
>
> I'm calling this function from netif_recieve_skb in dev.c
>
> int netif_recieve_skb(struct sk_buff *skb){
>
> ---------------------
> write_to_file("/root/kernel_log","hello_world",12);
> ----------------------
>
> }
>
> But whenever this function is called ,the kernel simply halts.Please
> tell me what might be the reason.
>
> I just want to dump some information to user spcace file from dev.c
> .Is there some better way to do it.
use something like ipt_LOG or packet sockets