]> git.hungrycats.org Git - linux/commitdiff
[ATM]: seq_file for /proc/net/atm (pvc) [3/8] (from romieu@fr.zoreil.com)
authorChas Williams <char@cmf.nrl.navy.mil>
Thu, 11 Sep 2003 11:18:48 +0000 (04:18 -0700)
committerHideaki Yoshifuji <yoshfuji@linux-ipv6.org>
Thu, 11 Sep 2003 11:18:48 +0000 (04:18 -0700)
seq_file support for /proc/net/atm/pvc:
- pvc_info(): seq_printf/seq_putc replaces sprintf;
- atm_pvc_info() removal;
- the vc helpers (vcc__seq_xxx) do the remaining work.

Chas's suggestions applied since last version:
- atm_pvc_xxx renamed to pvc_xxx
- atm_seq_pvc_fops renamed to pvc_seq_fops

net/atm/proc.c

index d8683d55ff8adea63f800bcaf764c4dc6a1c3505..9435bc621cbd60b309b8a564511b2f8a217e23e7 100644 (file)
@@ -262,7 +262,7 @@ static void *vcc_seq_next(struct seq_file *seq, void *v, loff_t *pos)
        return v;
 }
 
-static void pvc_info(struct atm_vcc *vcc, char *buf, int clip_info)
+static void pvc_info(struct seq_file *seq, struct atm_vcc *vcc, int clip_info)
 {
        static const char *class_name[] = { "off","UBR","CBR","VBR","ABR" };
        static const char *aal_name[] = {
@@ -270,9 +270,8 @@ static void pvc_info(struct atm_vcc *vcc, char *buf, int clip_info)
                "???",  "5",    "???",  "???",  /*  4- 7 */
                "???",  "???",  "???",  "???",  /*  8-11 */
                "???",  "0",    "???",  "???"}; /* 12-15 */
-       int off;
 
-       off = sprintf(buf,"%3d %3d %5d %-3s %7d %-5s %7d %-6s",
+       seq_printf(seq, "%3d %3d %5d %-3s %7d %-5s %7d %-6s",
            vcc->dev->number,vcc->vpi,vcc->vci,
            vcc->qos.aal >= sizeof(aal_name)/sizeof(aal_name[0]) ? "err" :
            aal_name[vcc->qos.aal],vcc->qos.rxtp.min_pcr,
@@ -284,18 +283,14 @@ static void pvc_info(struct atm_vcc *vcc, char *buf, int clip_info)
                struct net_device *dev;
 
                dev = clip_vcc->entry ? clip_vcc->entry->neigh->dev : NULL;
-               off += sprintf(buf+off,"CLIP, Itf:%s, Encap:",
+               seq_printf(seq, "CLIP, Itf:%s, Encap:",
                    dev ? dev->name : "none?");
-               if (clip_vcc->encap)
-                       off += sprintf(buf+off,"LLC/SNAP");
-               else
-                       off += sprintf(buf+off,"None");
+               seq_printf(seq, "%s", clip_vcc->encap ? "LLC/SNAP" : "None");
        }
 #endif
-       strcpy(buf+off,"\n");
+       seq_putc(seq, '\n');
 }
 
-
 static const char *vcc_state(struct atm_vcc *vcc)
 {
        static const char *map[] = { ATM_VS2TXT_MAP };
@@ -437,48 +432,40 @@ static struct file_operations devices_seq_fops = {
        .release        = seq_release,
 };
 
-/*
- * FIXME: it isn't safe to walk the VCC list without turning off interrupts.
- * What is really needed is some lock on the devices. Ditto for ATMARP.
- */
-
-static int atm_pvc_info(loff_t pos,char *buf)
+static int pvc_seq_show(struct seq_file *seq, void *v)
 {
-       struct hlist_node *node;
-       struct sock *s;
-       struct atm_vcc *vcc;
-       int left, clip_info = 0;
+       static char atm_pvc_banner[] = 
+               "Itf VPI VCI   AAL RX(PCR,Class) TX(PCR,Class)\n";
 
-       if (!pos) {
-               return sprintf(buf,"Itf VPI VCI   AAL RX(PCR,Class) "
-                   "TX(PCR,Class)\n");
-       }
-       left = pos-1;
-#if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE)
-       if (try_atm_clip_ops())
-               clip_info = 1;
-#endif
-       read_lock(&vcc_sklist_lock);
-       sk_for_each(s, node, &vcc_sklist) {
-               vcc = atm_sk(s);
-               if (vcc->sk->sk_family == PF_ATMPVC && vcc->dev && !left--) {
-                       pvc_info(vcc,buf,clip_info);
-                       read_unlock(&vcc_sklist_lock);
-#if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE)
-                       if (clip_info)
-                               module_put(atm_clip_ops->owner);
-#endif
-                       return strlen(buf);
-               }
+       if (v == (void *)1)
+               seq_puts(seq, atm_pvc_banner);
+       else {
+               struct vcc_state *state = seq->private;
+               struct atm_vcc *vcc = atm_sk(state->sk);
+
+               pvc_info(seq, vcc, state->clip_info);
        }
-       read_unlock(&vcc_sklist_lock);
-#if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE)
-       if (clip_info)
-               module_put(atm_clip_ops->owner);
-#endif
        return 0;
 }
 
+static struct seq_operations pvc_seq_ops = {
+       .start  = vcc_seq_start,
+       .next   = vcc_seq_next,
+       .stop   = vcc_seq_stop,
+       .show   = pvc_seq_show,
+};
+
+static int pvc_seq_open(struct inode *inode, struct file *file)
+{
+       return __vcc_seq_open(inode, file, PF_ATMPVC, &pvc_seq_ops);
+}
+
+static struct file_operations pvc_seq_fops = {
+       .open           = pvc_seq_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = vcc_seq_release,
+};
 
 static int atm_vc_info(loff_t pos,char *buf)
 {
@@ -782,7 +769,7 @@ int __init atm_proc_init(void)
        if (!atm_proc_root)
                return -ENOMEM;
        CREATE_SEQ_ENTRY(devices);
-       CREATE_ENTRY(pvc);
+       CREATE_SEQ_ENTRY(pvc);
        CREATE_ENTRY(svc);
        CREATE_ENTRY(vc);
 #if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE)