From: Andrew Morton on
On Mon, 23 Nov 2009 04:56:25 +0300
Alexey Dobriyan <adobriyan(a)gmail.com> wrote:

> Signed-off-by: Alexey Dobriyan <adobriyan(a)gmail.com>
> ---
>
> Documentation/isdn/INTERFACE.CAPI | 4
> drivers/isdn/capi/capi.c | 99 +++++-----------
> drivers/isdn/capi/capidrv.c | 54 ++------
> drivers/isdn/capi/kcapi.c | 8 -
> drivers/isdn/hardware/avm/avmcard.h | 6
> drivers/isdn/hardware/avm/b1.c | 54 +++++---
> drivers/isdn/hardware/avm/b1dma.c | 71 +++++------
> drivers/isdn/hardware/avm/b1isa.c | 2
> drivers/isdn/hardware/avm/b1pci.c | 4
> drivers/isdn/hardware/avm/b1pcmcia.c | 2
> drivers/isdn/hardware/avm/c4.c | 53 +++++---
> drivers/isdn/hardware/avm/t1isa.c | 2
> drivers/isdn/hardware/avm/t1pci.c | 2
> drivers/isdn/hardware/eicon/capimain.c | 40 +++---
> drivers/isdn/hardware/eicon/diva_didd.c | 44 +++----
> drivers/isdn/hardware/eicon/divasi.c | 48 ++++---
> drivers/isdn/hardware/eicon/divasproc.c | 198 ++++++++++++++------------------
> drivers/isdn/hysdn/hycapi.c | 54 ++++----
> include/linux/isdn/capilli.h | 3
> net/bluetooth/cmtp/capi.c | 37 +++--
> 20 files changed, 368 insertions(+), 417 deletions(-)

linux-next collision:

drivers/isdn/gigaset/capi.c: In function 'gigaset_isdn_register':
drivers/isdn/gigaset/capi.c:2259: error: 'struct capi_ctr' has no member named 'ctr_read_proc'
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Alexey Dobriyan on
On Tue, Nov 24, 2009 at 04:25:41PM -0800, Andrew Morton wrote:
> On Mon, 23 Nov 2009 04:56:25 +0300
> Alexey Dobriyan <adobriyan(a)gmail.com> wrote:

> linux-next collision:
>
> drivers/isdn/gigaset/capi.c: In function 'gigaset_isdn_register':
> drivers/isdn/gigaset/capi.c:2259: error: 'struct capi_ctr' has no member named 'ctr_read_proc'

Please, fold into my patch:

--- a/drivers/isdn/gigaset/capi.c
+++ b/drivers/isdn/gigaset/capi.c
@@ -2106,35 +2106,22 @@ static char *gigaset_procinfo(struct capi_ctr *ctr)
return ctr->name; /* ToDo: more? */
}

