I see that it works, but I&#39;m not exactly following how.  Maybe I just don&#39;t have enough C experience.  But I can&#39;t seem to duplicate that functionality.  <div><br></div><div>I understand the way I&#39;ve normally seen inheritance, where:</div>
<div><br></div><div>struct Child {</div><div>  struct Parent p;</div><div>  int somethingOnlyForChildren;</div><div>}<br></div><div><br></div>Or something similar.  Then the Child struct can be casted as a Parent, and since there is no padding before the first piece of data in a struct, every parent attribute is accessed as though the struct were a Parent.<div>
<br></div><div>I see how it all lines up in memory, but in the case of the kernel code I can&#39;t quite follow it.  Wouldn&#39;t everything assigned to &#39;inherits&#39; be so much farther down in memory?  I feel like I&#39;m missing something.  Is there a special way they all need to be accessed?</div>
<div><br></div><div>- Peter</div><div><div><br><div class="gmail_quote">On Thu, May 26, 2011 at 7:23 PM, Greg KH <span dir="ltr">&lt;<a href="mailto:greg@kroah.com">greg@kroah.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div><div></div><div class="h5">On Thu, May 26, 2011 at 02:46:08PM -0600, Peter Hamilton wrote:<br>
&gt; The code in drivers/ata/ uses an implementation of inheritance that I have not<br>
&gt; seen before.  It&#39;s only briefly explained in the header file ( include/linux/<br>
&gt; libata.h:885):<br>
&gt;<br>
&gt; /*  <br>
&gt;  * -&gt;inherits must be the last field and all the preceding<br>
&gt;  * fields must be pointers.<br>
&gt;  */<br>
&gt;<br>
&gt; The structs are then initialized with .inherits assigned first:<br>
&gt;<br>
&gt; drivers/ata/sata_nv.c:475<br>
&gt;<br>
&gt; static struct ata_port_operations nv_nf2_ops = {                              <br>
&gt;         .inherits               = &amp;nv_generic_ops,<br>
&gt;         .freeze                 = nv_nf2_freeze,                              <br>
&gt;         .thaw                   = nv_nf2_thaw,                                <br>
&gt; };      <br>
&gt;<br>
&gt;<br>
&gt; Is this actually implementing inheritance?  Why do all preceding fields need to<br>
&gt; be pointers?<br>
&gt;<br>
&gt; As far as I can tell, this style is only found in the ata drivers.  <br>
<br>
</div></div>I think you are right, but more subsystems need to emulate it, it is<br>
very powerful and works very well.  I have been wanting to convert the<br>
usb-serial layer to use the same thing one of these days.<br>
<div class="im"><br>
&gt; Could anyone explain how this works?<br>
<br>
</div>The code is all there that shows it, but basically the driver is telling<br>
the core to &quot;use this type of functions, but if I set any others, use<br>
them instead.&quot;  It&#39;s a nicer way of doing inheritance in C than we do in<br>
other places in the kernel where we are a bit more &quot;verbose&quot; in making<br>
it happen.<br>
<br>
hope this helps,<br>
<br>
greg k-h<br>
</blockquote></div><br></div></div>