code: List<LocatedBlock> getCompanionBlocks(String path, FileInfo info, Block block, FSInodeInfo inode)
        throws IOException {
      Codec codec = info.codec;
      switch (info.type) {
        case NOT_RAID:
          return Collections.emptyList();
        case HAR_TEMP_PARITY:
          return getCompanionBlocksForHarParityBlock(
              path, codec.parityLength, block, inode);
        case TEMP_PARITY:
          NameWithINode ni = getSourceFile(path, codec.tmpParityDirectory);
          return getCompanionBlocksForParityBlock(
              ni.name,
              path, codec.parityLength, codec.stripeLength, block,
              codec.isDirRaid, ni.inode, inode);
        case PARITY:
          ni = getSourceFile(path, codec.parityDirectory);
          return getCompanionBlocksForParityBlock(
              ni.name,
              path, codec.parityLength, codec.stripeLength, block, 
              codec.isDirRaid, ni.inode, inode);
        case SOURCE:
          return getCompanionBlocksForSourceBlock(
              path,
              info.parityName,
              codec.parityLength, codec.stripeLength, block,
              codec.isDirRaid, inode, info.parityInode);
      }
      return Collections.emptyList();
    }
docs: Obtain the companion blocks of the give block
  Companion blocks are defined as the blocks that can help recover each
  others by using raid decoder.
  @param path The path of the file contains the block
  @param info The info of this file
  @param block The given block
  null if it is the block which is currently being written to
  @param inode the inode of the path file
  @return the block locations of companion blocks