From dan@dan.emsphone.com  Wed Jul  9 13:13:02 2003
Return-Path: <dan@dan.emsphone.com>
Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125])
	by hub.freebsd.org (Postfix) with ESMTP id 1410037B401
	for <FreeBSD-gnats-submit@freebsd.org>; Wed,  9 Jul 2003 13:13:02 -0700 (PDT)
Received: from dan.emsphone.com (dan.emsphone.com [199.67.51.101])
	by mx1.FreeBSD.org (Postfix) with ESMTP id 7A47943F85
	for <FreeBSD-gnats-submit@freebsd.org>; Wed,  9 Jul 2003 13:13:01 -0700 (PDT)
	(envelope-from dan@dan.emsphone.com)
Received: (from dan@localhost)
	by dan.emsphone.com (8.12.9/8.12.9) id h69KD0ar094995;
	Wed, 9 Jul 2003 15:13:00 -0500 (CDT)
	(envelope-from dan)
Message-Id: <200307092013.h69KD0ar094995@dan.emsphone.com>
Date: Wed, 9 Jul 2003 15:13:00 -0500 (CDT)
From: Dan Nelson <dnelson@allantgroup.com>
To: FreeBSD-gnats-submit@freebsd.org
Cc:
Subject: pread/pwrite patches for libc db functions
X-Send-Pr-Version: 3.113
X-GNATS-Notify:

>Number:         54276
>Category:       bin
>Synopsis:       pread/pwrite patches for libc db functions
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Wed Jul 09 13:20:18 PDT 2003
>Closed-Date:    Mon Jan 19 16:40:53 PST 2004
>Last-Modified:  Mon Jan 19 16:40:53 PST 2004
>Originator:     Dan Nelson
>Release:        FreeBSD 5.1-CURRENT i386
>Organization:
The Allant Group
>Environment:
System: FreeBSD dan.emsphone.com 5.1-CURRENT FreeBSD 5.1-CURRENT #276: Fri Jun 27 16:21:53 CDT 2003 dan@dan.emsphone.com:/usr/src/sys/i386/compile/DANSMP i386


	
>Description:

The following patch replaces an lseek+read/write combo with a single
pread/pwrite, cutting the number of syscalls by 1/2.

All db I/O gets funnelled though mpool_get and mpool_write so these are
the only functions that need changing.  I've been running with this
patch for 3 years and had forgotten about it :)  Tested against >100mb
btree indexes.

	
>How-To-Repeat:
	
>Fix:

	


Index: mpool.c
===================================================================
RCS file: /home/ncvs/src/lib/libc/db/mpool/mpool.c,v
retrieving revision 1.10
diff -u -p -r1.10 mpool.c
--- mpool.c	22 Mar 2002 21:52:01 -0000	1.10
+++ mpool.c	29 Mar 2002 18:42:00 -0000
@@ -207,9 +207,7 @@ mpool_get(mp, pgno, flags)
 	++mp->pageread;
 #endif
 	off = mp->pagesize * pgno;
-	if (lseek(mp->fd, off, SEEK_SET) != off)
-		return (NULL);
-	if ((nr = _read(mp->fd, bp->page, mp->pagesize)) != mp->pagesize) {
+	if ((nr = pread(mp->fd, bp->page, mp->pagesize, off)) != mp->pagesize) {
 		if (nr >= 0)
 			errno = EFTYPE;
 		return (NULL);
@@ -381,9 +379,7 @@ mpool_write(mp, bp)
 		(mp->pgout)(mp->pgcookie, bp->pgno, bp->page);
 
 	off = mp->pagesize * bp->pgno;
-	if (lseek(mp->fd, off, SEEK_SET) != off)
-		return (RET_ERROR);
-	if (_write(mp->fd, bp->page, mp->pagesize) != mp->pagesize)
+	if (pwrite(mp->fd, bp->page, mp->pagesize, off) != mp->pagesize)
 		return (RET_ERROR);
 
 	bp->flags &= ~MPOOL_DIRTY;

>Release-Note:
>Audit-Trail:
State-Changed-From-To: open->closed 
State-Changed-By: das 
State-Changed-When: Mon Jan 19 16:40:40 PST 2004 
State-Changed-Why:  
Committed, thanks! 

http://www.freebsd.org/cgi/query-pr.cgi?pr=54276 
>Unformatted:
