linux/drivers/scsi/raid_class.c
<<
val val vo/spa> vospa> class="lxr_search"> val="+search" method="post" onsubmit="return do_search(this);"> val val val Search vospa> class="lxr_prefs" val vo/spa> al < ="ajax+*" method="post" onsubmit="return false;"> voinput typ="vhidden" nam="vajax_lookup" id"vajax_lookup" alue="v"> al <
odiv id"vfile_contents"
< <1o/a>ospa> class="comment">/*o/spa>
 < <2o/a>ospa> class="comment"> * raid_class.c - implementaion vof a simple raid visualisaion vclasso/spa>
 < <3o/a>ospa> class="comment"> *o/spa>
 < <4o/a>ospa> class="comment"> * Copyright (c) 2005 - Jam=s Bottnmley <Jam=s.Bottnmley@steeleye.com>o/spa>
 < <5o/a>ospa> class="comment"> *o/spa>
 < <6o/a>ospa> class="comment"> * This file is licensed under GPLv2o/spa>
 < <7o/a>ospa> class="comment"> *o/spa>
 < <8o/a>ospa> class="comment"> * This class is designed to allow raid attribut=s to be visualised ando/spa>
 < <9o/a>ospa> class="comment"> * manipulated in a form independentvof the underlying raid.  Ultimately thiso/spa>
 < v3.8a>ospa> class="comment"> * should work for both hardware and software raids.o/spa>
 < 11o/a>ospa> class="comment"> */o/spa>
 < 12o/a>#include <linux/init.ho/a>> < 13o/a>#include <linux/module.ho/a>> < 14o/a>#include <linux/list.ho/a>> < 15o/a>#include <linux/slab.ho/a>> < 16o/a>#include <linux/string.ho/a>> < 17o/a>#include <linux/raid_class.ho/a>> < 18o/a>#include <scsi/scsi_device.ho/a>> < 19o/a>#include <scsi/scsi_host.ho/a>> < 23.8a> < 21o/a>#defineRAID_NUM_ATTRSo/a> <3 < 22.8a> < 23o/a>structraid_internalo/a> { < 24o/a> <<<<<<raid_templateo/a> oa href="+code=r" class="sref">ro/a>; < 25o/a> <<<<<<raid_funcion>_templateo/a> *oa href="+code=f" class="sref">fo/a>; < 26o/a> <<<<<< class="comment">/* The aciual attribut=s */o/spa>
 < 27o/a> <<<<<<device_attribut=o/a> oa href="+code=private_attrs" class="sref">private_attrso/a>[oa href="+code=RAID_NUM_ATTRS" class="sref">RAID_NUM_ATTRSo/a>]; < 28o/a> <<<<<< class="comment">/* The arrayvof null terminated pointers to attribut=s o/spa>
 < 29o/a>ospa> class="comment">         * needed by scsi_sysfs.c */o/spa>
 < 30o/a> <<<<<<device_attribut=o/a> *oa href="+code=attrs" class="sref">attrso/a>[oa href="+code=RAID_NUM_ATTRS" class="sref">RAID_NUM_ATTRSo/a> + 1]; < 31o/a>}; < 32.8a> < 33o/a>structraid_componento/a> { < 34o/a> <<<<<<list_heado/a> oa href="+code=node" class="sref">nodeo/a>; < 35o/a> <<<<<<deviceo/a> oa href="+code=dev" class="sref">devo/a>; < 36o/a> <<<<<<numo/a>; < 37o/a>}; < 38.8a> < 39o/a>#defineto_raid_internalo/a>(oa href="+code=tmpl" class="sref">tmplo/a>) container_ofo/a>(oa href="+code=tmpl" class="sref">tmplo/a>,raid_internalo/a>, oa href="+code=r" class="sref">ro/a>) < 43.8a> < 41o/a>#definetc_to_raid_internalo/a>(oa href="+code=tcont" class="sref">tconto/a>) ({                                   \ < 42o/a> <<<<<<raid_templateo/a> *oa href="+code=r" class="sref">ro/a> =                                       \ < 43o/a> <<<<<<< <<<<<<container_ofo/a>(oa href="+code=tcont" class="sref">tconto/a>,raid_templateo/a>, oa href="+code=raid_attrs" class="sref">raid_attrso/a>);  \ < 44o/a> <<<<<<to_raid_internalo/a>(oa href="+code=r" class="sref">ro/a>);                                            \ < 45o/a>}) < 46.8a> < 47o/a>#defineac_to_raid_internalo/a>(oa href="+code=acont" class="sref">aconto/a>) ({                                   \ < 48o/a> <<<<<<transport_containero/a> *oa href="+code=tc" class="sref">tco/a> =                                \ < 49o/a> <<<<<<< <<<<<<container_ofo/a>(oa href="+code=acont" class="sref">aconto/a>,transport_containero/a>, oa href="+code=ac" class="sref">aco/a>);    \ < 50o/a> <<<<<<tc_to_raid_internalo/a>(oa href="+code=tc" class="sref">tco/a>);                                        \ < 51o/a>}) < 52.8a> < 53o/a>#definedevice_to_raid_internalo/a>(oa href="+code=dev" class="sref">devo/a>) ({                         \ < 54o/a> <<<<<<attribut=_containero/a> *oa href="+code=ac" class="sref">aco/a> =                                \ < 55o/a> <<<<<<< <<<<<<attribut=_container_classdev_to_containero/a>(oa href="+code=dev" class="sref">devo/a>); \ < 56o/a> <<<<<<ac_to_raid_internalo/a>(oa href="+code=ac" class="sref">aco/a>);                                        \ < 57o/a>}) < 58o/a> <<<<<<< < 59.8a> < 60o/a>staticraid_matcho/a>(structattribut=_containero/a> *oa href="+code=cont" class="sref">conto/a>,deviceo/a> *oa href="+code=dev" class="sref">devo/a>) < 61o/a>{ < 62o/a> <<<<<< class="comment">/* We have to look for every subsystem that could houseo/spa>
 < 63o/a>ospa> class="comment">         * emulated RAID devices,
 < 64o/a> <<<<<<raid_internalo/a> *oa href="+code=i" class="sref">io/a> = oa href="+code=ac_to_raid_internal" class="sref">ac_to_raid_internalo/a>(oa href="+code=cont" class="sref">conto/a>); < 65.8a> < 66o/a>#ifdefinedo/a>(oa href="+code=CONFIG_SCSI" class="sref">CONFIG_SCSIo/a>) ||definedo/a>(oa href="+code=CONFIG_SCSI_MODULE" class="sref">CONFIG_SCSI_MODULEo/a>) < 67o/a> <<<<<<scsi_is_sdev_deviceo/a>(oa href="+code=dev" class="sref">devo/a>)) { < 68o/a> <<<<<<< <<<<<<scsi_deviceo/a> *oa href="+code=sdev" class="sref">sdevo/a> = oa href="+code=to_scsi_device" class="sref">to_scsi_deviceo/a>(oa href="+code=dev" class="sref">devo/a>); < 69.8a> < 70o/a> <<<<<<< <<<<<<io/a>->oa href="+code=f" class="sref">fo/a>->oa href="+code=cookie" class="sref">cookieo/a> != oa href="+code=sdev" class="sref">sdevo/a>->oa href="+code=host" class="sref">hosto/a>->oa href="+code=hostt" class="sref">hostto/a>) < 71o/a> <<<<<<< <<<<<<<<<<<<<<< 72.8a> < 73o/a> <<<<<<< <<<<<<io/a>->oa href="+code=f" class="sref">fo/a>->oa href="+code=is_raid" class="sref">is_raido/a>(oa href="+code=dev" class="sref">devo/a>); < 74o/a> <<<<<<<} < 75o/a>#endif < 76o/a> <<<<<< class="comment">/* FIXME: look at other subsystems too */o/spa>
 < 77o/a> <<<<<<< 78o/a>} < 79.8a> < 80o/a>staticraid_setupo/a>(structtransport_containero/a> *oa href="+code=tc" class="sref">tco/a>,deviceo/a> *oa href="+code=dev" class="sref">devo/a>, < 81o/a> <<<<<<< <<<<<<<<<<<<<deviceo/a> *oa href="+code=cdev" class="sref">cdevo/a>) < 82o/a>{ < 83o/a> <<<<<<raid_datao/a> *oa href="+code=rd" class="sref">rdo/a>; < 84.8a> < 85o/a> <<<<<<BUG_ONo/a>(oa href="+code=dev_get_drvdata" class="sref">dev_get_drvdatao/a>(oa href="+code=cdev" class="sref">cdevo/a>)); < 86.8a> < 87o/a> <<<<<<rdo/a> = oa href="+code=kzalloc" class="sref">kzalloco/a>(sizeof(*oa href="+code=rd" class="sref">rdo/a>), oa href="+code=GFP_KERNEL" class="sref">GFP_KERNELo/a>); < 88o/a> <<<<<<rdo/a>) < 89o/a> <<<<<<< <<<<<<ENOMEMo/a>; < 93.8a> < 91o/a> <<<<<<INIT_LIST_HEADo/a>(&oa href="+code=rd" class="sref">rdo/a>->oa href="+code=component_list" class="sref">component_listo/a>); < 92o/a> <<<<<<dev_set_drvdatao/a>(oa href="+code=cdev" class="sref">cdevo/a>, oa href="+code=rd" class="sref">rdo/a>); < 93o/a> <<<<<<< <<<<<<< < 94o/a> <<<<<<< 95o/a>} < 96.8a> < 97o/a>staticraid_removeo/a>(structtransport_containero/a> *oa href="+code=tc" class="sref">tco/a>,deviceo/a> *oa href="+code=dev" class="sref">devo/a>, < 98o/a> <<<<<<< <<<<<<<<<<<<<deviceo/a> *oa href="+code=cdev" class="sref">cdevo/a>) < 99o/a>{ <100o/a> <<<<<<raid_datao/a> *oa href="+code=rd" class="sref">rdo/a> = oa href="+code=dev_get_drvdata" class="sref">dev_get_drvdatao/a>(oa href="+code=cdev" class="sref">cdevo/a>); <101o/a> <<<<<<raid_componento/a> *oa href="+code=rc" class="sref">rco/a>,<*oa href="+code=next" class="sref">nexto/a>; <102o/a> <<<<<<dev_printko/a>(oa href="+code=KERN_ERR" class="sref">KERN_ERRo/a>, oa href="+code=dev" class="sref">devo/a>, class="string">"RAID REMOVE\n"o/spa>
); <103o/a> <<<<<<dev_set_drvdatao/a>(oa href="+code=cdev" class="sref">cdevo/a>, oa href="+code=NULL" class="sref">NULLo/a>); <104o/a> <<<<<<list_for_each_entry_safeo/a>(oa href="+code=rc" class="sref">rco/a>,nexto/a>, &oa href="+code=rd" class="sref">rdo/a>->oa href="+code=component_list" class="sref">component_listo/a>,nodeo/a>) { <105o/a> <<<<<<< <<<<<<list_delo/a>(&oa href="+code=rc" class="sref">rco/a>->oa href="+code=node" class="sref">nodeo/a>); <106o/a> <<<<<<< <<<<<<dev_printko/a>(oa href="+code=KERN_ERR" class="sref">KERN_ERRo/a>, oa href="+code=rc" class="sref">rco/a>->oa href="+code=dev" class="sref">devo/a>.oa href="+code=parent" class="sref">parento/a>, class="string">"RAID COMPONENT REMOVE\n"o/spa>
); <107o/a> <<<<<<< <<<<<<device_unregistero/a>(&oa href="+code=rc" class="sref">rco/a>->oa href="+code=dev" class="sref">devo/a>); <108o/a> <<<<<<<} <109o/a> <<<<<<dev_printko/a>(oa href="+code=KERN_ERR" class="sref">KERN_ERRo/a>, oa href="+code=dev" class="sref">devo/a>, class="string">"RAID REMOVE DONE\n"o/spa>
); <110o/a> <<<<<<kfreeo/a>(oa href="+code=rd" class="sref">rdo/a>); <111o/a> <<<<<<<112o/a>} <113o/a> <114o/a>staticDECLARE_TRANSPORT_CLASSo/a>(oa href="+code=raid_class" class="sref">raid_classo/a>, <115o/a> <<<<<<< <<<<<<<<<<<<<< <<<<<< class="string">"raid_devices"o/spa>
, <116o/a> <<<<<<< <<<<<<<<<<<<<< <<<<<<raid_setupo/a>, <117o/a> <<<<<<< <<<<<<<<<<<<<< <<<<<<raid_removeo/a>, <118o/a> <<<<<<< <<<<<<<<<<<<<< <<<<<<NULLo/a>); <119.8a> <120o/a>static<121o/a> <<<<<<raid_stateo/a> oa href="+code=alue=" class="sref">alue=o/a>; <122o/a> <<<<<<nam=o/a>; <123o/a>}raid_stateso/a>[] =<{ <124o/a> <<<<<<<{RAID_STATE_UNKNOWNo/a>, class="string">"unknown"o/spa>
 }, <125o/a> <<<<<<<{RAID_STATE_ACTIVEo/a>, class="string">"aciove"o/spa>
 }, <126o/a> <<<<<<<{RAID_STATE_DEGRADEDo/a>, class="string">"degraded"o/spa>
 }, <127o/a> <<<<<<<{RAID_STATE_RESYNCINGo/a>, class="string">"resyncing"o/spa>
 }, <128o/a> <<<<<<<{RAID_STATE_OFFLINEo/a>, class="string">"offline"o/spa>
 }, <129o/a>}; <133.8a> <131o/a>staticraid_state_nam=o/a>(enumraid_stateo/a> oa href="+code=state" class="sref">stateo/a>) <132o/a>{ <133o/a> <<<<<<io/a>; <134o/a> <<<<<<nam=o/a> = oa href="+code=NULL" class="sref">NULLo/a>; <135.8a> <136o/a> <<<<<<io/a> = 0; oa href="+code=i" class="sref">io/a> < oa href="+code=ARRAY_SIZE" class="sref">ARRAY_SIZEo/a>(oa href="+code=raid_states" class="sref">raid_stateso/a>); oa href="+code=i" class="sref">io/a>++) { <137o/a> <<<<<<< <<<<<<raid_stateso/a>[oa href="+code=i" class="sref">io/a>].oa href="+code=alue=" class="sref">alue=o/a> == oa href="+code=state" class="sref">stateo/a>) { <138o/a> <<<<<<< <<<<<<<<<<<<<< oa href="+code=nam=" class="sref">nam=o/a> = oa href="+code=raid_states" class="sref">raid_stateso/a>[oa href="+code=i" class="sref">io/a>].oa href="+code=nam=" class="sref">nam=o/a>; <139o/a> <<<<<<< <<<<<<<<<<<<<<<140o/a> <<<<<<< <<<<<<<} <141o/a> <<<<<<<} <142o/a> <<<<<<nam=o/a>; <143o/a>} <144.8a> <145o/a>static<146o/a> <<<<<<raid_levelo/a> oa href="+code=alue=" class="sref">alue=o/a>; <147o/a> <<<<<<nam=o/a>; <148o/a>}raid_levelso/a>[] =<{ <149o/a> <<<<<<<{RAID_LEVEL_UNKNOWNo/a>, class="string">"unknown"o/spa>
 }, <150o/a> <<<<<<<{RAID_LEVEL_LINEARo/a>, class="string">"linear"o/spa>
 }, <151o/a> <<<<<<<{RAID_LEVEL_0o/a>, class="string">"raid0"o/spa>
 }, <152o/a> <<<<<<<{RAID_LEVEL_1o/a>, class="string">"raid1"o/spa>
 }, <153o/a> <<<<<<<{RAID_LEVEL_10o/a>, class="string">"raid10"o/spa>
 }, <154o/a> <<<<<<<{RAID_LEVEL_1Eo/a>, class="string">"raid1e"o/spa>
 }, <155o/a> <<<<<<<{RAID_LEVEL_3o/a>, class="string">"raid3"o/spa>
 }, <156o/a> <<<<<<<{RAID_LEVEL_4o/a>, class="string">"raid4"o/spa>
 }, <157o/a> <<<<<<<{RAID_LEVEL_5o/a>, class="string">"raid5"o/spa>
 }, <158o/a> <<<<<<<{RAID_LEVEL_50o/a>, class="string">"raid50"o/spa>
 }, <159o/a> <<<<<<<{RAID_LEVEL_6o/a>, class="string">"raid6"o/spa>
 }, <160o/a>}; <161o/a> <162o/a>staticraid_level_nam=o/a>(enumraid_levelo/a> oa href="+code=level" class="sref">levelo/a>) <163o/a>{ <164o/a> <<<<<<io/a>; <165o/a> <<<<<<nam=o/a> = oa href="+code=NULL" class="sref">NULLo/a>; <166.8a> <167o/a> <<<<<<io/a> = 0; oa href="+code=i" class="sref">io/a> < oa href="+code=ARRAY_SIZE" class="sref">ARRAY_SIZEo/a>(oa href="+code=raid_levels" class="sref">raid_levelso/a>); oa href="+code=i" class="sref">io/a>++) { <168o/a> <<<<<<< <<<<<<raid_levelso/a>[oa href="+code=i" class="sref">io/a>].oa href="+code=alue=" class="sref">alue=o/a> == oa href="+code=level" class="sref">levelo/a>) { <169o/a> <<<<<<< <<<<<<<<<<<<<<nam=o/a> = oa href="+code=raid_levels" class="sref">raid_levelso/a>[oa href="+code=i" class="sref">io/a>].oa href="+code=nam=" class="sref">nam=o/a>; <170o/a> <<<<<<< <<<<<<<<<<<<<<<171o/a> <<<<<<< <<<<<<<} <172o/a> <<<<<<<} <173o/a> <<<<<<nam=o/a>; <174o/a>} <175.8a> <176o/a>#defineraid_attr_show_internalo/a>(oa href="+code=attr" class="sref">attro/a>,fmto/a>,varo/a>,codeo/a>)                   \ <177o/a>staticssize_to/a> oa href="+code=raid_show_" class="sref">raid_show_o/a>##attr(structdeviceo/a> *oa href="+code=dev" class="sref">devo/a>,<<<<< <<<<<<<<<<<<<<<\ <178o/a> <<<<<<< <<<<<<<<<<<<<< <<<<<<<device_attribut=o/a> *oa href="+code=attr" class="sref">attro/a>,<<<<<<<<<<\ <179o/a> <<<<<<< <<<<<<<<<<<<<<<<<<<<<<bufo/a>)                   <<<<<<<<<<<\ <180o/a>{                                                                       \ <181o/a> <<<<<<raid_datao/a> *oa href="+code=rd" class="sref">rdo/a> = oa href="+code=dev_get_drvdata" class="sref">dev_get_drvdatao/a>(oa href="+code=dev" class="sref">devo/a>);                    \ <182o/a> <<<<<<codeo/a>                                                            \ <183o/a> <<<<<<snprintfo/a>(oa href="+code=buf" class="sref">bufo/a>, 20, #fmt class="string">"\n"o/spa>
