Messages in this thread | | | Date | Tue, 29 Feb 2000 00:00:16 +0100 (CET) | From | Ingo Oeser <> | Subject | /proc does not accept new default_fops? |
| |
Hi there,
procfs doesn't seem to allow later modifications of the default_fops.
Kernel is 2.2.13aa6 (thats why you are CC'd Andrea ;)).
Problematic code follows
<source> #define DSP_DIR "dsp" #define DSP_CHIP_CLASSES "dsp/chip_classes" #define DSP_CHIPS "dsp/chips" #define DSP_CHIP_IO "io" /* For real device activity */
/* Permissions */ #define dspacc (S_IRUSR | S_IRGRP) #define dspdir (S_IFDIR | S_IXUSR | S_IXGRP | dspacc) #define dspfile (S_IWUSR | S_IWGRP | dspacc) #define dspinfo dspacc #define dspowner 0 extern unsigned int dspgrp;
struct dsp_proc_dir_entry { struct proc_dir_entry *dotfile; struct proc_dir_entry *io; struct proc_dir_entry *info; };
/* DSP class data */ struct dsp_chip_class_struct { char *name; #ifdef CONFIG_PROC_FS struct proc_dir_entry *info; /* Tool to increase module usage count */ void (*fill_inode)(struct inode *, int); #endif /* CONFIG_PROC_FS */ };
struct dsp_chip_struct { struct dsp_chip_class_struct *class; #ifdef CONFIG_PROC_FS struct dsp_proc_dir_entry info; #endif /* CONFIG_PROC_FS */ };
struct file_operations = dsp_chip_io_fops { .ioctl = dsp_ioctl, #ifdef CONFIG_PROC_FS .open = dsp_open_procfs, #else /* CONFIG_PROC_FS */ .open = dsp_open_dummy, #endif /* CONFIG_PROC_FS */ .release = dsp_release, .read = dsp_read, .write = dsp_write, };
static struct proc_dir_entry *new_proc_entry(const char *name, mode_t mode, struct proc_dir_entry *parent, struct file_operations *fops) { struct proc_dir_entry *ent;
/* get translated name, if empty parent */ ent=create_proc_entry(name,mode,parent); if (ent) { /* This seems to be ignored :( */ if (fops) ent->ops->default_file_ops=fops; else DEBUG_MSG("No ops for %s\n",name); DEBUG_MSG("Created procfs-entry %s\n",ent->name); }; return ent; }
int register_dsp_class_proc(struct dsp_chip_class_struct *class) { int res=-EINVAL;
if (!class) goto out; res=-ENOMEM; class->info=new_proc_entry(class->name,dspfile,chip_classes,NULL); if (!(class->info)) { DEBUG_MSG("Cannot register class info\n"); goto out; }; class->info->data=class; class->info->fill_inode=class->fill_inode; /* Problem below: new read_proc is never beeing called :( */ class->info->read_proc=show_class_info; res=0; out: DEBUG_MSG("out with res=%i\n",res); return res; };
int register_dsp_proc(struct dsp_chip_struct *chip) { int res=-EINVAL; char name[DSP_ENUM_STR_SIZE+1]=""; if (!chip) goto out; res=-ENOMEM; spin_lock(&dspcount_lock); if ((dspcount++) > DSP_ENUM_MAX) dspcount--; else sprintf(name,DSP_ENUM_STR,dspcount); spin_unlock(&dspcount_lock); #define ADD_PROC(f,n,acc,p,ops,fill) \ f=new_proc_entry(n,acc,p,ops); \ if (!(f)) { \ DEBUG_MSG("Failed to register proc entry %s\n",n); \ goto out_free; \ }; \ f->data=chip; \ f->uid=dspowner; \ f->gid=dspgrp; \ f->fill_inode=fill
ADD_PROC(chip->info.dotfile,name,dspdir,chips,NULL,NULL); ADD_PROC(chip->info.io,DSP_CHIP_IO,dspfile,chip->info.dotfile, &dsp_chip_io_fops,chip->class->fill_inode); #undef ADD_PROC(f,n,acc,p,ops,fill)
res=0; out: DEBUG_MSG("out with res=%i\n",res); return res; out_free: /* Failure path */ #define DEL_PROC(f,p) \ if (f) destroy_proc_entry(p,&f)
DEL_PROC(chip->info.io,chip->info.dotfile); DEL_PROC(chip->info.dotfile,chips);
DEBUG_MSG("out with res=%i\n",res); return res; #undef DEL_PROC(f,p) }; </source>
The Problem is "register_dsp_proc", where I register a procfs-entry which is saved as "chip->info.io" and has its new file_operations assigend later. But they are _never_ called, if I open/read/write from this procfs-entry, it seems, that no operations are registered.
Same goes for show_class_info, which is also never called.
What is the problem? I debugged this since several days (as you can see from DEBUG_MSG(), which result in simple pr_debug and, yes code is compiled with "-DDEBUG" !
I even looked at the assembly output, for both: caller (the sample code) and callee (linux/fs/proc/generic.s).
Any ideas? I have no more :(
Thanks in advance
Regards
Ingo Oeser -- Feel the power of the penguin - run linux@your.pc <esc>:x
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/
| |