From patchwork Fri Sep 10 07:10:50 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andy Shevchenko X-Patchwork-Id: 178312 Return-path: X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on void.printf.net X-Spam-Level: X-Spam-Status: No, score=-1.0 required=2.9 tests=RCVD_IN_DNSWL_LOW autolearn=disabled version=3.2.5 Envelope-to: chris@printf.net Delivery-date: Fri, 10 Sep 2010 08:11:26 +0100 Received: from lists.laptop.org ([18.85.2.145] helo=mail.laptop.org) by void.printf.net with esmtp (Exim 4.69) (envelope-from ) id 1Otxle-00076A-I0 for chris@printf.net; Fri, 10 Sep 2010 08:11:26 +0100 Received: by mail.laptop.org (Postfix) id C153723B43; Fri, 10 Sep 2010 03:11:06 -0400 (EDT) Delivered-To: cjb@laptop.org Received: from spam.laptop.org (spam.laptop.org [18.85.46.23]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.laptop.org (Postfix) with ESMTPS id AF90A23B3E for ; Fri, 10 Sep 2010 03:11:06 -0400 (EDT) X-ASG-Debug-ID: 1284102684-0b74023b0001-zHW3sV Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by spam.laptop.org with ESMTP id SyxRHEmbEsC5nIjL for ; Fri, 10 Sep 2010 03:11:24 -0400 (EDT) X-Barracuda-Envelope-From: linux-mmc-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752660Ab0IJHK5 (ORCPT ); Fri, 10 Sep 2010 03:10:57 -0400 Received: from mail-ey0-f174.google.com ([209.85.215.174]:64932 "EHLO mail-ey0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752004Ab0IJHK4 (ORCPT ); Fri, 10 Sep 2010 03:10:56 -0400 Received: by eyb6 with SMTP id 6so1449124eyb.19 for ; Fri, 10 Sep 2010 00:10:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:from:to:cc:subject:date :message-id:x-mailer; bh=vCy56+vzAKl1QJxx0o+RsuVbDueeFvJ5sYtap/9Hi9c=; b=OSVYwyVQeYP8lD2dCnFImNlSKExFys5XvJzFTm2rFmbeGu2EQZIVvCkF0o82rte6t/ 33Bx5ATjDLnSPb4z/kPIu1sqperEUzuZJw50E/dkHFEsqrFdQkaFxxv4xjb/RsbwSzPl qCnIk+p62//x9Pxp7TEEFmuss6lJNQyCupdbI= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer; b=ILlbLf0C3lUSg1PP8lEZvNaZVZrfgpDCQT4D2lt1WEVFFmFi0sUlXF+CAyzOxDOO2q ZhW8gfO9Xe1/KWetYiMzjcUzEiTW0DUBS5jVS3i0h6f4766wlcAbadMjsbQFuU+ljH5W K1Mwf7E8KTQ5zEgv5B+GcvYFq9pk/3Lu/XccU= Received: by 10.213.42.7 with SMTP id q7mr381230ebe.4.1284102654473; Fri, 10 Sep 2010 00:10:54 -0700 (PDT) Received: from localhost.localdomain (starua.cc.colocall.com [62.149.23.157]) by mx.google.com with ESMTPS id v59sm3397131eeh.22.2010.09.10.00.10.52 (version=TLSv1/SSLv3 cipher=RC4-MD5); Fri, 10 Sep 2010 00:10:53 -0700 (PDT) From: Andy Shevchenko To: linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Andrew Morton , Greg KH , Hunter Adrian , Andy Shevchenko X-ASG-Orig-Subj: [PATCH] mmc_test: move files from sysfs to debugfs Subject: [PATCH] mmc_test: move files from sysfs to debugfs Date: Fri, 10 Sep 2010 10:10:50 +0300 Message-Id: <1284102650-15044-1-git-send-email-ext-andriy.shevchenko@nokia.com> X-Mailer: git-send-email 1.6.3.3 Sender: linux-mmc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-mmc@vger.kernel.org X-Barracuda-Connect: vger.kernel.org[209.132.180.67] X-Barracuda-Start-Time: 1284102684 X-Barracuda-URL: http://18.85.46.23:8000/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at laptop.org X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using global scores of TAG_LEVEL=3.5 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=5.5 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.40451 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- diff --git a/drivers/mmc/card/mmc_test.c b/drivers/mmc/card/mmc_test.c index 58d746b..e59bb02 100644 --- a/drivers/mmc/card/mmc_test.c +++ b/drivers/mmc/card/mmc_test.c @@ -19,6 +19,10 @@ #include /* For nr_free_buffer_pages() */ #include +#include +#include +#include + #define RESULT_OK 0 #define RESULT_FAIL 1 #define RESULT_UNSUP_HOST 2 @@ -106,6 +110,18 @@ struct mmc_test_general_result { }; /** + * struct mmc_test_dbgfs_file - debugfs related file. + * @link: double-linked list + * @card: card under test + * @file: file created under debugfs + */ +struct mmc_test_dbgfs_file { + struct list_head link; + struct mmc_card *card; + struct dentry *file; +}; + +/** * struct mmc_test_card - test information. * @card: card under test * @scratch: transfer buffer @@ -2037,14 +2053,12 @@ static void mmc_test_free_result(struct mmc_card *card) mutex_unlock(&mmc_test_lock); } -static ssize_t mmc_test_show(struct device *dev, - struct device_attribute *attr, char *buf) +static LIST_HEAD(mmc_test_file_test); + +static int mtf_test_show(struct seq_file *sf, void *data) { - struct mmc_card *card = mmc_dev_to_card(dev); + struct mmc_card *card = (struct mmc_card *)sf->private; struct mmc_test_general_result *gr; - char *p = buf; - size_t len = PAGE_SIZE; - int ret; mutex_lock(&mmc_test_lock); @@ -2054,49 +2068,44 @@ static ssize_t mmc_test_show(struct device *dev, if (gr->card != card) continue; - ret = snprintf(p, len, "Test %d: %d\n", gr->testcase + 1, - gr->result); - if (ret < 0) - goto err; - if (ret >= len) { - ret = -ENOBUFS; - goto err; - } - p += ret; - len -= ret; + seq_printf(sf, "Test %d: %d\n", gr->testcase + 1, gr->result); list_for_each_entry(tr, &gr->tr_lst, link) { - ret = snprintf(p, len, "%u %d %lu.%09lu %u\n", + seq_printf(sf, "%u %d %lu.%09lu %u\n", tr->count, tr->sectors, (unsigned long)tr->ts.tv_sec, (unsigned long)tr->ts.tv_nsec, tr->rate); - if (ret < 0) - goto err; - if (ret >= len) { - ret = -ENOBUFS; - goto err; - } - p += ret; - len -= ret; } } - ret = PAGE_SIZE - len; -err: mutex_unlock(&mmc_test_lock); - return ret; + return 0; } -static ssize_t mmc_test_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) +static int mtf_test_open(struct inode *inode, struct file *file) { - struct mmc_card *card = mmc_dev_to_card(dev); + return single_open(file, mtf_test_show, inode->i_private); +} + +static ssize_t mtf_test_write(struct file *file, const char __user *buf, + size_t count, loff_t *pos) +{ + struct seq_file *sf = (struct seq_file *)file->private_data; + struct mmc_card *card = (struct mmc_card *)sf->private; struct mmc_test_card *test; + char lbuf[12]; long testcase; - if (strict_strtol(buf, 10, &testcase)) + if (count >= sizeof(lbuf)) + return -EINVAL; + + if (copy_from_user(lbuf, buf, count)) + return -EFAULT; + lbuf[count] = '\0'; + + if (strict_strtol(lbuf, 10, &testcase)) return -EINVAL; test = kzalloc(sizeof(struct mmc_test_card), GFP_KERNEL); @@ -2135,7 +2144,65 @@ static ssize_t mmc_test_store(struct device *dev, return count; } -static DEVICE_ATTR(test, S_IWUSR | S_IRUGO, mmc_test_show, mmc_test_store); +static const struct file_operations mmc_test_fops_test = { + .open = mtf_test_open, + .read = seq_read, + .write = mtf_test_write, + .llseek = seq_lseek, + .release = single_release, +}; + +static void mmc_test_free_file_test(struct mmc_card *card) +{ + struct mmc_test_dbgfs_file *df, *dfs; + + mutex_lock(&mmc_test_lock); + + list_for_each_entry_safe(df, dfs, &mmc_test_file_test, link) { + if (card && df->card != card) + continue; + debugfs_remove(df->file); + list_del(&df->link); + kfree(df); + } + + mutex_unlock(&mmc_test_lock); +} + +static int mmc_test_register_file_test(struct mmc_card *card) +{ + struct dentry *file = NULL; + struct mmc_test_dbgfs_file *df; + int ret = 0; + + mutex_lock(&mmc_test_lock); + + if (card->debugfs_root) + file = debugfs_create_file("test", S_IWUSR, card->debugfs_root, + card, &mmc_test_fops_test); + + if (IS_ERR_OR_NULL(file)) { + ret = -ENODEV; + goto err; + } + + df = kmalloc(sizeof(struct mmc_test_dbgfs_file), GFP_KERNEL); + if (!df) { + debugfs_remove(file); + ret = -ENOMEM; + goto err; + } + + df->card = card; + df->file = file; + + list_add(&df->link, &mmc_test_file_test); + +err: + mutex_unlock(&mmc_test_lock); + + return ret; +} static int mmc_test_probe(struct mmc_card *card) { @@ -2144,7 +2211,7 @@ static int mmc_test_probe(struct mmc_card *card) if (!mmc_card_mmc(card) && !mmc_card_sd(card)) return -ENODEV; - ret = device_create_file(&card->dev, &dev_attr_test); + ret = mmc_test_register_file_test(card); if (ret) return ret; @@ -2156,7 +2223,7 @@ static int mmc_test_probe(struct mmc_card *card) static void mmc_test_remove(struct mmc_card *card) { mmc_test_free_result(card); - device_remove_file(&card->dev, &dev_attr_test); + mmc_test_free_file_test(card); } static struct mmc_driver mmc_driver = { @@ -2176,6 +2243,7 @@ static void __exit mmc_test_exit(void) { /* Clear stalled data if card is still plugged */ mmc_test_free_result(NULL); + mmc_test_free_file_test(NULL); mmc_unregister_driver(&mmc_driver); }