| From: D. Hugh Redelmeier <[EMAIL PROTECTED]>
| Date: Thu, 12 May 2005 01:26:13 -0400 (EDT)

| The 2.6 kernel's CD/DVD driver has the unfortunate propensity to read
| ahead past the end of a CD/DVD.  It then reports an error, even if the
| actual read request was completely legitimate.  See, for example,
|   <https://www.redhat.com/archives/fedora-list/2005-March/msg02774.html>
| 
| The conventional work-around is to always pad when writing a CD/DVD.
| Ugly, but true.  (I agree that this isn't the correct fix, but the
| problem has not been fixed in a year, so it isn't going away soon.)
| See, for example,
|   <https://www.redhat.com/archives/fedora-list/2005-March/msg03201.html>

The variant of cdrecord shipped in Fedora Core 3 is calls itself
Cdrecord-Clone 2.01-dvd.  This burns coaster DVDs for me, but it does
have a nice --padsize option.
        https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=161021

growisof does not have a --padsize option :-(

Since copying a .iso takes a lot of time and space, I wrote a script
to alter a .iso in place.  It adds or removes padding in the amount I
think needed: 128k byes.  With a padded .iso, I don't need the
--padsize option.

================ isopad script ================
#!/bin/sh

# isopad [+] [-] isofile...
#
# The Linux IDE CD driver in 2.6 tries to read ahead, even past the end of the
# CD or DVD.  Even when the program issuing the original read request was only
# trying to read legitimate parts of the disc (albeit near the end).
# The result is spurious I/O errors and read failures.
# It does not seem that this driver bug is going to be fixed soon.
#
# This program is intended to facilitate a workaround.  It can pad (or unpad)
# a .iso file so that, when it is burned, the resulting disc will allow
# reads past the end of the content to succeed.
#
# "+" means pad the following .iso files.
# "-" means remove all padding.
# neither means test file and iso sizes.
#
# To see how much readahead is enabled on a drive: hdparm -a /dev/hdc
#
# Why do the padding in place, rather than on a copy of the file?
# .iso files are usually quite large so copying takes a lot of time and space.
#
# Copyright 2005 D. Hugh Redelmeier
# License: GPL
# Version: Sat Jun 18 02:31:48 EDT 2005

# stop at the least sign of trouble
set -u -e

# op is "", "-", or "+": operation to be performed
op=""

for fn
do
        case "$fn"
        in
        "-h"|"--help")
                echo "Usage: $0 [-|+|] isofile..."
                ;;
        "+"|"-")
                op="$fn"
                ;;
        *)
                isosize -x "$fn"
                isz=`isosize "$fn"`
                fsz=`stat --format='%s' "$fn"`

                # conventional block size for CDs
                bs=2048

                # my guess at a sufficient amount of padding (in blocks)
                pb=64

                if [ $fsz -lt $isz ]
                then
                        echo "$fn is shorter ($fsz) than it should be ($isz)" 
>&2
                        exit 3
                elif [ ` expr $fsz % $bs ` -ne 0 ]
                then
                        echo "$fn file size ($fsz) is not a multiple of $bs" >&2
                        exit 4
                elif [ ` expr $isz % $bs ` -ne 0 ]
                then
                        echo "$fn isosize ($isz) is not a multiple of $bs" >&2
                        exit 5
                else
                        case "$op" in
                        "")
                                if [ $fsz -eq $isz ]
                                then
                                        echo "$fn: isosize == file size == $fsz"
                                else
                                        echo "$fn: isosize $isz; file size $fsz"
                                fi
                                ;;
                        "+")
                                echo "$fn: padding with $pb blocks of $bs zero 
bytes"
                                dd if=/dev/zero bs=$bs count=$pb >>"$fn"
                                ;;
                        "-")
                                if [ $fsz -eq $isz ]
                                then
                                        echo "$fn: already $fsz bytes"
                                else
                                        echo "$fn: truncating from $fsz to $isz 
bytes"
                                        dd if=/dev/null of="$fn" seek=$isz bs=1
                                fi
                                ;;
                        esac
                fi
                ;;
        esac
done
================ end ================


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to