title: i_zone[7] how to stand for 512 blocks?
body: <p>I'm reading the kernel of Linux 0.12, the codes in inode.c:</p>
  
  <pre><code>static int _bmap(struct m_inode * inode,int block,int create)
  {
      struct buffer_head * bh;
      int i;
  
      if (block&lt;0)
          panic("_bmap: block&lt;0");
      if (block &gt;= 7+512+512*512)
          panic("_bmap: block&gt;big");
      if (block&lt;7) {
          if (create &amp;&amp; !inode-&gt;i_zone[block])
              if (inode-&gt;i_zone[block]=new_block(inode-&gt;i_dev)) {
                  inode-&gt;i_ctime=CURRENT_TIME;
                  inode-&gt;i_dirt=1;
              }
          return inode-&gt;i_zone[block];
      }
  block -= 7;
      if (block&lt;512) {
          if (create &amp;&amp; !inode-&gt;i_zone[7])
              if (inode-&gt;i_zone[7]=new_block(inode-&gt;i_dev)) {
                  inode-&gt;i_dirt=1;
                  inode-&gt;i_ctime=CURRENT_TIME;
              }
          if (!inode-&gt;i_zone[7])
              return 0;
          if (!(bh = bread(inode-&gt;i_dev,inode-&gt;i_zone[7])))
              return 0;
          i = ((unsigned short *) (bh-&gt;b_data))[block];
          if (create &amp;&amp; !i)
              if (i=new_block(inode-&gt;i_dev)) {
                  ((unsigned short *) (bh-&gt;b_data))[block]=i;
                  bh-&gt;b_dirt=1;
              }
          brelse(bh);
          return i;
      }
  block -= 512;
      if (create &amp;&amp; !inode-&gt;i_zone[8])
          if (inode-&gt;i_zone[8]=new_block(inode-&gt;i_dev)) {
              inode-&gt;i_dirt=1;
              inode-&gt;i_ctime=CURRENT_TIME;
          }
      if (!inode-&gt;i_zone[8])
          return 0;
      if (!(bh=bread(inode-&gt;i_dev,inode-&gt;i_zone[8])))
          return 0;
      i = ((unsigned short *)bh-&gt;b_data)[block&gt;&gt;9];
      if (create &amp;&amp; !i)
          if (i=new_block(inode-&gt;i_dev)) {
              ((unsigned short *) (bh-&gt;b_data))[block&gt;&gt;9]=i;
              bh-&gt;b_dirt=1;
          }
      brelse(bh);
      if (!i)
          return 0;
      if (!(bh=bread(inode-&gt;i_dev,i)))
          return 0;
      i = ((unsigned short *)bh-&gt;b_data)[block&amp;511];
      if (create &amp;&amp; !i)
          if (i=new_block(inode-&gt;i_dev)) {
              ((unsigned short *) (bh-&gt;b_data))[block&amp;511]=i;
              bh-&gt;b_dirt=1;
          }
      brelse(bh);
      return i;
  }
  </code></pre>
  
  <p>I konw that i_zone[0] ~ i_zone[6] can store a block. But the i_zone how to 
  stand for 512 blocks?  and i_zone[8] how to stand for 512*512 blocks ?</p>
  
  <p>Thank you </p>