CINXE.COM

LKML: Christoph Hellwig: [PATCH 2/2] dasd: remove dynamic ioctl registration

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>LKML: Christoph Hellwig: [PATCH 2/2] dasd: remove dynamic ioctl registration</title><link href="/css/message.css" rel="stylesheet" type="text/css" /><link href="/css/wrap.css" rel="alternate stylesheet" type="text/css" title="wrap" /><link href="/css/nowrap.css" rel="stylesheet" type="text/css" title="nowrap" /><link href="/favicon.ico" rel="shortcut icon" /><script src="/js/simple-calendar.js" type="text/javascript"></script><script src="/js/styleswitcher.js" type="text/javascript"></script><link rel="alternate" type="application/rss+xml" title="lkml.org : last 100 messages" href="/rss.php" /><link rel="alternate" type="application/rss+xml" title="lkml.org : last messages by Christoph Hellwig" href="/groupie.php?aid=30078" /><!--Matomo--><script> var _paq = window._paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push(["setDoNotTrack", true]); _paq.push(["disableCookies"]); _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="//m.lkml.org/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '1']); var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); })(); </script><!--End Matomo Code--></head><body onload="es.jasper.simpleCalendar.init();" itemscope="itemscope" itemtype="http://schema.org/BlogPosting"><table border="0" cellpadding="0" cellspacing="0"><tr><td width="180" align="center"><a href="/"><img style="border:0;width:135px;height:32px" src="/images/toprowlk.gif" alt="lkml.org" /></a></td><td width="32">聽</td><td class="nb"><div><a class="nb" href="/lkml"> [lkml]</a> 聽 <a class="nb" href="/lkml/2005"> [2005]</a> 聽 <a class="nb" href="/lkml/2005/12"> [Dec]</a> 聽 <a class="nb" href="/lkml/2005/12/16"> [16]</a> 聽 <a class="nb" href="/lkml/last100"> [last100]</a> 聽 <a href="/rss.php"><img src="/images/rss-or.gif" border="0" alt="RSS Feed" /></a></div><div>Views: <a href="#" class="nowrap" onclick="setActiveStyleSheet('wrap');return false;">[wrap]</a><a href="#" class="wrap" onclick="setActiveStyleSheet('nowrap');return false;">[no wrap]</a> 聽 <a class="nb" href="/lkml/mheaders/2005/12/16/120" onclick="this.href='/lkml/headers'+'/2005/12/16/120';">[headers]</a>聽 <a href="/lkml/bounce/2005/12/16/120">[forward]</a>聽 </div></td><td width="32">聽</td></tr><tr><td valign="top"><div class="es-jasper-simpleCalendar" baseurl="/lkml/"></div><div class="threadlist">Messages in this thread</div><ul class="threadlist"><li class="root"><a href="/lkml/2005/12/16/120">First message in thread</a></li><li class="origin"><a href="/lkml/2005/12/16/128">Christoph Hellwig</a><ul><li><a href="/lkml/2005/12/16/128">Martin Schwidefsky</a><ul><li><a href="/lkml/2005/12/16/130">Christoph Hellwig</a><ul><li><a href="/lkml/2005/12/16/157">Martin Schwidefsky</a><ul><li><a href="/lkml/2005/12/16/161">Christoph Hellwig</a></li></ul></li></ul></li></ul></li><li><a href="/lkml/2006/1/6/93">Christoph Hellwig</a><ul><li><a href="/lkml/2006/1/6/145">Ric Wheeler</a><ul><li><a href="/lkml/2006/1/6/146">Christoph Hellwig</a><ul><li><a href="/lkml/2006/1/6/147">Ric Wheeler</a></li></ul></li></ul></li></ul></li></ul></li></ul><div class="threadlist">Patch in this message</div><ul class="threadlist"><li><a href="/lkml/diff/2005/12/16/120/1">Get diff 1</a></li></ul></td><td width="32" rowspan="2" class="c" valign="top"><img src="/images/icornerl.gif" width="32" height="32" alt="/" /></td><td class="c" rowspan="2" valign="top" style="padding-top: 1em"><table><tr><td><table><tr><td class="lp">Date</td><td class="rp" itemprop="datePublished">Fri, 16 Dec 2005 15:33:48 +0100</td></tr><tr><td class="lp">From</td><td class="rp" itemprop="author">Christoph Hellwig &lt;&gt;</td></tr><tr><td class="lp">Subject</td><td class="rp" itemprop="name">[PATCH 2/2] dasd: remove dynamic ioctl registration</td></tr></table></td><td></td></tr></table><pre itemprop="articleBody">dasd has some really messy code to allow submodule to register ioctl.<br />Right now there are two cases: cmd and eckd.<br /><br />cmd was merged into the main module in the last patchh, so we don't<br />need the mechanism for it anymore.<br /><br />eckd is actually broken right now because we allow calling the eckd<br />ioctls on other dasd disciplines aswell, but they assume eckd-specific<br />private data.<br /><br />Fix this second issue by adding an ioctl method to the dasd_discipline<br />structure.<br /><br /><br />Signed-off-by: Christoph Hellwig &lt;hch&#64;lst.de&gt;<br /><br />Index: linux-2.6.15-rc5/drivers/s390/block/dasd.c<br />===================================================================<br />--- linux-2.6.15-rc5.orig/drivers/s390/block/dasd.c 2005-12-16 15:17:43.000000000 +0100<br />+++ linux-2.6.15-rc5/drivers/s390/block/dasd.c 2005-12-16 15:19:29.000000000 +0100<br />&#64;&#64; -1762,7 +1762,6 &#64;&#64;<br /> #ifdef CONFIG_PROC_FS<br /> dasd_proc_exit();<br /> #endif<br />- dasd_ioctl_exit();<br /> if (dasd_page_cache != NULL) {<br /> kmem_cache_destroy(dasd_page_cache);<br /> dasd_page_cache = NULL;<br />&#64;&#64; -2034,9 +2033,6 &#64;&#64;<br /> rc = dasd_parse();<br /> if (rc)<br /> goto failed;<br />- rc = dasd_ioctl_init();<br />- if (rc)<br />- goto failed;<br /> #ifdef CONFIG_PROC_FS<br /> rc = dasd_proc_init();<br /> if (rc)<br />Index: linux-2.6.15-rc5/drivers/s390/block/dasd_diag.c<br />===================================================================<br />--- linux-2.6.15-rc5.orig/drivers/s390/block/dasd_diag.c 2005-12-16 15:17:43.000000000 +0100<br />+++ linux-2.6.15-rc5/drivers/s390/block/dasd_diag.c 2005-12-16 15:19:29.000000000 +0100<br />&#64;&#64; -612,6 +612,7 &#64;&#64;<br /> .free_cp = dasd_diag_free_cp,<br /> .dump_sense = dasd_diag_dump_sense,<br /> .fill_info = dasd_diag_fill_info,<br />+ .ioctl = dasd_generic_ioctl,<br /> };<br /> <br /> static int __init<br />Index: linux-2.6.15-rc5/drivers/s390/block/dasd_eckd.c<br />===================================================================<br />--- linux-2.6.15-rc5.orig/drivers/s390/block/dasd_eckd.c 2005-12-16 15:17:43.000000000 +0100<br />+++ linux-2.6.15-rc5/drivers/s390/block/dasd_eckd.c 2005-12-16 15:19:29.000000000 +0100<br />&#64;&#64; -1485,6 +1485,26 &#64;&#64;<br /> return 0;<br /> }<br /> <br />+static int<br />+dasd_eckd_ioctl(struct block_device *bdev, unsigned int cmd, unsigned long arg)<br />+{<br />+ switch (cmd) {<br />+ case BIODASDGATTR:<br />+ return dasd_eckd_get_attrib(bdev, cmd, arg);<br />+ case BIODASDSATTR:<br />+ return dasd_eckd_set_attrib(bdev, cmd, arg);<br />+ case BIODASDPSRD:<br />+ return dasd_eckd_performance(bdev, cmd, arg);<br />+ case BIODASDRLSE:<br />+ return dasd_eckd_release(bdev, cmd, arg);<br />+ case BIODASDRSRV:<br />+ return dasd_eckd_reserve(bdev, cmd, arg);<br />+ case BIODASDSLCK:<br />+ return dasd_eckd_steal_lock(bdev, cmd, arg);<br />+ default:<br />+ return dasd_generic_ioctl(bdev, cmd, arg);<br />+}<br />+<br /> /*<br /> * Print sense data and related channel program.<br /> * Parts are printed because printk buffer is only 1024 bytes.<br />&#64;&#64; -1643,6 +1663,7 &#64;&#64;<br /> .free_cp = dasd_eckd_free_cp,<br /> .dump_sense = dasd_eckd_dump_sense,<br /> .fill_info = dasd_eckd_fill_info,<br />+ .ioctl = dasd_eckd_ioctl,<br /> };<br /> <br /> static int __init<br />&#64;&#64; -1650,37 +1671,11 &#64;&#64;<br /> {<br /> int ret;<br /> <br />- dasd_ioctl_no_register(THIS_MODULE, BIODASDGATTR,<br />- dasd_eckd_get_attrib);<br />- dasd_ioctl_no_register(THIS_MODULE, BIODASDSATTR,<br />- dasd_eckd_set_attrib);<br />- dasd_ioctl_no_register(THIS_MODULE, BIODASDPSRD,<br />- dasd_eckd_performance);<br />- dasd_ioctl_no_register(THIS_MODULE, BIODASDRLSE,<br />- dasd_eckd_release);<br />- dasd_ioctl_no_register(THIS_MODULE, BIODASDRSRV,<br />- dasd_eckd_reserve);<br />- dasd_ioctl_no_register(THIS_MODULE, BIODASDSLCK,<br />- dasd_eckd_steal_lock);<br />-<br /> ASCEBC(dasd_eckd_discipline.ebcname, 4);<br /> <br /> ret = ccw_driver_register(&amp;dasd_eckd_driver);<br />- if (ret) {<br />- dasd_ioctl_no_unregister(THIS_MODULE, BIODASDGATTR,<br />- dasd_eckd_get_attrib);<br />- dasd_ioctl_no_unregister(THIS_MODULE, BIODASDSATTR,<br />- dasd_eckd_set_attrib);<br />- dasd_ioctl_no_unregister(THIS_MODULE, BIODASDPSRD,<br />- dasd_eckd_performance);<br />- dasd_ioctl_no_unregister(THIS_MODULE, BIODASDRLSE,<br />- dasd_eckd_release);<br />- dasd_ioctl_no_unregister(THIS_MODULE, BIODASDRSRV,<br />- dasd_eckd_reserve);<br />- dasd_ioctl_no_unregister(THIS_MODULE, BIODASDSLCK,<br />- dasd_eckd_steal_lock);<br />+ if (ret)<br /> return ret;<br />- }<br /> <br /> dasd_generic_auto_online(&amp;dasd_eckd_driver);<br /> return 0;<br />&#64;&#64; -1690,19 +1685,6 &#64;&#64;<br /> dasd_eckd_cleanup(void)<br /> {<br /> ccw_driver_unregister(&amp;dasd_eckd_driver);<br />-<br />- dasd_ioctl_no_unregister(THIS_MODULE, BIODASDGATTR,<br />- dasd_eckd_get_attrib);<br />- dasd_ioctl_no_unregister(THIS_MODULE, BIODASDSATTR,<br />- dasd_eckd_set_attrib);<br />- dasd_ioctl_no_unregister(THIS_MODULE, BIODASDPSRD,<br />- dasd_eckd_performance);<br />- dasd_ioctl_no_unregister(THIS_MODULE, BIODASDRLSE,<br />- dasd_eckd_release);<br />- dasd_ioctl_no_unregister(THIS_MODULE, BIODASDRSRV,<br />- dasd_eckd_reserve);<br />- dasd_ioctl_no_unregister(THIS_MODULE, BIODASDSLCK,<br />- dasd_eckd_steal_lock);<br /> }<br /> <br /> module_init(dasd_eckd_init);<br />Index: linux-2.6.15-rc5/drivers/s390/block/dasd_fba.c<br />===================================================================<br />--- linux-2.6.15-rc5.orig/drivers/s390/block/dasd_fba.c 2005-12-16 15:17:43.000000000 +0100<br />+++ linux-2.6.15-rc5/drivers/s390/block/dasd_fba.c 2005-12-16 15:19:29.000000000 +0100<br />&#64;&#64; -565,6 +565,7 &#64;&#64;<br /> .free_cp = dasd_fba_free_cp,<br /> .dump_sense = dasd_fba_dump_sense,<br /> .fill_info = dasd_fba_fill_info,<br />+ .ioctl = dasd_generic_ioctl,<br /> };<br /> <br /> static int __init<br />Index: linux-2.6.15-rc5/drivers/s390/block/dasd_int.h<br />===================================================================<br />--- linux-2.6.15-rc5.orig/drivers/s390/block/dasd_int.h 2005-12-16 15:17:43.000000000 +0100<br />+++ linux-2.6.15-rc5/drivers/s390/block/dasd_int.h 2005-12-16 15:26:34.000000000 +0100<br />&#64;&#64; -69,15 +69,6 &#64;&#64;<br /> */<br /> struct dasd_device;<br /> <br />-typedef int (*dasd_ioctl_fn_t) (struct block_device *bdev, int no, long args);<br />-<br />-struct dasd_ioctl {<br />- struct list_head list;<br />- struct module *owner;<br />- int no;<br />- dasd_ioctl_fn_t handler;<br />-};<br />-<br /> typedef enum {<br /> dasd_era_fatal = -1, /* no chance to recover */<br /> dasd_era_none = 0, /* don't recover, everything alright */<br />&#64;&#64; -272,6 +263,7 &#64;&#64;<br /> /* i/o control functions. */<br /> int (*fill_geometry) (struct dasd_device *, struct hd_geometry *);<br /> int (*fill_info) (struct dasd_device *, struct dasd_information2_t *);<br />+ int (*ioctl) (struct block_device, unsigned int, unsigned long);<br /> };<br /> <br /> extern struct dasd_discipline *dasd_diag_discipline_pointer;<br />&#64;&#64; -490,6 +482,17 &#64;&#64;<br /> int dasd_generic_notify(struct ccw_device *, int);<br /> void dasd_generic_auto_online (struct ccw_driver *);<br /> <br />+/* externals in dasd_cmb.c */<br />+#ifdef CONFIG_DASD_CMB<br />+int dasd_cmd_ioctl(struct block_device *, unsigned int, unsigned long);<br />+#else<br />+static inline int dasd_cmd_ioctl(struct block_device *bdev,<br />+ unsigned int cmd, unsigned long arg)<br />+{<br />+ return -ENOIOCTLCMD;<br />+}<br />+#endif<br />+<br /> /* externals in dasd_devmap.c */<br /> extern int dasd_max_devindex;<br /> extern int dasd_probeonly;<br />&#64;&#64; -522,10 +525,7 &#64;&#64;<br /> void dasd_destroy_partitions(struct dasd_device *);<br /> <br /> /* externals in dasd_ioctl.c */<br />-int dasd_ioctl_init(void);<br />-void dasd_ioctl_exit(void);<br />-int dasd_ioctl_no_register(struct module *, int, dasd_ioctl_fn_t);<br />-int dasd_ioctl_no_unregister(struct module *, int, dasd_ioctl_fn_t);<br />+int dasd_generic_ioctl(struct block_device *, unsigned int, unsigned long);<br /> int dasd_ioctl(struct inode *, struct file *, unsigned int, unsigned long);<br /> long dasd_compat_ioctl(struct file *, unsigned int, unsigned long);<br /> <br />Index: linux-2.6.15-rc5/drivers/s390/block/dasd_ioctl.c<br />===================================================================<br />--- linux-2.6.15-rc5.orig/drivers/s390/block/dasd_ioctl.c 2005-12-16 15:17:43.000000000 +0100<br />+++ linux-2.6.15-rc5/drivers/s390/block/dasd_ioctl.c 2005-12-16 15:27:56.000000000 +0100<br />&#64;&#64; -25,97 +25,20 &#64;&#64;<br /> <br /> #include "dasd_int.h"<br /> <br />-/*<br />- * SECTION: ioctl functions.<br />- */<br />-static struct list_head dasd_ioctl_list = LIST_HEAD_INIT(dasd_ioctl_list);<br />-<br />-/*<br />- * Find the ioctl with number no.<br />- */<br />-static struct dasd_ioctl *<br />-dasd_find_ioctl(int no)<br />-{<br />- struct dasd_ioctl *ioctl;<br />-<br />- list_for_each_entry (ioctl, &amp;dasd_ioctl_list, list)<br />- if (ioctl-&gt;no == no)<br />- return ioctl;<br />- return NULL;<br />-}<br />-<br />-/*<br />- * Register ioctl with number no.<br />- */<br />-int<br />-dasd_ioctl_no_register(struct module *owner, int no, dasd_ioctl_fn_t handler)<br />-{<br />- struct dasd_ioctl *new;<br />- if (dasd_find_ioctl(no))<br />- return -EBUSY;<br />- new = kmalloc(sizeof (struct dasd_ioctl), GFP_KERNEL);<br />- if (new == NULL)<br />- return -ENOMEM;<br />- new-&gt;owner = owner;<br />- new-&gt;no = no;<br />- new-&gt;handler = handler;<br />- list_add(&amp;new-&gt;list, &amp;dasd_ioctl_list);<br />- return 0;<br />-}<br />-<br />-/*<br />- * Deregister ioctl with number no.<br />- */<br />-int<br />-dasd_ioctl_no_unregister(struct module *owner, int no, dasd_ioctl_fn_t handler)<br />-{<br />- struct dasd_ioctl *old = dasd_find_ioctl(no);<br />- if (old == NULL)<br />- return -ENOENT;<br />- if (old-&gt;no != no || old-&gt;handler != handler || owner != old-&gt;owner)<br />- return -EINVAL;<br />- list_del(&amp;old-&gt;list);<br />- kfree(old);<br />- return 0;<br />-}<br /> <br /> int<br />-dasd_ioctl(struct inode *inp, struct file *filp,<br />- unsigned int no, unsigned long data)<br />+dasd_ioctl(struct inode *inode, struct file *file,<br />+ unsigned int cmd, unsigned long arg)<br /> {<br />- struct block_device *bdev = inp-&gt;i_bdev;<br />+ struct block_device *bdev = inode-&gt;i_bdev;<br /> struct dasd_device *device = bdev-&gt;bd_disk-&gt;private_data;<br />- struct dasd_ioctl *ioctl;<br />- const char *dir;<br />- int rc;<br />+ int rval;<br /> <br />- if ((_IOC_DIR(no) != _IOC_NONE) &amp;&amp; (data == 0)) {<br />- PRINT_DEBUG("empty data ptr");<br />- return -EINVAL;<br />- }<br />- dir = _IOC_DIR (no) == _IOC_NONE ? "0" :<br />- _IOC_DIR (no) == _IOC_READ ? "r" :<br />- _IOC_DIR (no) == _IOC_WRITE ? "w" : <br />- _IOC_DIR (no) == (_IOC_READ | _IOC_WRITE) ? "rw" : "u";<br />- DBF_DEV_EVENT(DBF_DEBUG, device,<br />- "ioctl 0x%08x %s'0x%x'%d(%d) with data %8lx", no,<br />- dir, _IOC_TYPE(no), _IOC_NR(no), _IOC_SIZE(no), data);<br />- /* Search for ioctl no in the ioctl list. */<br />- list_for_each_entry(ioctl, &amp;dasd_ioctl_list, list) {<br />- if (ioctl-&gt;no == no) {<br />- /* Found a matching ioctl. Call it. */<br />- if (!try_module_get(ioctl-&gt;owner))<br />- continue;<br />- rc = ioctl-&gt;handler(bdev, no, data);<br />- module_put(ioctl-&gt;owner);<br />- return rc;<br />- }<br />- }<br />- /* No ioctl with number no. */<br />- DBF_DEV_EVENT(DBF_INFO, device,<br />- "unknown ioctl 0x%08x=%s'0x%x'%d(%d) data %8lx", no,<br />- dir, _IOC_TYPE(no), _IOC_NR(no), _IOC_SIZE(no), data);<br />- return -EINVAL;<br />+ rval = dasd_cmd_ioctl(bdev, cmd, arg);<br />+ if (rval != -ENOIOCTLCMD)<br />+ return rval;<br />+<br />+ return device-&gt;discipline-&gt;ioctl(bdev, cmd, arg);<br /> }<br /> <br /> long<br />&#64;&#64; -497,47 +420,35 &#64;&#64;<br /> return rc;<br /> }<br /> <br />-/*<br />- * List of static ioctls.<br />- */<br />-static struct { int no; dasd_ioctl_fn_t fn; } dasd_ioctls[] =<br />-{<br />- { BIODASDDISABLE, dasd_ioctl_disable },<br />- { BIODASDENABLE, dasd_ioctl_enable },<br />- { BIODASDQUIESCE, dasd_ioctl_quiesce },<br />- { BIODASDRESUME, dasd_ioctl_resume },<br />- { BIODASDFMT, dasd_ioctl_format },<br />- { BIODASDINFO, dasd_ioctl_information },<br />- { BIODASDINFO2, dasd_ioctl_information },<br />- { BIODASDPRRD, dasd_ioctl_read_profile },<br />- { BIODASDPRRST, dasd_ioctl_reset_profile },<br />- { BLKROSET, dasd_ioctl_set_ro },<br />- { DASDAPIVER, dasd_ioctl_api_version },<br />- { -1, NULL }<br />-};<br />-<br />-int<br />-dasd_ioctl_init(void)<br />-{<br />- int i;<br />-<br />- for (i = 0; dasd_ioctls[i].no != -1; i++)<br />- dasd_ioctl_no_register(NULL, dasd_ioctls[i].no,<br />- dasd_ioctls[i].fn);<br />- return 0;<br />-<br />-}<br />-<br />-void<br />-dasd_ioctl_exit(void)<br />+int dasd_generic_ioctl(struct block_device *bdev, unsigned int cmd,<br />+ unsigned long arg)<br /> {<br />- int i;<br />-<br />- for (i = 0; dasd_ioctls[i].no != -1; i++)<br />- dasd_ioctl_no_unregister(NULL, dasd_ioctls[i].no,<br />- dasd_ioctls[i].fn);<br />+ switch (cmd) {<br />+ case BIODASDDISABLE:<br />+ return dasd_ioctl_disable(bdev, cmd, arg);<br />+ case BIODASDDISABLE:<br />+ return dasd_ioctl_disable(bdev, cmd, arg);<br />+ case BIODASDENABLE:<br />+ return dasd_ioctl_enable(bdev, cmd, arg);<br />+ case BIODASDQUIESCE:<br />+ return dasd_ioctl_quiesce(bdev, cmd, arg);<br />+ case BIODASDRESUME:<br />+ return dasd_ioctl_resume(bdev, cmd, arg);<br />+ case BIODASDFMT:<br />+ return dasd_ioctl_format(bdev, cmd, arg);<br />+ case BIODASDINFO:<br />+ return dasd_ioctl_information(bdev, cmd, arg);<br />+ case BIODASDINFO2:<br />+ return dasd_ioctl_information(bdev, cmd, arg);<br />+ case BIODASDPRRD:<br />+ return dasd_ioctl_read_profile(bdev, cmd, arg);<br />+ case BIODASDPRRST:<br />+ return dasd_ioctl_reset_profile(bdev, cmd, arg);<br />+ case BLKROSET:<br />+ return dasd_ioctl_set_ro(bdev, cmd, arg);<br />+ case DASDAPIVER:<br />+ return dasd_ioctl_api_version(bdev, cmd, arg);<br />+ }<br /> <br />+ return -EINVAL;<br /> }<br />-<br />-EXPORT_SYMBOL(dasd_ioctl_no_register);<br />-EXPORT_SYMBOL(dasd_ioctl_no_unregister);<br />Index: linux-2.6.15-rc5/drivers/s390/block/dasd_cmb.c<br />===================================================================<br />--- linux-2.6.15-rc5.orig/drivers/s390/block/dasd_cmb.c 2005-12-12 18:31:37.000000000 +0100<br />+++ linux-2.6.15-rc5/drivers/s390/block/dasd_cmb.c 2005-12-16 15:26:49.000000000 +0100<br />&#64;&#64; -78,52 +78,21 &#64;&#64;<br /> return 0;<br /> }<br /> <br />-/* module initialization below here. dasd already provides a mechanism<br />- * to dynamically register ioctl functions, so we simply use this. */<br />-static inline int<br />-ioctl_reg(unsigned int no, dasd_ioctl_fn_t handler)<br />+int dasd_cmd_ioctl(struct block_device *bdev, unsigned int cmd,<br />+ unsigned long arg)<br /> {<br />- return dasd_ioctl_no_register(THIS_MODULE, no, handler);<br />-}<br />-<br />-static inline void<br />-ioctl_unreg(unsigned int no, dasd_ioctl_fn_t handler)<br />-{<br />- dasd_ioctl_no_unregister(THIS_MODULE, no, handler);<br />-}<br />-<br />-static void<br />-dasd_cmf_exit(void)<br />-{<br />- ioctl_unreg(BIODASDCMFENABLE, dasd_ioctl_cmf_enable);<br />- ioctl_unreg(BIODASDCMFDISABLE, dasd_ioctl_cmf_disable);<br />- ioctl_unreg(BIODASDREADALLCMB, dasd_ioctl_readall_cmb);<br />-}<br />-<br />-static int __init<br />-dasd_cmf_init(void)<br />-{<br />- int ret;<br />- ret = ioctl_reg (BIODASDCMFENABLE, dasd_ioctl_cmf_enable);<br />- if (ret)<br />- goto err;<br />- ret = ioctl_reg (BIODASDCMFDISABLE, dasd_ioctl_cmf_disable);<br />- if (ret)<br />- goto err;<br />- ret = ioctl_reg (BIODASDREADALLCMB, dasd_ioctl_readall_cmb);<br />- if (ret)<br />- goto err;<br />+ switch (cmd) {<br />+ case BIODASDCMFENABLE:<br />+ return dasd_ioctl_cmf_enable(bdev, cmd, arg);<br />+ case BIODASDCMFDISABLE:<br />+ return dasd_ioctl_cmf_disable(bdev, cmd, arg);<br />+ case BIODASDREADALLCMB:<br />+ return dasd_ioctl_readall_cmb(bdev, cmd, arg);<br />+ }<br /> <br />- return 0;<br />-err:<br />- dasd_cmf_exit();<br />-<br />- return ret;<br />+ return -ENOIOCTLCMD;<br /> }<br /> <br />-module_init(dasd_cmf_init);<br />-module_exit(dasd_cmf_exit);<br />-<br /> MODULE_AUTHOR("Arnd Bergmann &lt;arndb&#64;de.ibm.com&gt;");<br /> MODULE_LICENSE("GPL");<br /> MODULE_DESCRIPTION("channel measurement facility interface for dasd\n"<br />-<br />To unsubscribe from this list: send the line "unsubscribe linux-kernel" in<br />the body of a message to majordomo&#64;vger.kernel.org<br />More majordomo info at <a href="http://vger.kernel.org/majordomo-info.html">http://vger.kernel.org/majordomo-info.html</a><br />Please read the FAQ at <a href="http://www.tux.org/lkml/">http://www.tux.org/lkml/</a><br /></pre></td><td width="32" rowspan="2" class="c" valign="top"><img src="/images/icornerr.gif" width="32" height="32" alt="\" /></td></tr><tr><td align="right" valign="bottom"> 聽 </td></tr><tr><td align="right" valign="bottom">聽</td><td class="c" valign="bottom" style="padding-bottom: 0px"><img src="/images/bcornerl.gif" width="32" height="32" alt="\" /></td><td class="c">聽</td><td class="c" valign="bottom" style="padding-bottom: 0px"><img src="/images/bcornerr.gif" width="32" height="32" alt="/" /></td></tr><tr><td align="right" valign="top" colspan="2"> 聽 </td><td class="lm">Last update: 2005-12-16 15:36 聽聽 [from the cache]<br />漏2003-2020 <a href="http://blog.jasper.es/"><span itemprop="editor">Jasper Spaans</span></a>|hosted at <a href="https://www.digitalocean.com/?refcode=9a8e99d24cf9">Digital Ocean</a> and my Meterkast|<a href="http://blog.jasper.es/categories.html#lkml-ref">Read the blog</a></td><td>聽</td></tr></table><script language="javascript" src="/js/styleswitcher.js" type="text/javascript"></script></body></html>

Pages: 1 2 3 4 5 6 7 8 9 10