-/**
- * gigaset_ctr_read_proc() - build controller proc file entry
- * @page: buffer of PAGE_SIZE bytes for receiving the entry.
- * @start: unused.
- * @off: unused.
- * @count: unused.
- * @eof: unused.
- * @ctr: controller descriptor structure.
- *
- * Return value: length of generated entry
- */
-static int gigaset_ctr_read_proc(char *page, char **start, off_t off,
- int count, int *eof, struct capi_ctr *ctr)
+static int gigaset_proc_show(struct seq_file *m, void *v)
{
+ struct capi_ctr *ctr = m->private;
struct cardstate *cs = ctr->driverdata;
char *s;
int i;
- int len = 0;
- len += sprintf(page+len, "%-16s %s\n", "name", ctr->name);
- len += sprintf(page+len, "%-16s %s %s\n", "dev",
+
+ seq_printf(m, "%-16s %s\n", "name", ctr->name);
+ seq_printf(m, "%-16s %s %s\n", "dev",
dev_driver_string(cs->dev), dev_name(cs->dev));
- len += sprintf(page+len, "%-16s %d\n", "id", cs->myid);
+ seq_printf(m, "%-16s %d\n", "id", cs->myid);
if (cs->gotfwver)
- len += sprintf(page+len, "%-16s %d.%d.%d.%d\n", "firmware",
+ seq_printf(m, "%-16s %d.%d.%d.%d\n", "firmware",
cs->fwver[0], cs->fwver[1], cs->fwver[2], cs->fwver[3]);
- len += sprintf(page+len, "%-16s %d\n", "channels",
- cs->channels);
- len += sprintf(page+len, "%-16s %s\n", "onechannel",
- cs->onechannel ? "yes" : "no");
+ seq_printf(m, "%-16s %d\n", "channels", cs->channels);
+ seq_printf(m, "%-16s %s\n", "onechannel", cs->onechannel ? "yes" : "no");

switch (cs->mode) {
case M_UNKNOWN:
@@ -2152,7 +2139,7 @@ static int gigaset_ctr_read_proc(char *page, char **start, off_t off,
default:
s = "??";
}
- len += sprintf(page+len, "%-16s %s\n", "mode", s);
+ seq_printf(m, "%-16s %s\n", "mode", s);

switch (cs->mstate) {
case MS_UNINITIALIZED:
@@ -2176,25 +2163,25 @@ static int gigaset_ctr_read_proc(char *page, char **start, off_t off,
default:
s = "??";
}
- len += sprintf(page+len, "%-16s %s\n", "mstate", s);
+ seq_printf(m, "%-16s %s\n", "mstate", s);

- len += sprintf(page+len, "%-16s %s\n", "running",
+ seq_printf(m, "%-16s %s\n", "running",
cs->running ? "yes" : "no");
- len += sprintf(page+len, "%-16s %s\n", "connected",
+ seq_printf(m, "%-16s %s\n", "connected",
cs->connected ? "yes" : "no");
- len += sprintf(page+len, "%-16s %s\n", "isdn_up",
+ seq_printf(m, "%-16s %s\n", "isdn_up",
cs->isdn_up ? "yes" : "no");
- len += sprintf(page+len, "%-16s %s\n", "cidmode",
+ seq_printf(m, "%-16s %s\n", "cidmode",
cs->cidmode ? "yes" : "no");

for (i = 0; i < cs->channels; i++) {
- len += sprintf(page+len, "[%d]%-13s %d\n", i, "corrupted",
+ seq_printf(m, "[%d]%-13s %d\n", i, "corrupted",
cs->bcs[i].corrupted);
- len += sprintf(page+len, "[%d]%-13s %d\n", i, "trans_down",
+ seq_printf(m, "[%d]%-13s %d\n", i, "trans_down",
cs->bcs[i].trans_down);
- len += sprintf(page+len, "[%d]%-13s %d\n", i, "trans_up",
+ seq_printf(m, "[%d]%-13s %d\n", i, "trans_up",
cs->bcs[i].trans_up);
- len += sprintf(page+len, "[%d]%-13s %d\n", i, "chstate",
+ seq_printf(m, "[%d]%-13s %d\n", i, "chstate",
cs->bcs[i].chstate);
switch (cs->bcs[i].proto2) {
case L2_BITSYNC:
@@ -2209,11 +2196,24 @@ static int gigaset_ctr_read_proc(char *page, char **start, off_t off,
default:
s = "??";
}
- len += sprintf(page+len, "[%d]%-13s %s\n", i, "proto2", s);
+ seq_printf(m, "[%d]%-13s %s\n", i, "proto2", s);
}
- return len;
+ return 0;
}

+static int gigaset_proc_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, gigaset_proc_show, PDE(inode)->data);
+}
+
+static const struct file_operations gigaset_proc_fops = {
+ .owner = THIS_MODULE,
+ .open = gigaset_proc_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
+

static struct capi_driver capi_driver_gigaset = {
.name = "gigaset",
@@ -2256,7 +2256,7 @@ int gigaset_isdn_register(struct cardstate *cs, const char *isdnid)
iif->ctr.release_appl = gigaset_release_appl;
iif->ctr.send_message = gigaset_send_message;
iif->ctr.procinfo = gigaset_procinfo;
- iif->ctr.ctr_read_proc = gigaset_ctr_read_proc;
+ iif->ctr.proc_fops = &gigaset_proc_fops;
INIT_LIST_HEAD(&iif->appls);
skb_queue_head_init(&iif->sendqueue);
atomic_set(&iif->sendqlen, 0);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Tilman Schmidt on
Am 23.11.2009 02:56 schrieb Alexey Dobriyan:
> --- a/Documentation/isdn/INTERFACE.CAPI
> +++ b/Documentation/isdn/INTERFACE.CAPI
> @@ -149,8 +149,8 @@ char *(*procinfo)(struct capi_ctr *ctrlr)
> pointer to a callback function returning the entry for the device in
> the CAPI controller info table, /proc/capi/controller
>
> -read_proc_t *ctr_read_proc
> - pointer to the read_proc callback function for the device's proc file
> +const struct file_operations *proc_fops
> + pointers to callback functions for the device's proc file
> system entry, /proc/capi/controllers/<n>; will be called with a
> pointer to the device's capi_ctr structure as the last (data) argument
>

This doesn't look correct. AFACIS, most of the callback functions in proc_fops
don't have a last argument named data or looking as if it might lend itself to
passing a pointer to the device's capi_ctr structure. In fact, later in your
patch you replace uses of that last argument by accesses to the m->private
member of the struct seq_file *m argument, like here:

> --- a/drivers/isdn/hardware/avm/b1.c
> +++ b/drivers/isdn/hardware/avm/b1.c
[...]
> @@ -634,18 +636,17 @@ irqreturn_t b1_interrupt(int interrupt, void *devptr)
> }
>
> /* ------------------------------------------------------------- */
> -int b1ctl_read_proc(char *page, char **start, off_t off,
> - int count, int *eof, struct capi_ctr *ctrl)
> +static int b1ctl_proc_show(struct seq_file *m, void *v)
> {
> + struct capi_ctr *ctrl = m->private;
> avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
> avmcard *card = cinfo->card;
> u8 flag;
[...]

So I guess the paragraph Documentation/isdn/INTERFACE.CAPI needs to be
adapted to describe correctly where the callbacks will find their
controller data structure after that change.

OTOH, the new proc_show functions sport a second argument void *v that
doesn't appear to get used anywhere. It would be nice if that could be
explained a bit somewhere.

Thanks,
Tilman


--
Tilman Schmidt E-Mail: tilman(a)imap.cc
Bonn, Germany
Diese Nachricht besteht zu 100% aus wiederverwerteten Bits.
Ungeöffnet mindestens haltbar bis: (siehe Rückseite)

From: Tilman Schmidt on
Am 25.11.2009 05:59 schrieb Alexey Dobriyan:
> --- a/drivers/isdn/gigaset/capi.c
> +++ b/drivers/isdn/gigaset/capi.c
> @@ -2106,35 +2106,22 @@ static char *gigaset_procinfo(struct capi_ctr *ctr)
> return ctr->name; /* ToDo: more? */
> }
>
> -/**
> - * gigaset_ctr_read_proc() - build controller proc file entry
> - * @page: buffer of PAGE_SIZE bytes for receiving the entry.
> - * @start: unused.
> - * @off: unused.
> - * @count: unused.
> - * @eof: unused.
> - * @ctr: controller descriptor structure.
> - *
> - * Return value: length of generated entry
> - */
> -static int gigaset_ctr_read_proc(char *page, char **start, off_t off,
> - int count, int *eof, struct capi_ctr *ctr)
> +static int gigaset_proc_show(struct seq_file *m, void *v)

I would prefer that, instead of throwing the kerneldoc comment away,
you adapted it to the new function. Specifically, I would like to
know what the second argument "void *v" is for.

> {
> + struct capi_ctr *ctr = m->private;

See below.

> +static int gigaset_proc_open(struct inode *inode, struct file *file)
> +{
> + return single_open(file, gigaset_proc_show, PDE(inode)->data);

I'd like to understand how that works.

According to Documentation/filesystems/seq_file.txt, the value of
the last argument will be passed to the proc_show function in the
private field of the seq_file structure. Your gigaset_proc_show()
function assumes that this will be the capi_ctr pointer for the
device.

So what is PDE(inode)->data and where does it get set to the
capi_ctr pointer for the device?

Thanks,
Tilman

--
Tilman Schmidt E-Mail: tilman(a)imap.cc
Bonn, Germany
Diese Nachricht besteht zu 100% aus wiederverwerteten Bits.
Ungeöffnet mindestens haltbar bis: (siehe Rückseite)

From: Alexey Dobriyan on
On Mon, Nov 30, 2009 at 01:42:32AM +0100, Tilman Schmidt wrote:
> Am 25.11.2009 05:59 schrieb Alexey Dobriyan:
> > --- a/drivers/isdn/gigaset/capi.c
> > +++ b/drivers/isdn/gigaset/capi.c
> > @@ -2106,35 +2106,22 @@ static char *gigaset_procinfo(struct capi_ctr *ctr)
> > return ctr->name; /* ToDo: more? */
> > }
> >
> > -/**
> > - * gigaset_ctr_read_proc() - build controller proc file entry
> > - * @page: buffer of PAGE_SIZE bytes for receiving the entry.
> > - * @start: unused.
> > - * @off: unused.
> > - * @count: unused.
> > - * @eof: unused.
> > - * @ctr: controller descriptor structure.
> > - *
> > - * Return value: length of generated entry
> > - */
> > -static int gigaset_ctr_read_proc(char *page, char **start, off_t off,
> > - int count, int *eof, struct capi_ctr *ctr)
> > +static int gigaset_proc_show(struct seq_file *m, void *v)
>
> I would prefer that, instead of throwing the kerneldoc comment away,
> you adapted it to the new function. Specifically, I would like to
> know what the second argument "void *v" is for.

Sorry, no.
I personally find the corellation between kernel-docness and useleness
to be highly positive.

Comment is removed because after removal of parameters "description",
nothing is left.

> > {
> > + struct capi_ctr *ctr = m->private;
>
> See below.
>
> > +static int gigaset_proc_open(struct inode *inode, struct file *file)
> > +{
> > + return single_open(file, gigaset_proc_show, PDE(inode)->data);
>
> I'd like to understand how that works.
>
> According to Documentation/filesystems/seq_file.txt, the value of
> the last argument will be passed to the proc_show function in the
> private field of the seq_file structure. Your gigaset_proc_show()
> function assumes that this will be the capi_ctr pointer for the
> device.
>
> So what is PDE(inode)->data and where does it get set to the
> capi_ctr pointer for the device?

When you create proc entry, you set ->data for proc entry,
it's accessible as PDE(inode)->data.
Now you need to pass it doen to actual hook.
It got stashed eventually into struct seq_file::private (see single_open())
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/