On Thu, Apr 19, 2018 at 02:41:03PM +0200, Christoph Hellwig wrote:
> Variants of proc_create{,_data} that directly take a struct seq_operations
> argument and drastically reduces the boilerplate code in the callers.

> +static int proc_seq_open(struct inode *inode, struct file *file)
> +{
> +     struct proc_dir_entry *de = PDE(inode);
> +
> +     return seq_open(file, de->seq_ops);
> +}
> +
> +static const struct file_operations proc_seq_fops = {
> +     .open           = proc_seq_open,
> +     .read           = seq_read,
> +     .llseek         = seq_lseek,
> +     .release        = seq_release,
> +};
> +
> +struct proc_dir_entry *proc_create_seq_data(const char *name, umode_t mode,
> +             struct proc_dir_entry *parent, const struct seq_operations *ops,
> +             void *data)
> +{
> +     struct proc_dir_entry *p;
> +
> +     p = proc_create_data(name, mode, parent, &proc_seq_fops, data);
> +     if (p)
> +             p->seq_ops = ops;
> +     return p;
> +}

Should be oopsable.
Once proc_create_data() returns, entry is live, ->open can be called.

> --- a/fs/proc/internal.h
> +++ b/fs/proc/internal.h
> @@ -44,6 +44,7 @@ struct proc_dir_entry {
>       struct completion *pde_unload_completion;
>       const struct inode_operations *proc_iops;
>       const struct file_operations *proc_fops;
> +     const struct seq_operations *seq_ops;
>       void *data;
>       unsigned int low_ino;
>       nlink_t nlink;

"struct proc_dir_entry is 192/128 bytes now.
If someone knows how to pad array to certain size without union
please tell.
_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to