code: func (f *File) ReadLink() (string, error) {
  	if f.ino.Mode&ifmt != iflnk {
  		return "", fmt.Errorf("not a symbolic link")
  	}
  
  	size := f.ino.Size
  
  	if f.ino.Nblock != 0 {
  		if size > uint32(f.fs.BlockSize) {
  			return "", fmt.Errorf("invalid symlink size")
  		}
  		// Symlink fits in one block.
  		b, err := f.dblock(0)
  		if err != nil {
  			return "", err
  		}
  		buf, err := f.fs.readData(b, 0, nil)
  		if err != nil {
  			return "", err
  		}
  		return string(buf[:size]), nil
  	}
  
  	if size > 4*numBlocks {
  		return "", fmt.Errorf("invalid symlink size")
  	}
  	var buf [4 * numBlocks]byte
  	for i := 0; i < numBlocks; i++ {
  		binary.LittleEndian.PutUint32(buf[4*i:], f.ino.Block[i])
  	}
  	return string(buf[:size]), nil
  }
docs: // ReadLink returns the symbolic link content of f.