From patchwork Mon Feb 14 05:04:17 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joseph Jezak X-Patchwork-Id: 83040 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from bilbo.ozlabs.org (localhost [127.0.0.1]) by ozlabs.org (Postfix) with ESMTP id AC732B7180 for ; Mon, 14 Feb 2011 16:16:50 +1100 (EST) X-Greylist: delayed 494 seconds by postgrey-1.32 at bilbo; Mon, 14 Feb 2011 16:16:48 EST Received: from qmta09.westchester.pa.mail.comcast.net (qmta09.westchester.pa.mail.comcast.net [76.96.62.96]) by ozlabs.org (Postfix) with ESMTP id 8B26FB716A for ; Mon, 14 Feb 2011 16:16:48 +1100 (EST) Received: from omta18.westchester.pa.mail.comcast.net ([76.96.62.90]) by qmta09.westchester.pa.mail.comcast.net with comcast id 7gv91g0011wpRvQ59h8XWH; Mon, 14 Feb 2011 05:08:31 +0000 Received: from [192.168.1.100] ([24.3.224.125]) by omta18.westchester.pa.mail.comcast.net with comcast id 7h8W1g00W2ix0EG3eh8XLM; Mon, 14 Feb 2011 05:08:31 +0000 Message-ID: <4D58B7D1.7000800@gentoo.org> Date: Mon, 14 Feb 2011 00:04:17 -0500 From: Joseph Jezak User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101227 Lightning/1.0b3pre Thunderbird/3.1.7 MIME-Version: 1.0 To: yaboot-devel@lists.ozlabs.org Subject: Re: Rewrite of ofpath References: <4C922058.3080406@gentoo.org> <4C923A51.4080903@redhat.com> In-Reply-To: <4C923A51.4080903@redhat.com> X-BeenThere: yaboot-devel@lists.ozlabs.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Technical and development discussion regarding yaboot List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: yaboot-devel-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Errors-To: yaboot-devel-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org On 09/16/10 11:40, Roman Rakus wrote: > At first, thanks for the interest and for "patch". > I will take a deeper look later, so now just only a few notes: > Better will be to send git commits (by `git format-patch' and `git > send-email') > Better is to use `printf' instead of `echo' > From the code: > > ### Set this to 1 to turn on debugging messages > DEBUG=0 > > > I will not set DEBUG variable here. So we can use `DEBUG=1 ofpath ...' > call. > > Anyway, it needs deeper investigation. > > RR > _______________________________________________ > Yaboot-devel mailing list > Yaboot-devel@lists.ozlabs.org > https://lists.ozlabs.org/listinfo/yaboot-devel > Since I haven't heard back, I adapted my code to the original ofpath after some concern from the Debian project that I had gotten rid of legacy code. Here is the patch that implements this against the current git head. From 3e2f4c19c2c0d5af785ab904395ff58d9ba7104e Mon Sep 17 00:00:00 2001 From: Joseph Jezak josejx@gentoo.org Date: Sun, 13 Feb 2011 23:38:36 -0500 Subject: Update ofpath for libata devices. Signed-off-by: Joseph Jezak josejx@gentoo.org --- ybin/ofpath | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 95 insertions(+), 8 deletions(-) diff --git a/ybin/ofpath b/ybin/ofpath index aff5583..2e0fad8 100755 --- a/ybin/ofpath +++ b/ybin/ofpath @@ -329,10 +329,86 @@ scsi_ofpath() ;; *) echo 1>&2 "$PRG: Driver: $SCSI_DRIVER is not supported" - return 1 + echo "" ;; esac - return 0 + echo "" +} + +### If scsi_ofpath can't find anything, try a new method +scsi_sys_ofpath() { + ### Get the sysfs mount point + local SYS="$(m=`grep '.* .* sysfs ' /proc/mounts | head -n 1` ; echo `d=${m#* };echo ${d%% *}`)"; + if [ -z "$SYS" -o ! -d "$SYS" ] ; then + echo 1>&2 "$PRG: Unable to determine sysfs mountpoint"; + echo ""; + return; + fi + + ### Get the device name and dereference it to support devices like /dev/cdrom1 + local REAL_DEV=$(readlink -f "$DEVICE") + REAL_DEV=$(basename "$DEVICE") + if [ "$DEVICE" == "" ] || [ ! -e "/dev/$DEVICE" ]; then + echo 1>&2 "ofpath: Invalid device: /dev/$DEVICE"; + echo ""; + return; + fi + + ### Get the partition if it exists + case ${REAL_DEV} in + sd*) PARTITION="${DEVICE#sd?}" ;; + ### No partition for sr/sg devices + sr*) PARTITION="${DEVICE#sr?}" ;; + sg*) PARTITION="${DEVICE#sg?}" ;; + *) echo 1>&2 "ofpath: Unknown device string."; return "";; + esac + + ### Get the disk device name + DISK_NAME="${DEVICE%%${PARTITION}}"; + + ### Find the devspec for the controller + DEVSPEC=$(cd -P "$SYS/block/${DISK_NAME}/device" && pwd) + if [ "${DEVSPEC}" == "" ]; then + echo 1>&2 "ofpath: Unable to determine device path!"; + echo ""; + return; + fi + + ### Get the OF Path of the controller + CONTROLLER_PATH=$(cat "${DEVSPEC}/../../../devspec"); + if [ "$CONTROLLER_PATH" == "" ]; then + echo 1>&2 "ofpath: Unable to find the controller path!"; + echo ""; + return; + fi + + ### Generate the disk number and partition info + DISK_NO="$(cd ${DEVSPEC}/../; pwd)"; + DISK_NO="${DISK_NO##*:}"; + DISK_NO="disk@${DISK_NO}:"; + + ### We need to get the controller port path if it has one + if [ ! -d "/proc/device-tree/$CONTROLLER_PATH/disk" ] && [ ! -d "/proc/device-tree/$CONTROLLER_PATH/$DISK_NO" ]; then + ### FIXME Does every scsi device uses the host nomenclature? + PORT="$(cd ${DEVSPEC}/../../; pwd)"; + PORT="${PORT##*host}"; + CTL_PORT="${CONTROLLER_PATH##*/}"; + CTL_PORT="${CTL_PORT%%-root*}"; + PORT="$CTL_PORT@$PORT"; + fi + + ### Add the partition information if required + if [ ! $PARTITION == "" ]; then + DISK_NO="${DISK_NO}${PARTITION}"; + fi + + ### Build the OF Path and print it out + if [ "$PORT" == "" ]; then + echo "$CONTROLLER_PATH/$DISK_NO"; + else + echo "$CONTROLLER_PATH/$PORT/$DISK_NO"; + fi + return; } ide_ofpath() @@ -451,14 +527,25 @@ ide_ofpath() ## sd* scsi disks , hd* ide disks. newworld() { + local SCSI_PATH="" case "$DEVNODE" in - sd*) - ## use common scsiinfo function to get info we need. - scsiinfo || return 1 + sd*|sr*|sg*) + ### Run the new sysfs version, this version will get libata results + SCSI_PATH=`scsi_sys_ofpath` + + ### Check if we got a result from the last call and if not, run the old code + if [ "${SCSI_PATH}" == "" ]; then + ## use common scsiinfo function to get info we need. + scsiinfo || return 1 + + ## now we have the data for /@$DEVID:$PARTITION + ## find the actual OF path. + SCSI_PATH=`scsi_ofpath` + fi + + ### Echo the found path + echo ${SCSI_PATH} - ## now we have the data for /@$DEVID:$PARTITION - ## find the actual OF path. - scsi_ofpath || return 1 ;; hd*) ide_ofpath || return 1