minstrel: simplify and fix debugfs code
authorFelix Fietkau <nbd@openwrt.org>
Mon, 1 Mar 2010 21:17:38 +0000 (22:17 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 10 Mar 2010 22:44:17 +0000 (17:44 -0500)
This patch cleans up the debugfs read function for the statistics by
using simple_read_from_buffer instead of its own semi-broken hack.
Also removes a useless member of the minstrel debugfs info struct.

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/rc80211_minstrel.h
net/mac80211/rc80211_minstrel_debugfs.c

index 38bf416..9372656 100644 (file)
@@ -80,6 +80,11 @@ struct minstrel_priv {
        unsigned int lookaround_rate_mrr;
 };
 
+struct minstrel_debugfs_info {
+       size_t len;
+       char buf[];
+};
+
 void minstrel_add_sta_debugfs(void *priv, void *priv_sta, struct dentry *dir);
 void minstrel_remove_sta_debugfs(void *priv, void *priv_sta);
 
index a715d94..3e83402 100644 (file)
 #include <net/mac80211.h>
 #include "rc80211_minstrel.h"
 
-struct minstrel_stats_info {
-       struct minstrel_sta_info *mi;
-       char buf[4096];
-       size_t len;
-};
-
 static int
 minstrel_stats_open(struct inode *inode, struct file *file)
 {
        struct minstrel_sta_info *mi = inode->i_private;
-       struct minstrel_stats_info *ms;
+       struct minstrel_debugfs_info *ms;
        unsigned int i, tp, prob, eprob;
        char *p;
 
-       ms = kmalloc(sizeof(*ms), GFP_KERNEL);
+       ms = kmalloc(sizeof(*ms) + 4096, GFP_KERNEL);
        if (!ms)
                return -ENOMEM;
 
@@ -107,35 +101,18 @@ minstrel_stats_open(struct inode *inode, struct file *file)
 }
 
 static ssize_t
-minstrel_stats_read(struct file *file, char __user *buf, size_t len, loff_t *o)
+minstrel_stats_read(struct file *file, char __user *buf, size_t len, loff_t *ppos)
 {
-       struct minstrel_stats_info *ms;
-       char *src;
+       struct minstrel_debugfs_info *ms;
 
        ms = file->private_data;
-       src = ms->buf;
-
-       len = min(len, ms->len);
-       if (len <= *o)
-               return 0;
-
-       src += *o;
-       len -= *o;
-       *o += len;
-
-       if (copy_to_user(buf, src, len))
-               return -EFAULT;
-
-       return len;
+       return simple_read_from_buffer(buf, len, ppos, ms->buf, ms->len);
 }
 
 static int
 minstrel_stats_release(struct inode *inode, struct file *file)
 {
-       struct minstrel_stats_info *ms = file->private_data;
-
-       kfree(ms);
-
+       kfree(file->private_data);
        return 0;
 }