,varo/a>);                       \ <184o/a>} <185.8a> <186o/a>#defineraid_attr_ro_stateso/a>(oa href="+code=attr" class="sref">attro/a>,stateso/a>,codeo/a>)                         \ <187o/a>oa href="+code=raid_attr_show_internal" class="sref">raid_attr_show_internalo/a>(oa href="+code=attr" class="sref">attro/a>,<%oa href="+code=s" class="sref">so/a>,nam=o/a>,<<<<< <<<<<<<<<<<<<<<            \ <188o/a> <<<<<<nam=o/a>;                                               \ <189o/a> <<<<<<codeo/a>                                                            \ <190o/a> <<<<<<nam=o/a> = oa href="+code=raid_" class="sref">raid_o/a>##states##_nam=(oa href="+code=rd" class="sref">rdo/a>->oa href="+code=attr" class="sref">attro/a>);                          \ <191o/a>)                   <<<<<<<<<<<                                         \ <192o/a>staticDEVICE_ATTRo/a>(oa href="+code=attr" class="sref">attro/a>,S_IRUGOo/a>,raid_show_o/a>##attr, oa href="+code=NULL" class="sref">NULLo/a>) <193o/a> <194.8a> <195o/a>#defineraid_attr_ro_internalo/a>(oa href="+code=attr" class="sref">attro/a>,codeo/a>)                               \ <196.8a>oa href="+code=raid_attr_show_internal" class="sref">raid_attr_show_internalo/a>(oa href="+code=attr" class="sref">attro/a>,<%oa href="+code=d" class="sref">do/a>,rdo/a>->oa href="+code=attr" class="sref">attro/a>,codeo/a>)                       \ <197o/a>staticDEVICE_ATTRo/a>(oa href="+code=attr" class="sref">attro/a>,S_IRUGOo/a>,raid_show_o/a>##attr, oa href="+code=NULL" class="sref">NULLo/a>) <198.8a> <199o/a>#defineATTR_CODEo/a>(oa href="+code=attr" class="sref">attro/a>)                   <<<<<<<<<<<                   \ <200o/a> <<<<<<raid_internalo/a> *oa href="+code=i" class="sref">io/a> = oa href="+code=device_to_raid_internal" class="sref">device_to_raid_internalo/a>(oa href="+code=dev" class="sref">devo/a>);         \ <201o/a> <<<<<<io/a>->oa href="+code=f" class="sref">fo/a>->oa href="+code=get_" class="sref">get_o/a>##attr)                   <<<<<<<<<<<             \ <202o/a> <<<<<<<<<<<<<<io/a>->oa href="+code=f" class="sref">fo/a>->oa href="+code=get_" class="sref">get_o/a>##attr(oa href="+code=dev" class="sref">devo/a>->oa href="+code=parent" class="sref">parento/a>); <203o/a> <204o/a>#defineraid_attr_roo/a>(oa href="+code=attr" class="sref">attro/a>)      oa href="+code=raid_attr_ro_internal" class="sref">raid_attr_ro_internalo/a>(oa href="+code=attr" class="sref">attro/a>,<) <205o/a>#defineraid_attr_ro_fno/a>(oa href="+code=attr" class="sref">attro/a>)   oa href="+code=raid_attr_ro_internal" class="sref">raid_attr_ro_internalo/a>(oa href="+code=attr" class="sref">attro/a>,ATTR_CODEo/a>(oa href="+code=attr" class="sref">attro/a>)) <206o/a>#defineraid_attr_ro_stateo/a>(oa href="+code=attr" class="sref">attro/a>)        oa href="+code=raid_attr_ro_states" class="sref">raid_attr_ro_stateso/a>(oa href="+code=attr" class="sref">attro/a>,attro/a>,<) <207o/a>#defineraid_attr_ro_state_fno/a>(oa href="+code=attr" class="sref">attro/a>)     oa href="+code=raid_attr_ro_states" class="sref">raid_attr_ro_stateso/a>(oa href="+code=attr" class="sref">attro/a>,attro/a>,ATTR_CODEo/a>(oa href="+code=attr" class="sref">attro/a>)) <208.8a> <209.8a> <210o/a>oa href="+code=raid_attr_ro_state" class="sref">raid_attr_ro_stateo/a>(oa href="+code=level" class="sref">levelo/a>); <211o/a>oa href="+code=raid_attr_ro_fn" class="sref">raid_attr_ro_fno/a>(oa href="+code=resync" class="sref">resynco/a>); <212o/a>oa href="+code=raid_attr_ro_state_fn" class="sref">raid_attr_ro_state_fno/a>(oa href="+code=state" class="sref">stateo/a>); <213o/a> <214o/a>staticraid_component_releaseo/a>(structdeviceo/a> *oa href="+code=dev" class="sref">devo/a>) <215o/a>{ <216o/a> <<<<<<raid_componento/a> *oa href="+code=rc" class="sref">rco/a> = <217o/a> <<<<<<< <<<<<<container_ofo/a>(oa href="+code=dev" class="sref">devo/a>,raid_componento/a>, oa href="+code=dev" class="sref">devo/a>); <218o/a> <<<<<<dev_printko/a>(oa href="+code=KERN_ERR" class="sref">KERN_ERRo/a>, oa href="+code=rc" class="sref">rco/a>->oa href="+code=dev" class="sref">devo/a>.oa href="+code=parent" class="sref">parento/a>, class="string">"COMPONENT RELEASE\n"o/spa>
); <219o/a> <<<<<<put_deviceo/a>(oa href="+code=rc" class="sref">rco/a>->oa href="+code=dev" class="sref">devo/a>.oa href="+code=parent" class="sref">parento/a>); <220o/a> <<<<<<kfreeo/a>(oa href="+code=rc" class="sref">rco/a>); <221o/a>} <222.8a> <223o/a>int oa href="+code=raid_component_add" class="sref">raid_component_addo/a>(structraid_templateo/a> *oa href="+code=r" class="sref">ro/a>,structdeviceo/a> *oa href="+code=raid_dev" class="sref">raid_devo/a>, <224o/a> <<<<<<<<<<<<<<<<<<<<<deviceo/a> *oa href="+code=component_dev" class="sref">component_devo/a>) <225o/a>{ <226o/a> <<<<<<deviceo/a> *oa href="+code=cdev" class="sref">cdevo/a> = <227o/a> <<<<<<< <<<<<<attribut=_container_find_class_deviceo/a>(&oa href="+code=r" class="sref">ro/a>->oa href="+code=raid_attrs" class="sref">raid_attrso/a>.oa href="+code=ac" class="sref">aco/a>, <228o/a> <<<<<<< <<<<<<<<<<<<<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<raid_devo/a>); <229o/a> <<<<<<raid_componento/a> *oa href="+code=rc" class="sref">rco/a>; <230o/a> <<<<<<raid_datao/a> *oa href="+code=rd" class="sref">rdo/a> = oa href="+code=dev_get_drvdata" class="sref">dev_get_drvdatao/a>(oa href="+code=cdev" class="sref">cdevo/a>); <231o/a> <<<<<<erro/a>; <232.8a> <233o/a> <<<<<<rco/a> =kzalloco/a>(sizeof(*oa href="+code=rc" class="sref">rco/a>), oa href="+code=GFP_KERNEL" class="sref">GFP_KERNELo/a>); <234o/a> <<<<<<rco/a>) <235o/a> <<<<<<< <<<<<<ENOMEMo/a>; <236.8a> <237o/a> <<<<<<INIT_LIST_HEADo/a>(&oa href="+code=rc" class="sref">rco/a>->oa href="+code=node" class="sref">nodeo/a>); <238o/a> <<<<<<device_initializeo/a>(&oa href="+code=rc" class="sref">rco/a>->oa href="+code=dev" class="sref">devo/a>); <239o/a> <<<<<<rco/a>->oa href="+code=dev" class="sref">devo/a>.oa href="+code=release" class="sref">releaseo/a> = oa href="+code=raid_component_release" class="sref">raid_component_releaseo/a>; <240o/a> <<<<<<rco/a>->oa href="+code=dev" class="sref">devo/a>.oa href="+code=parent" class="sref">parento/a> = oa href="+code=get_device" class="sref">get_deviceo/a>(oa href="+code=component_dev" class="sref">component_devo/a>); <241o/a> <<<<<<rco/a>->oa href="+code=num" class="sref">numo/a> = oa href="+code=rd" class="sref">rdo/a>->oa href="+code=component_count" class="sref">component_counto/a>++; <242.8a> <243o/a> <<<<<<dev_set_nam=o/a>(&oa href="+code=rc" class="sref">rco/a>->oa href="+code=dev" class="sref">devo/a>, class="string">"component-%d"o/spa>
,rco/a>->oa href="+code=num" class="sref">numo/a>); <244o/a> <<<<<<list_add_tailo/a>(&oa href="+code=rc" class="sref">rco/a>->oa href="+code=node" class="sref">nodeo/a>, &oa href="+code=rd" class="sref">rdo/a>->oa href="+code=component_list" class="sref">component_listo/a>); <245o/a> <<<<<<rco/a>->oa href="+code=dev" class="sref">devo/a>.oa href="+code=class" class="sref">classo/a> = &oa href="+code=raid_class" class="sref">raid_classo/a>.oa href="+code=class" class="sref">classo/a>; <246o/a> <<<<<<erro/a> = oa href="+code=device_add" class="sref">device_addo/a>(&oa href="+code=rc" class="sref">rco/a>->oa href="+code=dev" class="sref">devo/a>); <247o/a> <<<<<<erro/a>) <248o/a> <<<<<<< <<<<<<err_outo/a>; <249.8a> <250o/a> <<<<<<<251o/a> <252o/a>oa href="+code=err_out" class="sref">err_outo/a>: <253o/a> <<<<<<list_delo/a>(&oa href="+code=rc" class="sref">rco/a>->oa href="+code=node" class="sref">nodeo/a>); <254o/a> <<<<<<rdo/a>->oa href="+code=component_count" class="sref">component_counto/a>--; <255o/a> <<<<<<put_deviceo/a>(oa href="+code=component_dev" class="sref">component_devo/a>); <256o/a> <<<<<<kfreeo/a>(oa href="+code=rc" class="sref">rco/a>); <257o/a> <<<<<<erro/a>; <258o/a>} <259o/a>oa href="+code=EXPORT_SYMBOL" class="sref">EXPORT_SYMBOLo/a>(oa href="+code=raid_component_add" class="sref">raid_component_addo/a>); <263.8a> <261o/a>structraid_templateo/a> * <262o/a>oa href="+code=raid_class_attach" class="sref">raid_class_attacho/a>(structraid_function_templateo/a> *oa href="+code=ft" class="sref">fto/a>) <263o/a>{ <264o/a> <<<<<<raid_internalo/a> *oa href="+code=i" class="sref">io/a> = oa href="+code=kzalloc" class="sref">kzalloco/a>(sizeof(structraid_internalo/a>), <265o/a> <<<<<<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<GFP_KERNELo/a>); <266o/a> <<<<<<counto/a> = 0; <267o/a> <268o/a> <<<<<<unlikelyo/a>(!oa href="+code=i" class="sref">io/a>)) <269o/a> <<<<<<< <<<<<<NULLo/a>; <273.8a> <271o/a> <<<<<<io/a>->oa href="+code=f" class="sref">fo/a> = oa href="+code=ft" class="sref">fto/a>; <272.8a> <273o/a> <<<<<<io/a>->oa href="+code=r" class="sref">ro/a>.oa href="+code=raid_attrs" class="sref">raid_attrso/a>.oa href="+code=ac" class="sref">aco/a>.oa href="+code=class" class="sref">classo/a> = &oa href="+code=raid_class" class="sref">raid_classo/a>.oa href="+code=class" class="sref">classo/a>; <274o/a> <<<<<<io/a>->oa href="+code=r" class="sref">ro/a>.oa href="+code=raid_attrs" class="sref">raid_attrso/a>.oa href="+code=ac" class="sref">aco/a>.oa href="+code=match" class="sref">matcho/a> = oa href="+code=raid_match" class="sref">raid_matcho/a>; <275o/a> <<<<<<io/a>->oa href="+code=r" class="sref">ro/a>.oa href="+code=raid_attrs" class="sref">raid_attrso/a>.oa href="+code=ac" class="sref">aco/a>.oa href="+code=attrs" class="sref">attrso/a> = &oa href="+code=i" class="sref">io/a>->oa href="+code=attrs" class="sref">attrso/a>[0]; <276.8a> <277o/a> <<<<<<attribut=_container_registero/a>(&oa href="+code=i" class="sref">io/a>->oa href="+code=r" class="sref">ro/a>.oa href="+code=raid_attrs" class="sref">raid_attrso/a>.oa href="+code=ac" class="sref">aco/a>); <278.8a> <279o/a> <<<<<<io/a>->oa href="+code=attrs" class="sref">attrso/a>[oa href="+code=count" class="sref">counto/a>++] = &oa href="+code=dev_attr_level" class="sref">dev_attr_levelo/a>; <280o/a> <<<<<<io/a>->oa href="+code=attrs" class="sref">attrso/a>[oa href="+code=count" class="sref">counto/a>++] = &oa href="+code=dev_attr_resync" class="sref">dev_attr_resynco/a>; <281o/a> <<<<<<io/a>->oa href="+code=attrs" class="sref">attrso/a>[oa href="+code=count" class="sref">counto/a>++] = &oa href="+code=dev_attr_state" class="sref">dev_attr_stateo/a>; <282.8a> <283o/a> <<<<<<io/a>->oa href="+code=attrs" class="sref">attrso/a>[oa href="+code=count" class="sref">counto/a>] = oa href="+code=NULL" class="sref">NULLo/a>; <284o/a> <<<<<<BUG_ONo/a>(oa href="+code=count" class="sref">counto/a> >RAID_NUM_ATTRSo/a>); <285.8a> <286o/a> <<<<<<io/a>->oa href="+code=r" class="sref">ro/a>; <287o/a>} <288o/a>oa href="+code=EXPORT_SYMBOL" class="sref">EXPORT_SYMBOLo/a>(oa href="+code=raid_class_attach" class="sref">raid_class_attacho/a>); <289.8a> <290o/a>void <291o/a>oa href="+code=raid_class_release" class="sref">raid_class_releaseo/a>(structraid_templateo/a> *oa href="+code=r" class="sref">ro/a>) <292o/a>{ <293o/a> <<<<<<raid_internalo/a> *oa href="+code=i" class="sref">io/a> = oa href="+code=to_raid_internal" class="sref">to_raid_internalo/a>(oa href="+code=r" class="sref">ro/a>); <294.8a> <295o/a> <<<<<<BUG_ONo/a>(oa href="+code=attribut=_container_unregister" class="sref">attribut=_container_unregistero/a>(&oa href="+code=i" class="sref">io/a>->oa href="+code=r" class="sref">ro/a>.oa href="+code=raid_attrs" class="sref">raid_attrso/a>.oa href="+code=ac" class="sref">aco/a>)); <296.8a> <297o/a> <<<<<<kfreeo/a>(oa href="+code=i" class="sref">io/a>); <298o/a>} <299o/a>oa href="+code=EXPORT_SYMBOL" class="sref">EXPORT_SYMBOLo/a>(oa href="+code=raid_class_release" class="sref">raid_class_releaseo/a>); <303.8a> <301o/a>static__inito/a> int oa href="+code=raid_init" class="sref">raid_inito/a>(void) <302o/a>{ <303o/a> <<<<<<transport_class_registero/a>(&oa href="+code=raid_class" class="sref">raid_classo/a>); <304o/a>} <305.8a> <306o/a>static__exito/a> voidraid_exito/a>(void) <307o/a>{ <308o/a> <<<<<<transport_class_unregistero/a>(&oa href="+code=raid_class" class="sref">raid_classo/a>); <309.8a>} <313.8a> <311o/a>oa href="+code=MODULE_AUTHOR" class="sref">MODULE_AUTHORo/a>(ospa> class="string">"Jam=s Bottomley"o/spa>
); <312o/a>oa href="+code=MODULE_DESCRIPTION" class="sref">MODULE_DESCRIPTIONo/a>(ospa> class="string">"RAID device class"o/spa>
); <313o/a>oa href="+code=MODULE_LICENSE" class="sref">MODULE_LICENSEo/a>(ospa> class="string">"GPL"o/spa>
); <314.8a> <315o/a>oa href="+code=module_init" class="sref">module_inito/a>(oa href="+code=raid_init" class="sref">raid_inito/a>); <316.8a>oa href="+code=module_exit" class="sref">module_exito/a>(oa href="+code=raid_exit" class="sref">raid_exito/a>); <317o/a> <318o/a>
lxr.linux.no kindly hosted by oa href="http://www.redpill-linpro.no">Redpill Linpro ASo/a>, provider of Linux