Skip to content
  • Yu-Chen Lin's avatar
    39a0408e
    dmg: don't skip zero chunk · 39a0408e
    Yu-Chen Lin authored
    
    
    The dmg file has many tables which describe: "start from sector XXX to
    sector XXX, the compression method is XXX and where the compressed data
    resides on".
    
    Each sector in the expanded file should be covered by a table. The table
    will describe the offset of compressed data (or raw depends on the type)
    in the dmg.
    
    For example:
    
    [-----------The expanded file------------]
    [---bzip table ---]/* zeros */[---zlib---]
        ^
        | if we want to read this sector.
    
    we will find bzip table which contains this sector, and get the
    compressed data offset, read it from dmg, uncompress it, finally write to
    expanded file.
    
    If we skip zero chunk (table), some sector cannot find the table which
    will cause search_chunk() return s->n_chunks, dmg_read_chunk() return -1
    and finally causing dmg_co_preadv() return EIO.
    
    See:
    
    [-----------The expanded file------------]
    [---bzip table ---]/* zeros */[---zlib---]
                        ^
                        | if we want to read this sector.
    
    Oops, we cannot find the table contains it...
    
    In the original implementation, we don't have zero table. When we try to
    read sector inside the zero chunk. We will get EIO, and skip reading.
    
    After this patch, we treat zero chunk the same as ignore chunk, it will
    directly write zero and avoid some sector may not find the table.
    
    After this patch:
    
    [-----------The expanded file------------]
    [---bzip table ---][--zeros--][---zlib---]
    
    Signed-off-by: default avataryuchenlin <npes87184@gmail.com>
    Reviewed-by: default avatarJulio Faracco <jcfaracco@gmail.com>
    Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    Message-id: 20190103114700.9686-4-npes87184@gmail.com
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    39a0408e
    dmg: don't skip zero chunk
    Yu-Chen Lin authored
    
    
    The dmg file has many tables which describe: "start from sector XXX to
    sector XXX, the compression method is XXX and where the compressed data
    resides on".
    
    Each sector in the expanded file should be covered by a table. The table
    will describe the offset of compressed data (or raw depends on the type)
    in the dmg.
    
    For example:
    
    [-----------The expanded file------------]
    [---bzip table ---]/* zeros */[---zlib---]
        ^
        | if we want to read this sector.
    
    we will find bzip table which contains this sector, and get the
    compressed data offset, read it from dmg, uncompress it, finally write to
    expanded file.
    
    If we skip zero chunk (table), some sector cannot find the table which
    will cause search_chunk() return s->n_chunks, dmg_read_chunk() return -1
    and finally causing dmg_co_preadv() return EIO.
    
    See:
    
    [-----------The expanded file------------]
    [---bzip table ---]/* zeros */[---zlib---]
                        ^
                        | if we want to read this sector.
    
    Oops, we cannot find the table contains it...
    
    In the original implementation, we don't have zero table. When we try to
    read sector inside the zero chunk. We will get EIO, and skip reading.
    
    After this patch, we treat zero chunk the same as ignore chunk, it will
    directly write zero and avoid some sector may not find the table.
    
    After this patch:
    
    [-----------The expanded file------------]
    [---bzip table ---][--zeros--][---zlib---]
    
    Signed-off-by: default avataryuchenlin <npes87184@gmail.com>
    Reviewed-by: default avatarJulio Faracco <jcfaracco@gmail.com>
    Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    Message-id: 20190103114700.9686-4-npes87184@gmail.com
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
Loading