Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 28 Mar 2000 10:09:44 -0600 (CST)
From:      dnelson@emsphone.com
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   bin/17640: lseek+read  -> pread
Message-ID:  <200003281609.KAA93423@dan.emsphone.com>

next in thread | raw e-mail | index | archive | help

>Number:         17640
>Category:       bin
>Synopsis:       lseek+read  -> pread
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Tue Mar 28 08:10:00 PST 2000
>Closed-Date:
>Last-Modified:
>Originator:     Dan Nelson
>Release:        FreeBSD 5.0-CURRENT i386
>Organization:
Executive Marketing Services, Inc.
>Environment:

FreeBSD dan.emsphone.com 5.0-CURRENT FreeBSD 5.0-CURRENT #52: Mon Mar 20 10:01:54 CST 2000     dan@dan.emsphone.com:/usr/src/sys/compile/DANSMP  i386

, but applies to 4.0 and 3.* as well.

	

>Description:

Simple replacement of an lseek()/read() combo with a single pread(). 
Halves the number of syscalls.

	

>How-To-Repeat:

	

>Fix:

I've been running the following code for a couple months, and both dump
and fsck work fine.


Index: sbin/dump/traverse.c
===================================================================
RCS file: /home/ncvs/src/sbin/dump/traverse.c,v
retrieving revision 1.10
diff -b -u -r1.10 traverse.c
--- sbin/dump/traverse.c	1999/08/28 00:12:39	1.10
+++ sbin/dump/traverse.c	2000/03/24 05:33:51
@@ -556,10 +556,7 @@
 	extern int errno;
 
 loop:
-	if (lseek(diskfd, ((off_t)blkno << dev_bshift), 0) !=
-						((off_t)blkno << dev_bshift))
-		msg("bread: lseek fails\n");
-	if ((cnt = read(diskfd, buf, size)) == size)
+	if ((cnt = pread(diskfd, buf, size, (off_t)blkno << dev_bshift)) == size)
 		return;
 	if (blkno + (size / dev_bsize) > fsbtodb(sblock, sblock->fs_size)) {
 		/*
Index: sbin/fsck/utilities.c
===================================================================
RCS file: /home/ncvs/src/sbin/fsck/utilities.c,v
retrieving revision 1.11
diff -b -u -r1.11 utilities.c
--- sbin/fsck/utilities.c	1999/08/28 00:12:49	1.11
+++ sbin/fsck/utilities.c	1999/11/25 05:54:06
@@ -327,11 +327,9 @@
 
 	offset = blk;
 	offset *= dev_bsize;
-	if (lseek(fd, offset, 0) < 0)
-		rwerror("SEEK", blk);
-	else if (read(fd, buf, (int)size) == size)
+	if (pread(fd, buf, (int)size, offset) == size)
 		return (0);
-	rwerror("READ", blk);
+	rwerror("PREAD", blk);
 	if (lseek(fd, offset, 0) < 0)
 		rwerror("SEEK", blk);
 	errs = 0;

>Release-Note:
>Audit-Trail:
>Unformatted:
 Dan Nelson


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200003281609.KAA93423>