1b973f2b91343554586da3c952c63c2369acd879whr/*
2b973f2b91343554586da3c952c63c2369acd879whr * Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
345a8ba0302fa0632410b2f100f92701651dd7a0fvapier *
4b973f2b91343554586da3c952c63c2369acd879whr * This program is free software; you can redistribute it and/or modify it
5b973f2b91343554586da3c952c63c2369acd879whr * under the terms of version 2 of the GNU General Public License as
6b973f2b91343554586da3c952c63c2369acd879whr * published by the Free Software Foundation.
745a8ba0302fa0632410b2f100f92701651dd7a0fvapier *
8b973f2b91343554586da3c952c63c2369acd879whr * This program is distributed in the hope that it would be useful, but
9b973f2b91343554586da3c952c63c2369acd879whr * WITHOUT ANY WARRANTY; without even the implied warranty of
10b973f2b91343554586da3c952c63c2369acd879whr * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1145a8ba0302fa0632410b2f100f92701651dd7a0fvapier *
12b973f2b91343554586da3c952c63c2369acd879whr * Further, this software is distributed without any warranty that it is
13b973f2b91343554586da3c952c63c2369acd879whr * free of the rightful claim of any third person regarding infringement
14b973f2b91343554586da3c952c63c2369acd879whr * or the like.  Any license provided herein, whether implied or
15b973f2b91343554586da3c952c63c2369acd879whr * otherwise, applies only to this software file.  Patent licenses, if
16b973f2b91343554586da3c952c63c2369acd879whr * any, provided herein do not apply to combinations of this program with
17b973f2b91343554586da3c952c63c2369acd879whr * other software, or any other product whatsoever.
1845a8ba0302fa0632410b2f100f92701651dd7a0fvapier *
19b973f2b91343554586da3c952c63c2369acd879whr * You should have received a copy of the GNU General Public License along
20fed9641096e27f79a0f2d9adfe9839dd8d11dc0fWanlong Gao * with this program; if not, write the Free Software Foundation, Inc.,
21fed9641096e27f79a0f2d9adfe9839dd8d11dc0fWanlong Gao * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
2245a8ba0302fa0632410b2f100f92701651dd7a0fvapier *
23b973f2b91343554586da3c952c63c2369acd879whr * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
24b973f2b91343554586da3c952c63c2369acd879whr * Mountain View, CA  94043, or:
2545a8ba0302fa0632410b2f100f92701651dd7a0fvapier *
2645a8ba0302fa0632410b2f100f92701651dd7a0fvapier * http://www.sgi.com
2745a8ba0302fa0632410b2f100f92701651dd7a0fvapier *
2845a8ba0302fa0632410b2f100f92701651dd7a0fvapier * For further information regarding this notice, see:
2945a8ba0302fa0632410b2f100f92701651dd7a0fvapier *
30b973f2b91343554586da3c952c63c2369acd879whr * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
31b973f2b91343554586da3c952c63c2369acd879whr */
32b973f2b91343554586da3c952c63c2369acd879whr/*
33b973f2b91343554586da3c952c63c2369acd879whr *
34b973f2b91343554586da3c952c63c2369acd879whr * Lib i/o
35b973f2b91343554586da3c952c63c2369acd879whr *
36b973f2b91343554586da3c952c63c2369acd879whr * This file contains several functions to doing reads and writes.
37b973f2b91343554586da3c952c63c2369acd879whr * It was written so that a single function could be called in a test
38b973f2b91343554586da3c952c63c2369acd879whr * program and only a io type field value would have to change to
39b973f2b91343554586da3c952c63c2369acd879whr * do different types of io.  There is even a couple of functions that
40b973f2b91343554586da3c952c63c2369acd879whr * will allow you to parse a string to determine the iotype.
41b973f2b91343554586da3c952c63c2369acd879whr *
42b973f2b91343554586da3c952c63c2369acd879whr * This file contains functions for writing/reading to/from open files
43b973f2b91343554586da3c952c63c2369acd879whr * Prototypes:
44b973f2b91343554586da3c952c63c2369acd879whr *
45b973f2b91343554586da3c952c63c2369acd879whr * Functions declared in this module - see individual function code for
46b973f2b91343554586da3c952c63c2369acd879whr * usage comments:
47b973f2b91343554586da3c952c63c2369acd879whr *
48b973f2b91343554586da3c952c63c2369acd879whr *  int	 stride_bounds(int offset, int stride, int nstrides,
49b973f2b91343554586da3c952c63c2369acd879whr *		      int bytes_per_stride, int *min, int *max);
50b973f2b91343554586da3c952c63c2369acd879whr
51b973f2b91343554586da3c952c63c2369acd879whr *  int  lio_write_buffer(int fd, int method, char *buffer, int size,
52b973f2b91343554586da3c952c63c2369acd879whr *						char **errmsg, long wrd);
53b973f2b91343554586da3c952c63c2369acd879whr *  int  lio_read_buffer(int fd, int method, char *buffer, int size,
54b973f2b91343554586da3c952c63c2369acd879whr *						char **errmsg, long wrd);
55b973f2b91343554586da3c952c63c2369acd879whr *
56b973f2b91343554586da3c952c63c2369acd879whr *  #ifdef CRAY
57b973f2b91343554586da3c952c63c2369acd879whr *  int  lio_wait4asyncio(int method, int fd, struct iosw **statptr)
58b973f2b91343554586da3c952c63c2369acd879whr *  int  lio_check_asyncio(char *io_type, int size, struct iosw *status)
59b973f2b91343554586da3c952c63c2369acd879whr *  #endif
60b973f2b91343554586da3c952c63c2369acd879whr *  #ifdef sgi
61b973f2b91343554586da3c952c63c2369acd879whr *  int  lio_wait4asyncio(int method, int fd, aiocb_t *aiocbp)
62b973f2b91343554586da3c952c63c2369acd879whr *  int  lio_check_asyncio(char *io_type, int size, aiocb_t *aiocbp, int method)
63b973f2b91343554586da3c952c63c2369acd879whr *  #endif
64b973f2b91343554586da3c952c63c2369acd879whr *
65b973f2b91343554586da3c952c63c2369acd879whr *  int  lio_parse_io_arg1(char *string)
66b973f2b91343554586da3c952c63c2369acd879whr *  void lio_help1(char *prefix);
67b973f2b91343554586da3c952c63c2369acd879whr *
68b973f2b91343554586da3c952c63c2369acd879whr *  int  lio_parse_io_arg2(char *string, char **badtoken)
69b973f2b91343554586da3c952c63c2369acd879whr *  void lio_help2(char *prefix);
70b973f2b91343554586da3c952c63c2369acd879whr *
71b973f2b91343554586da3c952c63c2369acd879whr *  int  lio_set_debug(int level);
72b973f2b91343554586da3c952c63c2369acd879whr *
73b973f2b91343554586da3c952c63c2369acd879whr *  char Lio_SysCall[];
74b973f2b91343554586da3c952c63c2369acd879whr *  struct lio_info_type Lio_info1[];
75b973f2b91343554586da3c952c63c2369acd879whr *  struct lio_info_type Lio_info2[];
76b973f2b91343554586da3c952c63c2369acd879whr *
77b973f2b91343554586da3c952c63c2369acd879whr *  Author : Richard Logan
78b973f2b91343554586da3c952c63c2369acd879whr *
79b973f2b91343554586da3c952c63c2369acd879whr */
80b973f2b91343554586da3c952c63c2369acd879whr
81ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#ifdef __linux__
829ef7f2dd2951a5fb970f45ab6cd465c0152f2ed6Garrett Cooper#ifndef _GNU_SOURCE
83ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#define _GNU_SOURCE
849ef7f2dd2951a5fb970f45ab6cd465c0152f2ed6Garrett Cooper#endif
85ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#define _LARGEFILE64_SOURCE
86ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#endif
8728606c1b9a3e7c910f83c0a1dd7642f53fbc6944Mike Frysinger#include "config.h"
88b973f2b91343554586da3c952c63c2369acd879whr#include <stdio.h>
89b973f2b91343554586da3c952c63c2369acd879whr#include <ctype.h>
90b973f2b91343554586da3c952c63c2369acd879whr#include <fcntl.h>
91b973f2b91343554586da3c952c63c2369acd879whr#include <unistd.h>
92b973f2b91343554586da3c952c63c2369acd879whr#include <sys/types.h>
93b973f2b91343554586da3c952c63c2369acd879whr#include <sys/stat.h>
9445a8ba0302fa0632410b2f100f92701651dd7a0fvapier#include <sys/time.h>
95b973f2b91343554586da3c952c63c2369acd879whr#include <sys/param.h>
96b973f2b91343554586da3c952c63c2369acd879whr#include <errno.h>
97b973f2b91343554586da3c952c63c2369acd879whr#include <sys/types.h>
98b973f2b91343554586da3c952c63c2369acd879whr#include <sys/file.h>
99b973f2b91343554586da3c952c63c2369acd879whr#include <signal.h>
10094d177a9bc3e20c775519131e082c94f684f65eesubrata_modak#include <stdint.h>
101b973f2b91343554586da3c952c63c2369acd879whr#ifdef CRAY
102b973f2b91343554586da3c952c63c2369acd879whr#include <sys/secparm.h>
103b973f2b91343554586da3c952c63c2369acd879whr#include <sys/iosw.h>
104b973f2b91343554586da3c952c63c2369acd879whr#include <sys/listio.h>
105b973f2b91343554586da3c952c63c2369acd879whr#else
106b973f2b91343554586da3c952c63c2369acd879whr/* for linux or sgi */
107354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#include <sys/uio.h>		/* readv(2)/writev(2) */
108354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#include <string.h>		/* bzero */
109b973f2b91343554586da3c952c63c2369acd879whr#endif
110f7298c78ccec20dbf2f96a83265c38811655241amridge#if defined(__linux__) || defined(__sun) || defined(__hpux) || defined(_AIX)
111906676d7d473a55321f5095193a6e0912a1e2d90robbiew#if !defined(UCLINUX) && !defined(__UCLIBC__)
112b973f2b91343554586da3c952c63c2369acd879whr#include <aio.h>
113b973f2b91343554586da3c952c63c2369acd879whr#endif
114d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
115354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#include <stdlib.h>		/* atoi, abs */
116b973f2b91343554586da3c952c63c2369acd879whr
117b973f2b91343554586da3c952c63c2369acd879whr#include "tlibio.h"		/* defines LIO* marcos */
1189ef7f2dd2951a5fb970f45ab6cd465c0152f2ed6Garrett Cooper#include "random_range.h"
119b973f2b91343554586da3c952c63c2369acd879whr
120b973f2b91343554586da3c952c63c2369acd879whr#ifndef PATH_MAX
121b973f2b91343554586da3c952c63c2369acd879whr#define PATH_MAX	MAXPATHLEN
122b973f2b91343554586da3c952c63c2369acd879whr#endif
123b973f2b91343554586da3c952c63c2369acd879whr
124354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#if 0				/* disabled until it's needed -- roehrich 6/11/97 */
125354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#define BUG1_workaround	1	/* Work around a condition where aio_return gives
126354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				 * a value of zero but there is no errno followup
127354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				 * and the read/write operation actually did its
128354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				 * job.   spr/pv 705244
129354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				 */
130b973f2b91343554586da3c952c63c2369acd879whr#endif
131b973f2b91343554586da3c952c63c2369acd879whr
132b973f2b91343554586da3c952c63c2369acd879whr
133b973f2b91343554586da3c952c63c2369acd879whr/*
134b973f2b91343554586da3c952c63c2369acd879whr * Define the structure as used in lio_parse_arg1 and lio_help1
135b973f2b91343554586da3c952c63c2369acd879whr */
136354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostruct lio_info_type Lio_info1[] = {
137354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"s", LIO_IO_SYNC, "sync i/o"},
138354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"p", LIO_IO_ASYNC | LIO_WAIT_SIGACTIVE,
139354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 "async i/o using a loop to wait for a signal"},
140354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"b", LIO_IO_ASYNC | LIO_WAIT_SIGPAUSE, "async i/o using pause"},
141354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"a", LIO_IO_ASYNC | LIO_WAIT_RECALL,
142354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 "async i/o using recall/aio_suspend"},
14326e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
144354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"r",
145354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 LIO_RANDOM | LIO_IO_TYPES | LIO_WAIT_TYPES,
146354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 "random sync i/o types and wait methods"},
147354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"R",
148354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 LIO_RANDOM | LIO_IO_ATYPES | LIO_WAIT_ATYPES,
149354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 "random i/o types and wait methods"},
150b973f2b91343554586da3c952c63c2369acd879whr#else
151354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"r",
152354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 LIO_RANDOM | LIO_IO_TYPES | LIO_WAIT_TYPES,
153354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 "random i/o types and wait methods"},
154354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"R",
155354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 LIO_RANDOM | LIO_IO_TYPES | LIO_WAIT_TYPES,
156354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 "random i/o types and wait methods"},
157354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif
158354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"l", LIO_IO_SLISTIO | LIO_WAIT_RECALL, "single stride sync listio"},
159354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"L", LIO_IO_ALISTIO | LIO_WAIT_RECALL,
160354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 "single stride async listio using recall"},
161354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"X", LIO_IO_ALISTIO | LIO_WAIT_SIGPAUSE,
162354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 "single stride async listio using pause"},
163354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"v", LIO_IO_SYNCV, "single buffer sync readv/writev"},
164354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"P", LIO_IO_SYNCP, "sync pread/pwrite"},
165b973f2b91343554586da3c952c63c2369acd879whr};
166b973f2b91343554586da3c952c63c2369acd879whr
167b973f2b91343554586da3c952c63c2369acd879whr/*
168b973f2b91343554586da3c952c63c2369acd879whr * Define the structure used by lio_parse_arg2 and lio_help2
169b973f2b91343554586da3c952c63c2369acd879whr */
170354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostruct lio_info_type Lio_info2[] = {
171354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"sync", LIO_IO_SYNC, "sync i/o (read/write)"},
172354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"async", LIO_IO_ASYNC, "async i/o (reada/writea/aio_read/aio_write)"},
173354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"slistio", LIO_IO_SLISTIO, "single stride sync listio"},
174354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"alistio", LIO_IO_ALISTIO, "single stride async listio"},
175354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"syncv", LIO_IO_SYNCV, "single buffer sync readv/writev"},
176354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"syncp", LIO_IO_SYNCP, "pread/pwrite"},
177354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"active", LIO_WAIT_ACTIVE, "spin on status/control values"},
178354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"recall", LIO_WAIT_RECALL,
179354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 "use recall(2)/aio_suspend(3) to wait for i/o to complete"},
180354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"sigactive", LIO_WAIT_SIGACTIVE, "spin waiting for signal"},
181354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"sigpause", LIO_WAIT_SIGPAUSE, "call pause(2) to wait for signal"},
182b973f2b91343554586da3c952c63c2369acd879whr/* nowait is a touchy thing, it's an accident that this implementation worked at all.  6/27/97 roehrich */
183b973f2b91343554586da3c952c63c2369acd879whr/*    { "nowait",    LIO_WAIT_NONE,	"do not wait for async io to complete" },*/
184354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"random", LIO_RANDOM, "set random bit"},
185354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"randomall",
186354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 LIO_RANDOM | LIO_IO_TYPES | LIO_WAIT_TYPES,
187354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 "all random i/o types and wait methods (except nowait)"},
188b973f2b91343554586da3c952c63c2369acd879whr};
189b973f2b91343554586da3c952c63c2369acd879whr
190b973f2b91343554586da3c952c63c2369acd879whrchar Lio_SysCall[PATH_MAX];	/* string containing last i/o system call */
191b973f2b91343554586da3c952c63c2369acd879whr
192b973f2b91343554586da3c952c63c2369acd879whrstatic volatile int Received_signal = 0;	/* number of signals received */
193b973f2b91343554586da3c952c63c2369acd879whrstatic volatile int Rec_signal;
19426e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
195b973f2b91343554586da3c952c63c2369acd879whrstatic volatile int Received_callback = 0;	/* number of callbacks received */
196b973f2b91343554586da3c952c63c2369acd879whrstatic volatile int Rec_callback;
197b973f2b91343554586da3c952c63c2369acd879whr#endif
198b973f2b91343554586da3c952c63c2369acd879whrstatic char Errormsg[500];
199b973f2b91343554586da3c952c63c2369acd879whrstatic int Debug_level = 0;
200b973f2b91343554586da3c952c63c2369acd879whr
201b973f2b91343554586da3c952c63c2369acd879whr/***********************************************************************
202b973f2b91343554586da3c952c63c2369acd879whr * stride_bounds()
203b973f2b91343554586da3c952c63c2369acd879whr *
204b973f2b91343554586da3c952c63c2369acd879whr * Determine the bounds of a strided request, normalized to offset.  Returns
205b973f2b91343554586da3c952c63c2369acd879whr * the number of bytes needed to satisfy the request, and optionally sets
20645a8ba0302fa0632410b2f100f92701651dd7a0fvapier * *min and *max to the mininum and maximum bytes referenced, normalized
207b973f2b91343554586da3c952c63c2369acd879whr * around offset.
208b973f2b91343554586da3c952c63c2369acd879whr *
209b973f2b91343554586da3c952c63c2369acd879whr * Returns -1 on error - the only possible error conditions are illegal values
210b973f2b91343554586da3c952c63c2369acd879whr * for nstrides and/or bytes_per_stride - both parameters must be >= 0.
211b973f2b91343554586da3c952c63c2369acd879whr *
212b973f2b91343554586da3c952c63c2369acd879whr * (maule, 11/16/95)
213b973f2b91343554586da3c952c63c2369acd879whr ***********************************************************************/
214b973f2b91343554586da3c952c63c2369acd879whr
21587aa2dc20992208fd7478d14425c1e395a57e0c4Stanislav Kholmanskikhint stride_bounds(int offset, int stride, int nstrides, int bytes_per_stride,
21687aa2dc20992208fd7478d14425c1e395a57e0c4Stanislav Kholmanskikh		int *min, int *max)
217b973f2b91343554586da3c952c63c2369acd879whr{
218354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int nbytes, min_byte, max_byte;
219b973f2b91343554586da3c952c63c2369acd879whr
220b973f2b91343554586da3c952c63c2369acd879whr	/*
221b973f2b91343554586da3c952c63c2369acd879whr	 * sanity checks ...
222b973f2b91343554586da3c952c63c2369acd879whr	 */
223b973f2b91343554586da3c952c63c2369acd879whr
224b973f2b91343554586da3c952c63c2369acd879whr	if (nstrides < 0 || bytes_per_stride < 0) {
225b973f2b91343554586da3c952c63c2369acd879whr		return -1;
226b973f2b91343554586da3c952c63c2369acd879whr	}
227b973f2b91343554586da3c952c63c2369acd879whr
228b973f2b91343554586da3c952c63c2369acd879whr	if (stride == 0) {
229b973f2b91343554586da3c952c63c2369acd879whr		stride = bytes_per_stride;
230b973f2b91343554586da3c952c63c2369acd879whr	}
231b973f2b91343554586da3c952c63c2369acd879whr
232b973f2b91343554586da3c952c63c2369acd879whr	/*
233b973f2b91343554586da3c952c63c2369acd879whr	 * Determine the # of bytes needed to satisfy the request.  This
234b973f2b91343554586da3c952c63c2369acd879whr	 * value, along with the offset argument, determines the min and max
235b973f2b91343554586da3c952c63c2369acd879whr	 * bytes referenced.
236b973f2b91343554586da3c952c63c2369acd879whr	 */
237b973f2b91343554586da3c952c63c2369acd879whr
238354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	nbytes = abs(stride) * (nstrides - 1) + bytes_per_stride;
239b973f2b91343554586da3c952c63c2369acd879whr
240b973f2b91343554586da3c952c63c2369acd879whr	if (stride < 0) {
241b973f2b91343554586da3c952c63c2369acd879whr		max_byte = offset + bytes_per_stride - 1;
242b973f2b91343554586da3c952c63c2369acd879whr		min_byte = max_byte - nbytes + 1;
243b973f2b91343554586da3c952c63c2369acd879whr	} else {
244b973f2b91343554586da3c952c63c2369acd879whr		min_byte = offset;
245b973f2b91343554586da3c952c63c2369acd879whr		max_byte = min_byte + nbytes - 1;
246b973f2b91343554586da3c952c63c2369acd879whr	}
24745a8ba0302fa0632410b2f100f92701651dd7a0fvapier
248b973f2b91343554586da3c952c63c2369acd879whr	if (min != NULL) {
249b973f2b91343554586da3c952c63c2369acd879whr		*min = min_byte;
250b973f2b91343554586da3c952c63c2369acd879whr	}
25145a8ba0302fa0632410b2f100f92701651dd7a0fvapier
252b973f2b91343554586da3c952c63c2369acd879whr	if (max != NULL) {
253b973f2b91343554586da3c952c63c2369acd879whr		*max = max_byte;
254b973f2b91343554586da3c952c63c2369acd879whr	}
255b973f2b91343554586da3c952c63c2369acd879whr
256b973f2b91343554586da3c952c63c2369acd879whr	return nbytes;
257b973f2b91343554586da3c952c63c2369acd879whr}
258b973f2b91343554586da3c952c63c2369acd879whr
259b973f2b91343554586da3c952c63c2369acd879whr/***********************************************************************
260b973f2b91343554586da3c952c63c2369acd879whr * This function will allow someone to set the debug level.
261b973f2b91343554586da3c952c63c2369acd879whr ***********************************************************************/
26287aa2dc20992208fd7478d14425c1e395a57e0c4Stanislav Kholmanskikhint lio_set_debug(int level)
263b973f2b91343554586da3c952c63c2369acd879whr{
264354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int old;
265b973f2b91343554586da3c952c63c2369acd879whr
266354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	old = Debug_level;
267354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	Debug_level = level;
268354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	return old;
269b973f2b91343554586da3c952c63c2369acd879whr}
270b973f2b91343554586da3c952c63c2369acd879whr
271b973f2b91343554586da3c952c63c2369acd879whr/***********************************************************************
272b973f2b91343554586da3c952c63c2369acd879whr * This function will parse a string and return desired io-method.
273b973f2b91343554586da3c952c63c2369acd879whr * Only the first character of the string is used.
274b973f2b91343554586da3c952c63c2369acd879whr *
275b973f2b91343554586da3c952c63c2369acd879whr * This function does not provide for meaningful option arguments,
276b973f2b91343554586da3c952c63c2369acd879whr * but it supports current growfiles/btlk interface.
277b973f2b91343554586da3c952c63c2369acd879whr *
278b973f2b91343554586da3c952c63c2369acd879whr *  (rrl 04/96)
279b973f2b91343554586da3c952c63c2369acd879whr ***********************************************************************/
280354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint lio_parse_io_arg1(char *string)
281b973f2b91343554586da3c952c63c2369acd879whr{
282354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	unsigned int ind;
283354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int found = 0;
284354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int mask = 0;
285354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
286354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/*
287354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * Determine if token is a valid string.
288354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 */
289354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	for (ind = 0; ind < sizeof(Lio_info1) / sizeof(struct lio_info_type);
290354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	     ind++) {
291354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (strcmp(string, Lio_info1[ind].token) == 0) {
292354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			mask |= Lio_info1[ind].bits;
293354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			found = 1;
294354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			break;
295354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
296354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
297354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
298354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (found == 0) {
299354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return -1;
300354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
301354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
302354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	return mask;
303b973f2b91343554586da3c952c63c2369acd879whr
304b973f2b91343554586da3c952c63c2369acd879whr}
305b973f2b91343554586da3c952c63c2369acd879whr
306b973f2b91343554586da3c952c63c2369acd879whr/***********************************************************************
307b973f2b91343554586da3c952c63c2369acd879whr * This function will print a help message describing the characters
308b973f2b91343554586da3c952c63c2369acd879whr * that can be parsed by lio_parse_io_arg1().
309b973f2b91343554586da3c952c63c2369acd879whr * They will be printed one per line.
310b973f2b91343554586da3c952c63c2369acd879whr *  (rrl 04/96)
311b973f2b91343554586da3c952c63c2369acd879whr ***********************************************************************/
312354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid lio_help1(char *prefix)
313b973f2b91343554586da3c952c63c2369acd879whr{
314354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	unsigned int ind;
315b973f2b91343554586da3c952c63c2369acd879whr
316354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	for (ind = 0; ind < sizeof(Lio_info1) / sizeof(struct lio_info_type);
317354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	     ind++) {
318354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		printf("%s %s : %s\n", prefix, Lio_info1[ind].token,
319354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		       Lio_info1[ind].desc);
320354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
321b973f2b91343554586da3c952c63c2369acd879whr
322354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	return;
323b973f2b91343554586da3c952c63c2369acd879whr}
324b973f2b91343554586da3c952c63c2369acd879whr
325b973f2b91343554586da3c952c63c2369acd879whr/***********************************************************************
326b973f2b91343554586da3c952c63c2369acd879whr * This function will parse a string and return the desired io-method.
327b973f2b91343554586da3c952c63c2369acd879whr * This function will take a comma separated list of io type and wait
328b973f2b91343554586da3c952c63c2369acd879whr * method tokens as defined in Lio_info2[].  If a token does not match
329b973f2b91343554586da3c952c63c2369acd879whr * any of the tokens in Lio_info2[], it will be coverted to a number.
330b973f2b91343554586da3c952c63c2369acd879whr * If it was a number, those bits are also set.
33145a8ba0302fa0632410b2f100f92701651dd7a0fvapier *
332b973f2b91343554586da3c952c63c2369acd879whr *  (rrl 04/96)
333b973f2b91343554586da3c952c63c2369acd879whr ***********************************************************************/
334354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint lio_parse_io_arg2(char *string, char **badtoken)
335b973f2b91343554586da3c952c63c2369acd879whr{
336354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	char *token = string;
337354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	char *cc = token;
338354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	char savecc;
339354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int found;
340354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int mask = 0;
341b973f2b91343554586da3c952c63c2369acd879whr
342354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int tmp;
343354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	unsigned int ind;
344354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	char chr;
345354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
346354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (token == NULL)
347354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return -1;
348354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
349354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	for (;;) {
350354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		for (; ((*cc != ',') && (*cc != '\0')); cc++) ;
351354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		savecc = *cc;
352354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		*cc = '\0';
353354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
354354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		found = 0;
355354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
356354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		/*
357354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * Determine if token is a valid string or number and if
358354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * so, add the bits to the mask.
359354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 */
360354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		for (ind = 0;
361354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		     ind < sizeof(Lio_info2) / sizeof(struct lio_info_type);
362354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		     ind++) {
363354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (strcmp(token, Lio_info2[ind].token) == 0) {
364354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				mask |= Lio_info2[ind].bits;
365354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				found = 1;
366354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				break;
367354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			}
368354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
369354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
370354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		/*
371354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * If token does not match one of the defined tokens, determine
372354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * if it is a number, if so, add the bits.
373354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 */
374354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (!found) {
375354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (sscanf(token, "%i%c", &tmp, &chr) == 1) {
376354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				mask |= tmp;
377354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				found = 1;
378354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			}
379354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
380b973f2b91343554586da3c952c63c2369acd879whr
381354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		*cc = savecc;
382b973f2b91343554586da3c952c63c2369acd879whr
383354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (!found) {	/* token is not valid */
384354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (badtoken != NULL)
385354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				*badtoken = token;
386354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return (-1);
387354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
388b973f2b91343554586da3c952c63c2369acd879whr
389354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (savecc == '\0')
390354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			break;
391b973f2b91343554586da3c952c63c2369acd879whr
392354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		token = ++cc;
393354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
394b973f2b91343554586da3c952c63c2369acd879whr
395354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	return mask;
396b973f2b91343554586da3c952c63c2369acd879whr}
397b973f2b91343554586da3c952c63c2369acd879whr
398b973f2b91343554586da3c952c63c2369acd879whr/***********************************************************************
399b973f2b91343554586da3c952c63c2369acd879whr * This function will print a help message describing the tokens
400b973f2b91343554586da3c952c63c2369acd879whr * that can be parsed by lio_parse_io_arg2().
401b973f2b91343554586da3c952c63c2369acd879whr * It will print them one per line.
402b973f2b91343554586da3c952c63c2369acd879whr *
403b973f2b91343554586da3c952c63c2369acd879whr * (rrl 04/96)
404b973f2b91343554586da3c952c63c2369acd879whr ***********************************************************************/
405354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid lio_help2(char *prefix)
406b973f2b91343554586da3c952c63c2369acd879whr{
407354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	unsigned int ind;
408b973f2b91343554586da3c952c63c2369acd879whr
409354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	for (ind = 0; ind < sizeof(Lio_info2) / sizeof(struct lio_info_type);
410354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	     ind++) {
411354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		printf("%s %s : %s\n", prefix, Lio_info2[ind].token,
412354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		       Lio_info2[ind].desc);
413354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
414354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	return;
415b973f2b91343554586da3c952c63c2369acd879whr}
416b973f2b91343554586da3c952c63c2369acd879whr
417b973f2b91343554586da3c952c63c2369acd879whr/***********************************************************************
418b973f2b91343554586da3c952c63c2369acd879whr * This is an internal signal handler.
419b973f2b91343554586da3c952c63c2369acd879whr * If the handler is called, it will increment the Received_signal
420b973f2b91343554586da3c952c63c2369acd879whr * global variable.
421b973f2b91343554586da3c952c63c2369acd879whr ***********************************************************************/
422354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic void lio_async_signal_handler(int sig)
423b973f2b91343554586da3c952c63c2369acd879whr{
424903910df985927e941076692964ab88d691c8ccbGarrett Cooper	if (Debug_level)
425354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		printf
426354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    ("DEBUG %s/%d: received signal %d, a signal caught %d times\n",
427354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		     __FILE__, __LINE__, sig, Received_signal + 1);
428b973f2b91343554586da3c952c63c2369acd879whr
429b973f2b91343554586da3c952c63c2369acd879whr	Received_signal++;
430b973f2b91343554586da3c952c63c2369acd879whr
431b973f2b91343554586da3c952c63c2369acd879whr	return;
432b973f2b91343554586da3c952c63c2369acd879whr}
433b973f2b91343554586da3c952c63c2369acd879whr
43426e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
435b973f2b91343554586da3c952c63c2369acd879whr/***********************************************************************
436b973f2b91343554586da3c952c63c2369acd879whr * This is an internal callback handler.
437b973f2b91343554586da3c952c63c2369acd879whr * If the handler is called, it will increment the Received_callback
438b973f2b91343554586da3c952c63c2369acd879whr * global variable.
439b973f2b91343554586da3c952c63c2369acd879whr ***********************************************************************/
440989bc41d384141d1cc3ca374852a7b357cf110d1Khem Rajstatic void lio_async_callback_handler(union sigval sigval)
441b973f2b91343554586da3c952c63c2369acd879whr{
442903910df985927e941076692964ab88d691c8ccbGarrett Cooper	if (Debug_level)
443354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		printf
444354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    ("DEBUG %s/%d: received callback, nbytes=%ld, a callback called %d times\n",
445354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		     __FILE__, __LINE__, (long)sigval.sival_int,
446354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		     Received_callback + 1);
447b973f2b91343554586da3c952c63c2369acd879whr
448b973f2b91343554586da3c952c63c2369acd879whr	Received_callback++;
449b973f2b91343554586da3c952c63c2369acd879whr
450b973f2b91343554586da3c952c63c2369acd879whr	return;
451b973f2b91343554586da3c952c63c2369acd879whr}
452b973f2b91343554586da3c952c63c2369acd879whr#endif /* sgi */
453b973f2b91343554586da3c952c63c2369acd879whr
454b973f2b91343554586da3c952c63c2369acd879whr/***********************************************************************
455b973f2b91343554586da3c952c63c2369acd879whr * lio_random_methods
456b973f2b91343554586da3c952c63c2369acd879whr * This function will randomly choose an io type and wait method
457b973f2b91343554586da3c952c63c2369acd879whr * from set of io types and wait methods.  Since this information
458b973f2b91343554586da3c952c63c2369acd879whr * is stored in a bitmask, it randomly chooses an io type from
459b973f2b91343554586da3c952c63c2369acd879whr * the io type bits specified and does the same for wait methods.
460b973f2b91343554586da3c952c63c2369acd879whr *
461b973f2b91343554586da3c952c63c2369acd879whr * Return Value
462b973f2b91343554586da3c952c63c2369acd879whr * This function will return a value with all non choosen io type
46345a8ba0302fa0632410b2f100f92701651dd7a0fvapier * and wait method bits cleared.  The LIO_RANDOM bit is also
464b973f2b91343554586da3c952c63c2369acd879whr * cleared.  All other bits are left unchanged.
465b973f2b91343554586da3c952c63c2369acd879whr *
466b973f2b91343554586da3c952c63c2369acd879whr * (rrl 04/96)
467b973f2b91343554586da3c952c63c2369acd879whr ***********************************************************************/
468354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint lio_random_methods(long curr_mask)
469b973f2b91343554586da3c952c63c2369acd879whr{
470354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int mask = 0;
471b973f2b91343554586da3c952c63c2369acd879whr
472354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/* remove random select, io type, and wait method bits from curr_mask */
473354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	mask = curr_mask & (~(LIO_IO_TYPES | LIO_WAIT_TYPES | LIO_RANDOM));
474b973f2b91343554586da3c952c63c2369acd879whr
475354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/* randomly select io type from specified io types */
476354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	mask = mask | random_bit(curr_mask & LIO_IO_TYPES);
477b973f2b91343554586da3c952c63c2369acd879whr
478354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/* randomly select wait methods  from specified wait methods */
479354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	mask = mask | random_bit(curr_mask & LIO_WAIT_TYPES);
480b973f2b91343554586da3c952c63c2369acd879whr
481354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	return mask;
482b973f2b91343554586da3c952c63c2369acd879whr}
483b973f2b91343554586da3c952c63c2369acd879whr
484ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modakstatic void wait4sync_io(int fd, int read)
485ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak{
486354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	fd_set s;
487354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	FD_ZERO(&s);
488354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	FD_SET(fd, &s);
489ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak
490354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	select(fd + 1, read ? &s : NULL, read ? NULL : &s, NULL, NULL);
491ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak}
492ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak
493b973f2b91343554586da3c952c63c2369acd879whr/***********************************************************************
49445a8ba0302fa0632410b2f100f92701651dd7a0fvapier * Generic write function
495b973f2b91343554586da3c952c63c2369acd879whr * This function can be used to do a write using write(2), writea(2),
496b973f2b91343554586da3c952c63c2369acd879whr * aio_write(3), writev(2), pwrite(2),
497b973f2b91343554586da3c952c63c2369acd879whr * or single stride listio(2)/lio_listio(3).
498b973f2b91343554586da3c952c63c2369acd879whr * By setting the desired bits in the method
499b973f2b91343554586da3c952c63c2369acd879whr * bitmask, the caller can control the type of write and the wait method
500b973f2b91343554586da3c952c63c2369acd879whr * that will be used.  If no io type bits are set, write will be used.
501b973f2b91343554586da3c952c63c2369acd879whr *
502b973f2b91343554586da3c952c63c2369acd879whr * If async io was attempted and no wait method bits are set then the
503b973f2b91343554586da3c952c63c2369acd879whr * wait method is: recall(2) for writea(2) and listio(2); aio_suspend(3) for
504b973f2b91343554586da3c952c63c2369acd879whr * aio_write(3) and lio_listio(3).
505b973f2b91343554586da3c952c63c2369acd879whr *
50645a8ba0302fa0632410b2f100f92701651dd7a0fvapier * If multiple wait methods are specified,
507b973f2b91343554586da3c952c63c2369acd879whr * only one wait method will be used. The order is predetermined.
508b973f2b91343554586da3c952c63c2369acd879whr *
509b973f2b91343554586da3c952c63c2369acd879whr * If the call specifies a signal and one of the two signal wait methods,
510b973f2b91343554586da3c952c63c2369acd879whr * a signal handler for the signal is set.  This will reset an already
51145a8ba0302fa0632410b2f100f92701651dd7a0fvapier * set handler for this signal.
512b973f2b91343554586da3c952c63c2369acd879whr *
513b973f2b91343554586da3c952c63c2369acd879whr * If the LIO_RANDOM method bit is set, this function will randomly
514b973f2b91343554586da3c952c63c2369acd879whr * choose a io type and wait method from bits in the method argument.
515b973f2b91343554586da3c952c63c2369acd879whr *
516b973f2b91343554586da3c952c63c2369acd879whr * If an error is encountered, an error message will be generated
517b973f2b91343554586da3c952c63c2369acd879whr * in a internal static buffer.  If errmsg is not NULL, it will
518b973f2b91343554586da3c952c63c2369acd879whr * be updated to point to the static buffer, allowing the caller
519b973f2b91343554586da3c952c63c2369acd879whr * to print the error message.
520b973f2b91343554586da3c952c63c2369acd879whr *
521b973f2b91343554586da3c952c63c2369acd879whr * Return Value
522b973f2b91343554586da3c952c63c2369acd879whr *   If a system call fails, -errno is returned.
523b973f2b91343554586da3c952c63c2369acd879whr *   If LIO_WAIT_NONE bit is set, the return value is the return value
524b973f2b91343554586da3c952c63c2369acd879whr *   of the system call.
525b973f2b91343554586da3c952c63c2369acd879whr *   If the io did not fail, the amount of data written is returned.
526b973f2b91343554586da3c952c63c2369acd879whr *	If the size the system call say was written is different
527b973f2b91343554586da3c952c63c2369acd879whr *	then what was asked to be written, errmsg is updated for
528b973f2b91343554586da3c952c63c2369acd879whr *	this error condition.  The return value is still the amount
52945a8ba0302fa0632410b2f100f92701651dd7a0fvapier *	the system call says was written.
530b973f2b91343554586da3c952c63c2369acd879whr *
531b973f2b91343554586da3c952c63c2369acd879whr * (rrl 04/96)
532b973f2b91343554586da3c952c63c2369acd879whr ***********************************************************************/
53387aa2dc20992208fd7478d14425c1e395a57e0c4Stanislav Kholmanskikhint lio_write_buffer(int fd,		/* open file descriptor */
53487aa2dc20992208fd7478d14425c1e395a57e0c4Stanislav Kholmanskikh		int method,	/* contains io type and wait method bitmask */
53587aa2dc20992208fd7478d14425c1e395a57e0c4Stanislav Kholmanskikh		char *buffer,	/* pointer to buffer */
53687aa2dc20992208fd7478d14425c1e395a57e0c4Stanislav Kholmanskikh		int size,	/* the size of the io */
53787aa2dc20992208fd7478d14425c1e395a57e0c4Stanislav Kholmanskikh		int sig,	/* signal to use if async io */
53887aa2dc20992208fd7478d14425c1e395a57e0c4Stanislav Kholmanskikh		char **errmsg,	/* char pointer that will be updated to point to err message */
53987aa2dc20992208fd7478d14425c1e395a57e0c4Stanislav Kholmanskikh		long wrd)	/* to allow future features, use zero for now */
540b973f2b91343554586da3c952c63c2369acd879whr{
541354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int ret = 0;		/* syscall return or used to get random method */
542354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	char *io_type;		/* Holds string of type of io */
543354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int omethod = method;
544354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int listio_cmd;		/* Holds the listio/lio_listio cmd */
545b973f2b91343554586da3c952c63c2369acd879whr#ifdef  CRAY
546354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	struct listreq request;	/* Used when a listio is wanted */
547354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	struct iosw status, *statptr[1];
548b973f2b91343554586da3c952c63c2369acd879whr#else
549354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/* for linux or sgi */
550354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	struct iovec iov;	/* iovec for writev(2) */
551b973f2b91343554586da3c952c63c2369acd879whr#endif
552ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#if defined (sgi)
553354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	aiocb_t aiocbp;		/* POSIX aio control block */
554354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	aiocb_t *aiolist[1];	/* list of aio control blocks for lio_listio */
555354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	off64_t poffset;	/* pwrite(2) offset */
556b973f2b91343554586da3c952c63c2369acd879whr#endif
55726e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(__linux__) && !defined(__UCLIBC__)
558ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak	struct aiocb aiocbp;	/* POSIX aio control block */
559354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	struct aiocb *aiolist[1];	/* list of aio control blocks for lio_listio */
560ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak	off64_t poffset;	/* pwrite(2) offset */
561ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#endif
562354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/*
563354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * If LIO_RANDOM bit specified, get new method randomly.
564354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 */
565354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (method & LIO_RANDOM) {
566354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level > 3)
567354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: method mask to choose from: %#o\n",
568354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       __FILE__, __LINE__, method);
569354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		method = lio_random_methods(method);
570354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level > 2)
571354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: random chosen method %#o\n",
572354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       __FILE__, __LINE__, method);
573354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
574354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
575354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (errmsg != NULL)
576354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		*errmsg = Errormsg;
577354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
578354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	Rec_signal = Received_signal;	/* get the current number of signals received */
57926e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
580354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	Rec_callback = Received_callback;	/* get the current number of callbacks received */
581b973f2b91343554586da3c952c63c2369acd879whr#endif
582b973f2b91343554586da3c952c63c2369acd879whr
583b973f2b91343554586da3c952c63c2369acd879whr#ifdef  CRAY
584354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	memset(&status, 0x00, sizeof(struct iosw));
585354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	memset(&request, 0x00, sizeof(struct listreq));
586354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	statptr[0] = &status;
587b973f2b91343554586da3c952c63c2369acd879whr#else
588354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/* for linux or sgi */
589354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	memset(&iov, 0x00, sizeof(struct iovec));
590354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	iov.iov_base = buffer;
591354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	iov.iov_len = size;
592b973f2b91343554586da3c952c63c2369acd879whr#endif
59326e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
594ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#if defined(sgi)
595354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	memset(&aiocbp, 0x00, sizeof(aiocb_t));
596ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#else
597ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak	memset(&aiocbp, 0x00, sizeof(struct aiocb));
598ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#endif
599354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	aiocbp.aio_fildes = fd;
600354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	aiocbp.aio_nbytes = size;
601354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	aiocbp.aio_buf = buffer;
602b973f2b91343554586da3c952c63c2369acd879whr/*    aiocbp.aio_offset = lseek( fd, 0, SEEK_CUR ); -- set below */
603354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	aiocbp.aio_sigevent.sigev_notify = SIGEV_NONE;
604354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	aiocbp.aio_sigevent.sigev_signo = 0;
605ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#ifdef sgi
606354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	aiocbp.aio_sigevent.sigev_func = NULL;
607354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	aiocbp.aio_sigevent.sigev_value.sival_int = 0;
60826e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#elif defined(__linux__) && !defined(__UCLIBC__)
609ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak	aiocbp.aio_sigevent.sigev_notify_function = NULL;
610ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak	aiocbp.aio_sigevent.sigev_notify_attributes = 0;
611ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#endif
612354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	aiolist[0] = &aiocbp;
613b973f2b91343554586da3c952c63c2369acd879whr
614354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if ((ret = lseek(fd, 0, SEEK_CUR)) == -1) {
615354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		ret = 0;
616354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		/* If there is an error and it is not ESPIPE then kick out the error.
617354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * If the fd is a fifo then we have to make sure that
618354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * lio_random_methods() didn't select pwrite/pread; if it did then
619354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * switch to write/read.
620354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 */
621354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (errno == ESPIPE) {
622354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (method & LIO_IO_SYNCP) {
623354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				if (omethod & LIO_RANDOM) {
624354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					method &= ~LIO_IO_SYNCP;
625354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					method |= LIO_IO_SYNC;
626354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					if (Debug_level > 2)
627354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						printf
628354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    ("DEBUG %s/%d: random chosen method switched to %#o for fifo\n",
629354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						     __FILE__, __LINE__,
630354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						     method);
631354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				} else if (Debug_level) {
632354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					printf
633354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    ("DEBUG %s/%d: pwrite will fail when it writes to a fifo\n",
634354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					     __FILE__, __LINE__);
635354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				}
636b973f2b91343554586da3c952c63c2369acd879whr			}
637354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			/* else: let it ride */
638354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		} else {
639354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(Errormsg,
640354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				"%s/%d lseek(fd=%d,0,SEEK_CUR) failed, errno=%d  %s",
641354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				__FILE__, __LINE__, fd, errno, strerror(errno));
642354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return -errno;
643b973f2b91343554586da3c952c63c2369acd879whr		}
644b973f2b91343554586da3c952c63c2369acd879whr	}
64526e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
646354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	poffset = (off64_t) ret;
647ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#endif
648354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	aiocbp.aio_offset = ret;
649b973f2b91343554586da3c952c63c2369acd879whr
650b973f2b91343554586da3c952c63c2369acd879whr#endif
651b973f2b91343554586da3c952c63c2369acd879whr
652354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/*
653354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * If the LIO_USE_SIGNAL bit is not set, only use the signal
654354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * if the LIO_WAIT_SIGPAUSE or the LIO_WAIT_SIGACTIVE bits are bit.
655354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * Otherwise there is not necessary a signal handler to trap
656354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * the signal.
657354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 */
658354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (sig && !(method & LIO_USE_SIGNAL) && !(method & LIO_WAIT_SIGTYPES)) {
659b973f2b91343554586da3c952c63c2369acd879whr
660354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sig = 0;	/* ignore signal parameter */
661354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
66226e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
663354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (sig && (method & LIO_WAIT_CBTYPES))
664354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sig = 0;	/* ignore signal parameter */
665b973f2b91343554586da3c952c63c2369acd879whr#endif
666b973f2b91343554586da3c952c63c2369acd879whr
667354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/*
668354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * only setup signal hander if sig was specified and
669354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * a sig wait method was specified.
670354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * Doing this will change the handler for this signal.  The
671354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * old signal handler will not be restored.
672354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 *** restoring the signal handler could be added ***
673354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 */
674b973f2b91343554586da3c952c63c2369acd879whr
675354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (sig && (method & LIO_WAIT_SIGTYPES)) {
676b973f2b91343554586da3c952c63c2369acd879whr#ifdef CRAY
677354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sigctl(SCTL_REG, sig, lio_async_signal_handler);
678b973f2b91343554586da3c952c63c2369acd879whr#endif
67926e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
680354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		aiocbp.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
681354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		aiocbp.aio_sigevent.sigev_signo = sig;
682354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sigset(sig, lio_async_signal_handler);
683b973f2b91343554586da3c952c63c2369acd879whr#endif /* sgi */
684354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
685ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#if defined(sgi)
686354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	else if (method & LIO_WAIT_CBTYPES) {
687354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		/* sival_int just has to be something that I can use
688354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * to identify the callback, and "size" happens to be handy...
689354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 */
690354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		aiocbp.aio_sigevent.sigev_notify = SIGEV_CALLBACK;
691354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		aiocbp.aio_sigevent.sigev_func = lio_async_callback_handler;
692354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		aiocbp.aio_sigevent.sigev_value.sival_int = size;
693354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
694b973f2b91343554586da3c952c63c2369acd879whr#endif
69526e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(__linux__) && !defined(__UCLIBC__)
696903910df985927e941076692964ab88d691c8ccbGarrett Cooper	else if (method & LIO_WAIT_CBTYPES) {
697ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak		/* sival_int just has to be something that I can use
698ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak		 * to identify the callback, and "size" happens to be handy...
699ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak		 */
700ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak		aiocbp.aio_sigevent.sigev_notify = SIGEV_THREAD;
701354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		aiocbp.aio_sigevent.sigev_notify_function =
702354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    lio_async_callback_handler;
703354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		aiocbp.aio_sigevent.sigev_notify_attributes =
704354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    (void *)(uintptr_t) size;
705ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak	}
706ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#endif
707b973f2b91343554586da3c952c63c2369acd879whr	/*
708354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * Determine the system call that will be called and produce
709354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * the string of the system call and place it in Lio_SysCall.
710354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * Also update the io_type char pointer to give brief description
711354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * of system call.  Execute the system call and check for
712354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * system call failure.  If sync i/o, return the number of
713354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * bytes written/read.
714354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 */
715354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
716354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if ((method & LIO_IO_SYNC)
717354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	    || (method & (LIO_IO_TYPES | LIO_IO_ATYPES)) == 0) {
718354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		/*
719354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * write(2) is used if LIO_IO_SYNC bit is set or not none
720354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * of the LIO_IO_TYPES bits are set (default).
721354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 */
722354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
723354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(Lio_SysCall, "write(%d, buf, %d)", fd, size);
724354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		io_type = "write";
725354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
726354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level) {
727354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
728354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       Lio_SysCall);
729354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
730354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		while (1) {
731354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (((ret = write(fd, buffer, size)) == -1)
732354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    && errno != EAGAIN && errno != EINTR) {
733354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				sprintf(Errormsg,
734354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					"%s/%d write(%d, buf, %d) ret:-1, errno=%d %s",
735354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					__FILE__, __LINE__, fd, size, errno,
736354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					strerror(errno));
737354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				return -errno;
738354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			}
739354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
740354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (ret != -1) {
741354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				if (ret != size) {
742354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					sprintf(Errormsg,
743354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						"%s/%d write(%d, buf, %d) returned=%d",
744354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						__FILE__, __LINE__,
745354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						fd, size, ret);
746354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					size -= ret;
747354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					buffer += ret;
748354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				} else {
749354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					if (Debug_level > 1)
750354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						printf
751354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    ("DEBUG %s/%d: write completed without error (ret %d)\n",
752354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						     __FILE__, __LINE__, ret);
753354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
754354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					return ret;
755354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				}
756354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			}
757354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			wait4sync_io(fd, 0);
758354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
759354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
760b973f2b91343554586da3c952c63c2369acd879whr	}
761354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
762354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	else if (method & LIO_IO_ASYNC) {
763354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#ifdef CRAY
764354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(Lio_SysCall,
765354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			"writea(%d, buf, %d, &status, %d)", fd, size, sig);
766354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		io_type = "writea";
767354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
768354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level) {
769354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
770354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       Lio_SysCall);
771354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
772354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
773354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sigoff();
774354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if ((ret = writea(fd, buffer, size, &status, sig)) == -1) {
775354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(Errormsg,
776354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				"%s/%d writea(%d, buf, %d, &stat, %d) ret:-1, errno=%d %s",
777354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				__FILE__, __LINE__,
778354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				fd, size, sig, errno, strerror(errno));
779354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sigon();
780354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return -errno;
781354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
782b973f2b91343554586da3c952c63c2369acd879whr#endif
78326e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
784354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(Lio_SysCall,
785354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			"aio_write(fildes=%d, buf, nbytes=%d, signo=%d)", fd,
786354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			size, sig);
787354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		io_type = "aio_write";
788354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
789354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level) {
790354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
791354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       Lio_SysCall);
792354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
793b973f2b91343554586da3c952c63c2369acd879whr
794354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (sig)
795354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sighold(sig);
796354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if ((ret = aio_write(&aiocbp)) == -1) {
797354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(Errormsg,
798354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				"%s/%d aio_write(fildes=%d, buf, nbytes=%d, signo=%d) ret:-1, errno=%d %s",
799354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				__FILE__, __LINE__,
800354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				fd, size, sig, errno, strerror(errno));
801354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (sig)
802354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				sigrelse(sig);
803354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return -errno;
804354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
805354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif
806354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
807354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/* LIO_IO_ASYNC */
808354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	else if (method & LIO_IO_SLISTIO) {
809b973f2b91343554586da3c952c63c2369acd879whr#ifdef CRAY
810354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_opcode = LO_WRITE;
811354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_fildes = fd;
812354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_buf = buffer;
813354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_nbyte = size;
814354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_status = &status;
815354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_signo = sig;
816354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_nstride = 0;
817354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_filstride = 0;
818354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_memstride = 0;
819354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
820354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		listio_cmd = LC_WAIT;
821354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		io_type = "listio(2) sync write";
822354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
823354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(Lio_SysCall,
824354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			"listio(LC_WAIT, &req, 1) LO_WRITE, fd:%d, nbyte:%d",
825354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			fd, size);
826354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
827354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level) {
828354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
829354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       Lio_SysCall);
830354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
831354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
832354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sigoff();
833354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (listio(listio_cmd, &request, 1) == -1) {
834354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(Errormsg,
835354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				"%s/%d %s failed, fd:%d, nbyte:%d errno=%d %s",
836354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				__FILE__, __LINE__, Lio_SysCall, fd, size,
837354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				errno, strerror(errno));
838354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sigon();
839354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return -errno;
840354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
841354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
842354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level > 1)
843354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: %s did not return -1\n",
844354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       __FILE__, __LINE__, Lio_SysCall);
845354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
846354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		ret = lio_check_asyncio(io_type, size, &status);
847354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return ret;
848b973f2b91343554586da3c952c63c2369acd879whr
849b973f2b91343554586da3c952c63c2369acd879whr#endif
85026e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
851b973f2b91343554586da3c952c63c2369acd879whr
852354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		aiocbp.aio_lio_opcode = LIO_WRITE;
853354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		listio_cmd = LIO_WAIT;
854354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		io_type = "lio_listio(3) sync write";
855354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
856354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(Lio_SysCall,
857354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			"lio_listio(LIO_WAIT, aiolist, 1, NULL) LIO_WRITE, fd:%d, nbyte:%d, sig:%d",
858354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			fd, size, sig);
859354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
860354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level) {
861354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
862354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       Lio_SysCall);
863354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
864354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
865354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (sig)
866354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sighold(sig);
867354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (lio_listio(listio_cmd, aiolist, 1, NULL) == -1) {
868354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(Errormsg,
869354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				"%s/%d %s failed, fd:%d, nbyte:%d errno=%d %s",
870354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				__FILE__, __LINE__, Lio_SysCall, fd, size,
871354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				errno, strerror(errno));
872354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (sig)
873354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				sigrelse(sig);
874354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return -errno;
875354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
876b973f2b91343554586da3c952c63c2369acd879whr
877354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level > 1)
878354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: %s did not return -1\n",
879354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       __FILE__, __LINE__, Lio_SysCall);
880354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
881354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		ret = lio_check_asyncio(io_type, size, &aiocbp, method);
882354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return ret;
883354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif
884354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
885354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/* LIO_IO_SLISTIO */
886354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	else if (method & LIO_IO_ALISTIO) {
887b973f2b91343554586da3c952c63c2369acd879whr#ifdef CRAY
888354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_opcode = LO_WRITE;
889354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_fildes = fd;
890354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_buf = buffer;
891354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_nbyte = size;
892354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_status = &status;
893354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_signo = sig;
894354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_nstride = 0;
895354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_filstride = 0;
896354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_memstride = 0;
897354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
898354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		listio_cmd = LC_START;
899354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		io_type = "listio(2) async write";
900354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
901354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(Lio_SysCall,
902354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			"listio(LC_START, &req, 1) LO_WRITE, fd:%d, nbyte:%d",
903354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			fd, size);
904354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
905354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level) {
906354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
907354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       Lio_SysCall);
908354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
909354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
910354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sigoff();
911354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (listio(listio_cmd, &request, 1) == -1) {
912354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(Errormsg,
913354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				"%s/%d %s failed, fd:%d, nbyte:%d errno=%d %s",
914354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				__FILE__, __LINE__, Lio_SysCall, fd, size,
915354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				errno, strerror(errno));
916354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sigon();
917354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return -errno;
918354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
919b973f2b91343554586da3c952c63c2369acd879whr#endif
92026e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined (sgi) || (defined(__linux__) && !defined(__UCLIBC__))
921354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		aiocbp.aio_lio_opcode = LIO_WRITE;
922354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		listio_cmd = LIO_NOWAIT;
923354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		io_type = "lio_listio(3) async write";
924b973f2b91343554586da3c952c63c2369acd879whr
925354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(Lio_SysCall,
926354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			"lio_listio(LIO_NOWAIT, aiolist, 1, NULL) LIO_WRITE, fd:%d, nbyte:%d",
927354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			fd, size);
928354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
929354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level) {
930354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
931354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       Lio_SysCall);
932354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
933354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
934354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (sig)
935354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sighold(sig);
936354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (lio_listio(listio_cmd, aiolist, 1, NULL) == -1) {
937354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(Errormsg,
938354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				"%s/%d %s failed, fd:%d, nbyte:%d errno=%d %s",
939354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				__FILE__, __LINE__, Lio_SysCall, fd, size,
940354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				errno, strerror(errno));
941354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (sig)
942354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				sigrelse(sig);
943354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return -errno;
944354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
945354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif
946b973f2b91343554586da3c952c63c2369acd879whr	}
947354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/* LIO_IO_ALISTIO */
948354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#ifndef CRAY
949354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	else if (method & LIO_IO_SYNCV) {
950354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		io_type = "writev(2)";
951b973f2b91343554586da3c952c63c2369acd879whr
952354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(Lio_SysCall, "writev(%d, &iov, 1) nbyte:%d", fd, size);
953b973f2b91343554586da3c952c63c2369acd879whr
954354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level) {
955354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
956354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       Lio_SysCall);
957354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
958354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if ((ret = writev(fd, &iov, 1)) == -1) {
959354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(Errormsg,
960354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				"%s/%d writev(%d, iov, 1) nbyte:%d ret:-1, errno=%d %s",
961354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				__FILE__, __LINE__, fd, size, errno,
962354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				strerror(errno));
963354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return -errno;
964354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
965354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
966354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (ret != size) {
967354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(Errormsg,
968354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				"%s/%d writev(%d, iov, 1) nbyte:%d returned=%d",
969354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				__FILE__, __LINE__, fd, size, ret);
970354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		} else if (Debug_level > 1)
971354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf
972354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ("DEBUG %s/%d: writev completed without error (ret %d)\n",
973354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     __FILE__, __LINE__, ret);
974354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
975354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return ret;
976354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}			/* LIO_IO_SYNCV */
977b973f2b91343554586da3c952c63c2369acd879whr#endif
978b973f2b91343554586da3c952c63c2369acd879whr
97926e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
980354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	else if (method & LIO_IO_SYNCP) {
981354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		io_type = "pwrite(2)";
982354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
983354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(Lio_SysCall,
984354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			"pwrite(%d, buf, %d, %lld)", fd, size,
985354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			(long long)poffset);
986354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
987354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level) {
988354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
989354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       Lio_SysCall);
990354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
991354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if ((ret = pwrite(fd, buffer, size, poffset)) == -1) {
992354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(Errormsg,
993354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				"%s/%d pwrite(%d, buf, %d, %lld) ret:-1, errno=%d %s",
994354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				__FILE__, __LINE__, fd, size,
995354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				(long long)poffset, errno, strerror(errno));
996354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return -errno;
997354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
998354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
999354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (ret != size) {
1000354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(Errormsg,
1001354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				"%s/%d pwrite(%d, buf, %d, %lld) returned=%d",
1002354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				__FILE__, __LINE__,
1003354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				fd, size, (long long)poffset, ret);
1004354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		} else if (Debug_level > 1)
1005354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf
1006354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ("DEBUG %s/%d: pwrite completed without error (ret %d)\n",
1007354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     __FILE__, __LINE__, ret);
1008354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1009354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return ret;
1010354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}			/* LIO_IO_SYNCP */
1011354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif
1012354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1013354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	else {
1014354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		printf("DEBUG %s/%d: No I/O method chosen\n", __FILE__,
1015354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		       __LINE__);
1016354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return -1;
1017b973f2b91343554586da3c952c63c2369acd879whr	}
1018b973f2b91343554586da3c952c63c2369acd879whr
1019354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/*
1020354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * wait for async io to complete.
1021354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 */
1022b973f2b91343554586da3c952c63c2369acd879whr#ifdef CRAY
1023354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	ret = lio_wait4asyncio(method, fd, statptr);
1024b973f2b91343554586da3c952c63c2369acd879whr#endif
102526e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
1026354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	ret = lio_wait4asyncio(method, fd, &aiocbp);
1027b973f2b91343554586da3c952c63c2369acd879whr#endif
1028b973f2b91343554586da3c952c63c2369acd879whr
1029354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/*
1030354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * If there was an error waiting for async i/o to complete,
1031354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * return the error value (errno) to the caller.
1032354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * Note: Errormsg should already have been updated.
1033354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 */
1034354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (ret < 0) {
1035354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return ret;
1036354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
1037354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1038354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/*
1039354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * If i/o was not waited for (may not have been completed at this time),
1040354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * return the size that was requested.
1041354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 */
1042354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (ret == 1)
1043354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return size;
1044354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1045354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/*
1046354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * check that async io was successful.
1047354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * Note:  if the there was an system call failure, -errno
1048354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * was returned and Errormsg should already have been updated.
1049354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * If amount i/o was different than size, Errormsg should already
1050354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * have been updated but the actual i/o size if returned.
1051354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 */
105245a8ba0302fa0632410b2f100f92701651dd7a0fvapier
1053b973f2b91343554586da3c952c63c2369acd879whr#ifdef CRAY
1054354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	ret = lio_check_asyncio(io_type, size, &status);
1055b973f2b91343554586da3c952c63c2369acd879whr#endif
105626e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
1057354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	ret = lio_check_asyncio(io_type, size, &aiocbp, method);
1058b973f2b91343554586da3c952c63c2369acd879whr#endif
1059b973f2b91343554586da3c952c63c2369acd879whr
1060354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	return ret;
1061354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao}				/* end of lio_write_buffer */
1062b973f2b91343554586da3c952c63c2369acd879whr
1063b973f2b91343554586da3c952c63c2369acd879whr/***********************************************************************
106445a8ba0302fa0632410b2f100f92701651dd7a0fvapier * Generic read function
1065b973f2b91343554586da3c952c63c2369acd879whr * This function can be used to do a read using read(2), reada(2),
1066b973f2b91343554586da3c952c63c2369acd879whr * aio_read(3), readv(2), pread(2),
1067b973f2b91343554586da3c952c63c2369acd879whr * or single stride listio(2)/lio_listio(3).
1068b973f2b91343554586da3c952c63c2369acd879whr * By setting the desired bits in the method
1069b973f2b91343554586da3c952c63c2369acd879whr * bitmask, the caller can control the type of read and the wait method
1070b973f2b91343554586da3c952c63c2369acd879whr * that will be used.  If no io type bits are set, read will be used.
1071b973f2b91343554586da3c952c63c2369acd879whr *
1072b973f2b91343554586da3c952c63c2369acd879whr * If async io was attempted and no wait method bits are set then the
1073b973f2b91343554586da3c952c63c2369acd879whr * wait method is: recall(2) for reada(2) and listio(2); aio_suspend(3) for
1074b973f2b91343554586da3c952c63c2369acd879whr * aio_read(3) and lio_listio(3).
1075b973f2b91343554586da3c952c63c2369acd879whr *
107645a8ba0302fa0632410b2f100f92701651dd7a0fvapier * If multiple wait methods are specified,
1077b973f2b91343554586da3c952c63c2369acd879whr * only one wait method will be used. The order is predetermined.
1078b973f2b91343554586da3c952c63c2369acd879whr *
1079b973f2b91343554586da3c952c63c2369acd879whr * If the call specifies a signal and one of the two signal wait methods,
1080b973f2b91343554586da3c952c63c2369acd879whr * a signal handler for the signal is set.  This will reset an already
108145a8ba0302fa0632410b2f100f92701651dd7a0fvapier * set handler for this signal.
1082b973f2b91343554586da3c952c63c2369acd879whr *
1083b973f2b91343554586da3c952c63c2369acd879whr * If the LIO_RANDOM method bit is set, this function will randomly
1084b973f2b91343554586da3c952c63c2369acd879whr * choose a io type and wait method from bits in the method argument.
1085b973f2b91343554586da3c952c63c2369acd879whr *
1086b973f2b91343554586da3c952c63c2369acd879whr * If an error is encountered, an error message will be generated
1087b973f2b91343554586da3c952c63c2369acd879whr * in a internal static buffer.  If errmsg is not NULL, it will
1088b973f2b91343554586da3c952c63c2369acd879whr * be updated to point to the static buffer, allowing the caller
1089b973f2b91343554586da3c952c63c2369acd879whr * to print the error message.
1090b973f2b91343554586da3c952c63c2369acd879whr *
1091b973f2b91343554586da3c952c63c2369acd879whr * Return Value
1092b973f2b91343554586da3c952c63c2369acd879whr *   If a system call fails, -errno is returned.
1093b973f2b91343554586da3c952c63c2369acd879whr *   If LIO_WAIT_NONE bit is set, the return value is the return value
1094b973f2b91343554586da3c952c63c2369acd879whr *   of the system call.
1095b973f2b91343554586da3c952c63c2369acd879whr *   If the io did not fail, the amount of data written is returned.
1096b973f2b91343554586da3c952c63c2369acd879whr *	If the size the system call say was written is different
1097b973f2b91343554586da3c952c63c2369acd879whr *	then what was asked to be written, errmsg is updated for
1098b973f2b91343554586da3c952c63c2369acd879whr *	this error condition.  The return value is still the amount
109945a8ba0302fa0632410b2f100f92701651dd7a0fvapier *	the system call says was written.
1100b973f2b91343554586da3c952c63c2369acd879whr *
1101b973f2b91343554586da3c952c63c2369acd879whr * (rrl 04/96)
1102b973f2b91343554586da3c952c63c2369acd879whr ***********************************************************************/
110387aa2dc20992208fd7478d14425c1e395a57e0c4Stanislav Kholmanskikhint lio_read_buffer(int fd,	/* open file descriptor */
110487aa2dc20992208fd7478d14425c1e395a57e0c4Stanislav Kholmanskikh		int method,	/* contains io type and wait method bitmask*/
110587aa2dc20992208fd7478d14425c1e395a57e0c4Stanislav Kholmanskikh		char *buffer,	/* pointer to buffer */
110687aa2dc20992208fd7478d14425c1e395a57e0c4Stanislav Kholmanskikh		int size,	/* the size of the io */
110787aa2dc20992208fd7478d14425c1e395a57e0c4Stanislav Kholmanskikh		int sig,	/* signal to use if async io */
110887aa2dc20992208fd7478d14425c1e395a57e0c4Stanislav Kholmanskikh		char **errmsg,	/* char pointer that will be updated to point to err message */
110987aa2dc20992208fd7478d14425c1e395a57e0c4Stanislav Kholmanskikh		long wrd)	/* to allow future features, use zero for now */
1110b973f2b91343554586da3c952c63c2369acd879whr{
1111354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int ret = 0;		/* syscall return or used to get random method */
1112354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	char *io_type;		/* Holds string of type of io */
1113354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int listio_cmd;		/* Holds the listio/lio_listio cmd */
1114354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int omethod = method;
1115b973f2b91343554586da3c952c63c2369acd879whr#ifdef  CRAY
1116354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	struct listreq request;	/* Used when a listio is wanted */
1117354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	struct iosw status, *statptr[1];
1118b973f2b91343554586da3c952c63c2369acd879whr#else
1119354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/* for linux or sgi */
1120354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	struct iovec iov;	/* iovec for readv(2) */
1121b973f2b91343554586da3c952c63c2369acd879whr#endif
1122b973f2b91343554586da3c952c63c2369acd879whr#ifdef sgi
1123354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	aiocb_t aiocbp;		/* POSIX aio control block */
1124354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	aiocb_t *aiolist[1];	/* list of aio control blocks for lio_listio */
1125354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	off64_t poffset;	/* pread(2) offset */
1126b973f2b91343554586da3c952c63c2369acd879whr#endif
112726e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined (__linux__) && !defined(__UCLIBC__)
1128ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak	struct aiocb aiocbp;	/* POSIX aio control block */
1129354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	struct aiocb *aiolist[1];	/* list of aio control blocks for lio_listio */
1130ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak	off64_t poffset;	/* pread(2) offset */
1131ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#endif
1132b973f2b91343554586da3c952c63c2369acd879whr
1133354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/*
1134354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * If LIO_RANDOM bit specified, get new method randomly.
1135354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 */
1136354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (method & LIO_RANDOM) {
1137354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level > 3)
1138354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: method mask to choose from: %#o\n",
1139354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       __FILE__, __LINE__, method);
1140354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		method = lio_random_methods(method);
1141354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level > 2)
1142354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: random chosen method %#o\n",
1143354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       __FILE__, __LINE__, method);
1144354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
1145b973f2b91343554586da3c952c63c2369acd879whr
1146354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (errmsg != NULL)
1147354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		*errmsg = Errormsg;
1148b973f2b91343554586da3c952c63c2369acd879whr
1149354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	Rec_signal = Received_signal;	/* get the current number of signals received */
115026e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
1151354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	Rec_callback = Received_callback;	/* get the current number of callbacks received */
1152b973f2b91343554586da3c952c63c2369acd879whr#endif
1153b973f2b91343554586da3c952c63c2369acd879whr
1154b973f2b91343554586da3c952c63c2369acd879whr#ifdef  CRAY
1155354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	memset(&status, 0x00, sizeof(struct iosw));
1156354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	memset(&request, 0x00, sizeof(struct listreq));
1157354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	statptr[0] = &status;
1158b973f2b91343554586da3c952c63c2369acd879whr#else
1159354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/* for linux or sgi */
1160354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	memset(&iov, 0x00, sizeof(struct iovec));
1161354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	iov.iov_base = buffer;
1162354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	iov.iov_len = size;
1163b973f2b91343554586da3c952c63c2369acd879whr#endif
116426e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
1165ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#if defined(sgi)
1166354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	memset(&aiocbp, 0x00, sizeof(aiocb_t));
1167ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#else
1168ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak	memset(&aiocbp, 0x00, sizeof(struct aiocb));
1169ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#endif
1170354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	aiocbp.aio_fildes = fd;
1171354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	aiocbp.aio_nbytes = size;
1172354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	aiocbp.aio_buf = buffer;
1173b973f2b91343554586da3c952c63c2369acd879whr/*    aiocbp.aio_offset = lseek( fd, 0, SEEK_CUR ); -- set below */
1174354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	aiocbp.aio_sigevent.sigev_notify = SIGEV_NONE;
1175354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	aiocbp.aio_sigevent.sigev_signo = 0;
1176ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#ifdef sgi
1177354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	aiocbp.aio_sigevent.sigev_func = NULL;
1178354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	aiocbp.aio_sigevent.sigev_value.sival_int = 0;
117926e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#elif defined(__linux__) && !defined(__UCLIBC__)
1180ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak	aiocbp.aio_sigevent.sigev_notify_function = NULL;
1181ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak	aiocbp.aio_sigevent.sigev_notify_attributes = 0;
1182ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#endif
1183354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	aiolist[0] = &aiocbp;
1184b973f2b91343554586da3c952c63c2369acd879whr
1185354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if ((ret = lseek(fd, 0, SEEK_CUR)) == -1) {
1186354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		ret = 0;
1187354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		/* If there is an error and it is not ESPIPE then kick out the error.
1188354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * If the fd is a fifo then we have to make sure that
1189354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * lio_random_methods() didn't select pwrite/pread; if it did then
1190354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * switch to write/read.
1191354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 */
1192354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (errno == ESPIPE) {
1193354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (method & LIO_IO_SYNCP) {
1194354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				if (omethod & LIO_RANDOM) {
1195354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					method &= ~LIO_IO_SYNCP;
1196354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					method |= LIO_IO_SYNC;
1197354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					if (Debug_level > 2)
1198354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						printf
1199354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    ("DEBUG %s/%d: random chosen method switched to %#o for fifo\n",
1200354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						     __FILE__, __LINE__,
1201354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						     method);
1202354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				} else if (Debug_level) {
1203354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					printf
1204354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    ("DEBUG %s/%d: pread will fail when it reads from a fifo\n",
1205354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					     __FILE__, __LINE__);
1206354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				}
1207b973f2b91343554586da3c952c63c2369acd879whr			}
1208354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			/* else: let it ride */
1209354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		} else {
1210354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(Errormsg,
1211354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				"%s/%d lseek(fd=%d,0,SEEK_CUR) failed, errno=%d  %s",
1212354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				__FILE__, __LINE__, fd, errno, strerror(errno));
1213354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return -errno;
1214b973f2b91343554586da3c952c63c2369acd879whr		}
1215b973f2b91343554586da3c952c63c2369acd879whr	}
121626e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
1217354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	poffset = (off64_t) ret;
1218ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#endif
1219354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	aiocbp.aio_offset = ret;
1220b973f2b91343554586da3c952c63c2369acd879whr
1221b973f2b91343554586da3c952c63c2369acd879whr#endif
1222b973f2b91343554586da3c952c63c2369acd879whr
1223354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/*
1224354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * If the LIO_USE_SIGNAL bit is not set, only use the signal
1225354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * if the LIO_WAIT_SIGPAUSE or the LIO_WAIT_SIGACTIVE bits are set.
1226354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * Otherwise there is not necessarily a signal handler to trap
1227354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * the signal.
1228354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 */
1229354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (sig && !(method & LIO_USE_SIGNAL) && !(method & LIO_WAIT_SIGTYPES)) {
1230b973f2b91343554586da3c952c63c2369acd879whr
1231354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sig = 0;	/* ignore signal parameter */
1232354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
123326e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__)&& !defined(__UCLIBC__))
1234354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (sig && (method & LIO_WAIT_CBTYPES))
1235354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sig = 0;	/* ignore signal parameter */
1236b973f2b91343554586da3c952c63c2369acd879whr#endif
1237b973f2b91343554586da3c952c63c2369acd879whr
1238354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/*
1239354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * only setup signal hander if sig was specified and
1240354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * a sig wait method was specified.
1241354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * Doing this will change the handler for this signal.  The
1242354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * old signal handler will not be restored.
1243354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 *** restoring the signal handler could be added ***
1244354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 */
1245b973f2b91343554586da3c952c63c2369acd879whr
1246354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (sig && (method & LIO_WAIT_SIGTYPES)) {
1247b973f2b91343554586da3c952c63c2369acd879whr#ifdef CRAY
1248354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sigctl(SCTL_REG, sig, lio_async_signal_handler);
1249b973f2b91343554586da3c952c63c2369acd879whr#endif
125026e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
1251354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		aiocbp.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
1252354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		aiocbp.aio_sigevent.sigev_signo = sig;
1253354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sigset(sig, lio_async_signal_handler);
1254b973f2b91343554586da3c952c63c2369acd879whr#endif /* CRAY */
1255354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
1256ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#if defined(sgi)
1257354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	else if (method & LIO_WAIT_CBTYPES) {
1258354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		aiocbp.aio_sigevent.sigev_notify = SIGEV_CALLBACK;
1259354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		aiocbp.aio_sigevent.sigev_func = lio_async_callback_handler;
1260354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		/* sival_int just has to be something that I can use
1261354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * to identify the callback, and "size" happens to be handy...
1262354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 */
1263354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		aiocbp.aio_sigevent.sigev_value.sival_int = size;
1264354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
1265b973f2b91343554586da3c952c63c2369acd879whr#endif
126626e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(__linux__) && !defined(__UCLIBC__)
1267903910df985927e941076692964ab88d691c8ccbGarrett Cooper	else if (method & LIO_WAIT_CBTYPES) {
1268ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak		aiocbp.aio_sigevent.sigev_notify = SIGEV_THREAD;
1269354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		aiocbp.aio_sigevent.sigev_notify_function =
1270354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    lio_async_callback_handler;
1271ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak		/* sival_int just has to be something that I can use
1272ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak		 * to identify the callback, and "size" happens to be handy...
1273ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak		 */
1274354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		aiocbp.aio_sigevent.sigev_notify_attributes =
1275354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    (void *)(uintptr_t) size;
1276ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak	}
1277ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#endif
1278b973f2b91343554586da3c952c63c2369acd879whr
1279b973f2b91343554586da3c952c63c2369acd879whr	/*
1280354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * Determine the system call that will be called and produce
1281354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * the string of the system call and place it in Lio_SysCall.
1282354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * Also update the io_type char pointer to give brief description
1283354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * of system call.  Execute the system call and check for
1284354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * system call failure.  If sync i/o, return the number of
1285354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * bytes written/read.
1286354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 */
1287354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1288354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if ((method & LIO_IO_SYNC)
1289354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	    || (method & (LIO_IO_TYPES | LIO_IO_ATYPES)) == 0) {
1290354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		/*
1291354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * read(2) is used if LIO_IO_SYNC bit is set or not none
1292354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * of the LIO_IO_TYPES bits are set (default).
1293354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 */
1294354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1295354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(Lio_SysCall, "read(%d, buf, %d)", fd, size);
1296354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		io_type = "read";
1297354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1298354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level) {
1299354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
1300354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       Lio_SysCall);
1301354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
1302354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1303354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		while (1) {
1304354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (((ret = read(fd, buffer, size)) == -1)
1305354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    && errno != EINTR && errno != EAGAIN) {
1306354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				sprintf(Errormsg,
1307354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					"%s/%d read(%d, buf, %d) ret:-1, errno=%d %s",
1308354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					__FILE__, __LINE__, fd, size, errno,
1309354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					strerror(errno));
1310354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				return -errno;
1311354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			}
1312354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1313354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (ret == 0)
1314354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				return 0;
1315354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (ret != -1) {
1316354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				if (ret != size) {
1317354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					sprintf(Errormsg,
1318354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						"%s/%d read(%d, buf, %d) returned=%d",
1319354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						__FILE__, __LINE__,
1320354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						fd, size, ret);
1321354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					size -= ret;
1322354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					buffer += ret;
1323354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				} else {
1324354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					if (Debug_level > 1)
1325354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						printf
1326354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    ("DEBUG %s/%d: read completed without error (ret %d)\n",
1327354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						     __FILE__, __LINE__, ret);
1328354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1329354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					return ret;
1330354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				}
1331354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			}
1332354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			wait4sync_io(fd, 1);
1333354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
1334354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1335b973f2b91343554586da3c952c63c2369acd879whr	}
1336354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1337354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	else if (method & LIO_IO_ASYNC) {
1338354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#ifdef CRAY
1339354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(Lio_SysCall,
1340354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			"reada(%d, buf, %d, &status, %d)", fd, size, sig);
1341354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		io_type = "reada";
1342354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1343354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level) {
1344354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
1345354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       Lio_SysCall);
1346354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
1347354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1348354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sigoff();
1349354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if ((ret = reada(fd, buffer, size, &status, sig)) == -1) {
1350354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(Errormsg,
1351354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				"%s/%d reada(%d, buf, %d, &stat, %d) ret:-1, errno=%d %s",
1352354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				__FILE__, __LINE__,
1353354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				fd, size, sig, errno, strerror(errno));
1354354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sigon();
1355354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return -errno;
1356354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
1357b973f2b91343554586da3c952c63c2369acd879whr#endif
135826e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
1359354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(Lio_SysCall,
1360354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			"aio_read(fildes=%d, buf, nbytes=%d, signo=%d)", fd,
1361354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			size, sig);
1362354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		io_type = "aio_read";
1363354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1364354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level) {
1365354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
1366354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       Lio_SysCall);
1367354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
1368b973f2b91343554586da3c952c63c2369acd879whr
1369354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (sig)
1370354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sighold(sig);
1371354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if ((ret = aio_read(&aiocbp)) == -1) {
1372354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(Errormsg,
1373354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				"%s/%d aio_read(fildes=%d, buf, nbytes=%d, signo=%d) ret:-1, errno=%d %s",
1374354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				__FILE__, __LINE__,
1375354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				fd, size, sig, errno, strerror(errno));
1376354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (sig)
1377354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				sigrelse(sig);
1378354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return -errno;
1379354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
1380354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif
1381354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
1382354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/* LIO_IO_ASYNC */
1383354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	else if (method & LIO_IO_SLISTIO) {
1384b973f2b91343554586da3c952c63c2369acd879whr#ifdef CRAY
1385354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_opcode = LO_READ;
1386354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_fildes = fd;
1387354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_buf = buffer;
1388354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_nbyte = size;
1389354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_status = &status;
1390354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_signo = sig;
1391354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_nstride = 0;
1392354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_filstride = 0;
1393354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_memstride = 0;
1394354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1395354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		listio_cmd = LC_WAIT;
1396354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		io_type = "listio(2) sync read";
1397354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1398354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(Lio_SysCall,
1399354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			"listio(LC_WAIT, &req, 1) LO_READ, fd:%d, nbyte:%d",
1400354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			fd, size);
1401354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1402354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level) {
1403354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
1404354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       Lio_SysCall);
1405354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
1406354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1407354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sigoff();
1408354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (listio(listio_cmd, &request, 1) == -1) {
1409354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(Errormsg,
1410354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				"%s/%d %s failed, fd:%d, nbyte:%d errno=%d %s",
1411354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				__FILE__, __LINE__, Lio_SysCall, fd, size,
1412354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				errno, strerror(errno));
1413354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sigon();
1414354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return -errno;
1415354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
1416354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1417354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level > 1)
1418354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: %s did not return -1\n",
1419354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       __FILE__, __LINE__, Lio_SysCall);
1420354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1421354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		ret = lio_check_asyncio(io_type, size, &status);
1422354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return ret;
1423b973f2b91343554586da3c952c63c2369acd879whr#endif
142426e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
1425354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		aiocbp.aio_lio_opcode = LIO_READ;
1426354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		listio_cmd = LIO_WAIT;
1427354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		io_type = "lio_listio(3) sync read";
1428354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1429354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(Lio_SysCall,
1430354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			"lio_listio(LIO_WAIT, aiolist, 1, NULL) LIO_READ, fd:%d, nbyte:%d",
1431354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			fd, size);
1432354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1433354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level) {
1434354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
1435354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       Lio_SysCall);
1436354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
1437354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1438354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (sig)
1439354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sighold(sig);
1440354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (lio_listio(listio_cmd, aiolist, 1, NULL) == -1) {
1441354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(Errormsg,
1442354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				"%s/%d %s failed, fd:%d, nbyte:%d errno=%d %s",
1443354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				__FILE__, __LINE__, Lio_SysCall, fd, size,
1444354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				errno, strerror(errno));
1445354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (sig)
1446354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				sigrelse(sig);
1447354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return -errno;
1448354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
1449354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1450354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level > 1)
1451354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: %s did not return -1\n",
1452354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       __FILE__, __LINE__, Lio_SysCall);
1453b973f2b91343554586da3c952c63c2369acd879whr
1454354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		ret = lio_check_asyncio(io_type, size, &aiocbp, method);
1455354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return ret;
1456354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif
1457354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
1458354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/* LIO_IO_SLISTIO */
1459354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	else if (method & LIO_IO_ALISTIO) {
1460b973f2b91343554586da3c952c63c2369acd879whr#ifdef CRAY
1461354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_opcode = LO_READ;
1462354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_fildes = fd;
1463354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_buf = buffer;
1464354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_nbyte = size;
1465354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_status = &status;
1466354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_signo = sig;
1467354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_nstride = 0;
1468354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_filstride = 0;
1469354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		request.li_memstride = 0;
1470354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1471354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		listio_cmd = LC_START;
1472354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		io_type = "listio(2) async read";
1473354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1474354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(Lio_SysCall,
1475354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			"listio(LC_START, &req, 1) LO_READ, fd:%d, nbyte:%d",
1476354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			fd, size);
1477354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1478354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level) {
1479354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
1480354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       Lio_SysCall);
1481354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
1482354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1483354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sigoff();
1484354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (listio(listio_cmd, &request, 1) == -1) {
1485354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(Errormsg,
1486354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				"%s/%d %s failed, fd:%d, nbyte:%d errno=%d %s",
1487354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				__FILE__, __LINE__, Lio_SysCall, fd, size,
1488354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				errno, strerror(errno));
1489354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sigon();
1490354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return -errno;
1491354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
1492b973f2b91343554586da3c952c63c2369acd879whr#endif
149326e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
1494354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		aiocbp.aio_lio_opcode = LIO_READ;
1495354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		listio_cmd = LIO_NOWAIT;
1496354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		io_type = "lio_listio(3) async read";
1497b973f2b91343554586da3c952c63c2369acd879whr
1498354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(Lio_SysCall,
1499354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			"lio_listio(LIO_NOWAIT, aiolist, 1, NULL) LIO_READ, fd:%d, nbyte:%d",
1500354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			fd, size);
1501354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1502354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level) {
1503354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
1504354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       Lio_SysCall);
1505354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
1506354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1507354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (sig)
1508354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sighold(sig);
1509354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (lio_listio(listio_cmd, aiolist, 1, NULL) == -1) {
1510354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(Errormsg,
1511354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				"%s/%d %s failed, fd:%d, nbyte:%d errno=%d %s",
1512354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				__FILE__, __LINE__, Lio_SysCall, fd, size,
1513354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				errno, strerror(errno));
1514354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (sig)
1515354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				sigrelse(sig);
1516354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return -errno;
1517354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
1518354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif
1519b973f2b91343554586da3c952c63c2369acd879whr	}
1520354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/* LIO_IO_ALISTIO */
1521354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#ifndef CRAY
1522354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	else if (method & LIO_IO_SYNCV) {
1523354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		io_type = "readv(2)";
1524b973f2b91343554586da3c952c63c2369acd879whr
1525354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(Lio_SysCall, "readv(%d, &iov, 1) nbyte:%d", fd, size);
1526b973f2b91343554586da3c952c63c2369acd879whr
1527354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level) {
1528354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
1529354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       Lio_SysCall);
1530354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
1531354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if ((ret = readv(fd, &iov, 1)) == -1) {
1532354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(Errormsg,
1533354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				"%s/%d readv(%d, iov, 1) nbyte:%d ret:-1, errno=%d %s",
1534354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				__FILE__, __LINE__, fd, size, errno,
1535354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				strerror(errno));
1536354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return -errno;
1537354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
1538354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1539354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (ret != size) {
1540354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(Errormsg,
1541354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				"%s/%d readv(%d, iov, 1) nbyte:%d returned=%d",
1542354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				__FILE__, __LINE__, fd, size, ret);
1543354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		} else if (Debug_level > 1)
1544354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf
1545354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ("DEBUG %s/%d: readv completed without error (ret %d)\n",
1546354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     __FILE__, __LINE__, ret);
1547354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1548354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return ret;
1549354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}			/* LIO_IO_SYNCV */
1550b973f2b91343554586da3c952c63c2369acd879whr#endif
1551b973f2b91343554586da3c952c63c2369acd879whr
155226e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
1553354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	else if (method & LIO_IO_SYNCP) {
1554354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		io_type = "pread(2)";
1555354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1556354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(Lio_SysCall,
1557354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			"pread(%d, buf, %d, %lld)", fd, size,
1558354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			(long long)poffset);
1559354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1560354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level) {
1561354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
1562354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       Lio_SysCall);
1563354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
1564354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if ((ret = pread(fd, buffer, size, poffset)) == -1) {
1565354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(Errormsg,
1566354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				"%s/%d pread(%d, buf, %d, %lld) ret:-1, errno=%d %s",
1567354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				__FILE__, __LINE__, fd, size,
1568354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				(long long)poffset, errno, strerror(errno));
1569354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return -errno;
1570354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
1571354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1572354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (ret != size) {
1573354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(Errormsg,
1574354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				"%s/%d pread(%d, buf, %d, %lld) returned=%d",
1575354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				__FILE__, __LINE__,
1576354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				fd, size, (long long)poffset, ret);
1577354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		} else if (Debug_level > 1)
1578354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf
1579354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ("DEBUG %s/%d: pread completed without error (ret %d)\n",
1580354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     __FILE__, __LINE__, ret);
1581354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1582354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return ret;
1583354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}			/* LIO_IO_SYNCP */
1584354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif
1585354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1586354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	else {
1587354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		printf("DEBUG %s/%d: No I/O method chosen\n", __FILE__,
1588354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		       __LINE__);
1589354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return -1;
1590b973f2b91343554586da3c952c63c2369acd879whr	}
1591b973f2b91343554586da3c952c63c2369acd879whr
1592354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/*
1593354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * wait for async io to complete.
1594354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * Note: Sync io should have returned prior to getting here.
1595354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 */
1596b973f2b91343554586da3c952c63c2369acd879whr#ifdef CRAY
1597354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	ret = lio_wait4asyncio(method, fd, statptr);
1598b973f2b91343554586da3c952c63c2369acd879whr#endif
159926e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
1600354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	ret = lio_wait4asyncio(method, fd, &aiocbp);
1601b973f2b91343554586da3c952c63c2369acd879whr#endif
1602b973f2b91343554586da3c952c63c2369acd879whr
1603354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/*
1604354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * If there was an error waiting for async i/o to complete,
1605354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * return the error value (errno) to the caller.
1606354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * Note: Errormsg should already have been updated.
1607354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 */
1608354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (ret < 0) {
1609354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return ret;
1610354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
1611354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1612354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/*
1613354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * If i/o was not waited for (may not have been completed at this time),
1614354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * return the size that was requested.
1615354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 */
1616354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (ret == 1)
1617354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return size;
1618354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1619354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/*
1620354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * check that async io was successful.
1621354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * Note:  if the there was an system call failure, -errno
1622354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * was returned and Errormsg should already have been updated.
1623354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * If amount i/o was different than size, Errormsg should already
1624354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * have been updated but the actual i/o size if returned.
1625354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 */
162645a8ba0302fa0632410b2f100f92701651dd7a0fvapier
1627b973f2b91343554586da3c952c63c2369acd879whr#ifdef CRAY
1628354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	ret = lio_check_asyncio(io_type, size, &status);
1629b973f2b91343554586da3c952c63c2369acd879whr#endif
163026e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
1631354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	ret = lio_check_asyncio(io_type, size, &aiocbp, method);
1632b973f2b91343554586da3c952c63c2369acd879whr#endif
1633b973f2b91343554586da3c952c63c2369acd879whr
1634354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	return ret;
1635354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao}				/* end of lio_read_buffer */
1636b973f2b91343554586da3c952c63c2369acd879whr
1637ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#if !defined(__sun) && !defined(__hpux) && !defined(_AIX)
1638b973f2b91343554586da3c952c63c2369acd879whr/***********************************************************************
1639b973f2b91343554586da3c952c63c2369acd879whr * This function will check that async io was successful.
1640b973f2b91343554586da3c952c63c2369acd879whr * It can also be used to check sync listio since it uses the
1641b973f2b91343554586da3c952c63c2369acd879whr * same method.
1642b973f2b91343554586da3c952c63c2369acd879whr *
1643b973f2b91343554586da3c952c63c2369acd879whr * Return Values
1644b973f2b91343554586da3c952c63c2369acd879whr *  If status.sw_error is set, -status.sw_error is returned.
1645b973f2b91343554586da3c952c63c2369acd879whr *  Otherwise sw_count's field value is returned.
1646b973f2b91343554586da3c952c63c2369acd879whr *
1647b973f2b91343554586da3c952c63c2369acd879whr * (rrl 04/96)
1648b973f2b91343554586da3c952c63c2369acd879whr ***********************************************************************/
1649b973f2b91343554586da3c952c63c2369acd879whr#ifdef CRAY
165026e07d5ac935b2a1336944aa5288e9151fead61esubrata_modakint lio_check_asyncio(char *io_type, int size, struct iosw *status)
1651ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#elif defined(sgi)
1652354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint lio_check_asyncio(char *io_type, int size, aiocb_t * aiocbp, int method)
165326e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#elif defined(__linux__) && !defined(__UCLIBC__)
1654354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint lio_check_asyncio(char *io_type, int size, struct aiocb *aiocbp, int method)
1655b973f2b91343554586da3c952c63c2369acd879whr{
1656354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int ret;
1657b973f2b91343554586da3c952c63c2369acd879whr
1658b973f2b91343554586da3c952c63c2369acd879whr#ifdef CRAY
1659354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (status->sw_error) {
1660354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(Errormsg,
1661354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			"%s/%d %s, sw_error set = %d %s, sw_count = %d",
1662354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			__FILE__, __LINE__, io_type,
1663354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			status->sw_error, strerror(status->sw_error),
1664354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			status->sw_count);
1665354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return -status->sw_error;
1666354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	} else if (status->sw_count != size) {
1667354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(Errormsg,
1668354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			"%s/%d %s, sw_count not as expected(%d), but actual:%d",
1669354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			__FILE__, __LINE__, io_type, size, status->sw_count);
1670354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	} else if (Debug_level > 1) {
1671354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		printf
1672354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    ("DEBUG %s/%d: %s completed without error (sw_error == 0, sw_count == %d)\n",
1673354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		     __FILE__, __LINE__, io_type, status->sw_count);
1674354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
1675354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1676354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	return status->sw_count;
1677b973f2b91343554586da3c952c63c2369acd879whr
1678b973f2b91343554586da3c952c63c2369acd879whr#else
1679b973f2b91343554586da3c952c63c2369acd879whr
1680354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int cnt = 1;
1681354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1682354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/* The I/O may have been synchronous with signal completion.  It doesn't
1683354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * make sense, but the combination could be generated.  Release the
1684354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * completion signal here otherwise it'll hang around and bite us
1685354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * later.
1686354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 */
1687354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (aiocbp->aio_sigevent.sigev_notify == SIGEV_SIGNAL)
1688354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sigrelse(aiocbp->aio_sigevent.sigev_signo);
1689354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1690354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	ret = aio_error(aiocbp);
1691354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1692354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	while (ret == EINPROGRESS) {
1693354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		ret = aio_error(aiocbp);
1694354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		++cnt;
1695354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
1696354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (cnt > 1) {
1697354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(Errormsg,
1698354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			"%s/%d %s, aio_error had to loop on EINPROGRESS, cnt=%d; random method %#o; sigev_notify=%s",
1699354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			__FILE__, __LINE__, io_type, cnt, method,
1700354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			(aiocbp->aio_sigevent.sigev_notify ==
1701354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 SIGEV_SIGNAL ? "signal" : aiocbp->aio_sigevent.
1702354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 sigev_notify == SIGEV_NONE ? "none" :
1703e6508f8343333b4fe0696cf354e5f0cd7a2289b6mridge#ifdef SIGEV_CALLBACK
1704354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 aiocbp->aio_sigevent.sigev_notify ==
1705354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 SIGEV_CALLBACK ? "callback" :
1706354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif
1707354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 aiocbp->aio_sigevent.sigev_notify ==
1708354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 SIGEV_THREAD ? "thread" : "unknown"));
1709354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return -ret;
1710354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
1711354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1712354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (ret != 0) {
1713354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(Errormsg,
1714354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			"%s/%d %s, aio_error = %d %s; random method %#o",
1715354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			__FILE__, __LINE__, io_type,
1716354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			ret, strerror(ret), method);
1717354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return -ret;
1718354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
1719354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	ret = aio_return(aiocbp);
1720354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (ret != size) {
1721354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(Errormsg,
1722354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			"%s/%d %s, aio_return not as expected(%d), but actual:%d",
1723354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			__FILE__, __LINE__, io_type, size, ret);
1724b973f2b91343554586da3c952c63c2369acd879whr
1725b973f2b91343554586da3c952c63c2369acd879whr#ifdef BUG1_workaround
1726354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (ret == 0) {
1727354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			ret = size;
1728354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (Debug_level > 1) {
1729354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				printf
1730354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    ("WARN %s/%d: %s completed with bug1_workaround (aio_error == 0, aio_return now == %d)\n",
1731354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     __FILE__, __LINE__, io_type, ret);
1732354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			}
1733b973f2b91343554586da3c952c63c2369acd879whr		}
1734b973f2b91343554586da3c952c63c2369acd879whr#endif /* BUG1_workaround */
1735b973f2b91343554586da3c952c63c2369acd879whr
1736354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	} else if (Debug_level > 1) {
1737354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		printf
1738354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    ("DEBUG %s/%d: %s completed without error (aio_error == 0, aio_return == %d)\n",
1739354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		     __FILE__, __LINE__, io_type, ret);
1740354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
1741b973f2b91343554586da3c952c63c2369acd879whr
1742354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	return ret;
1743b973f2b91343554586da3c952c63c2369acd879whr
1744b973f2b91343554586da3c952c63c2369acd879whr#endif
1745354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao}				/* end of lio_check_asyncio */
174626e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#endif
1747b973f2b91343554586da3c952c63c2369acd879whr
1748b973f2b91343554586da3c952c63c2369acd879whr/***********************************************************************
1749b973f2b91343554586da3c952c63c2369acd879whr *
1750b973f2b91343554586da3c952c63c2369acd879whr * This function will wait for async io to complete.
1751b973f2b91343554586da3c952c63c2369acd879whr * If multiple wait methods are specified, the order is predetermined
1752b973f2b91343554586da3c952c63c2369acd879whr * to LIO_WAIT_RECALL,
1753b973f2b91343554586da3c952c63c2369acd879whr * LIO_WAIT_ACTIVE, LIO_WAIT_SIGPAUSE, LIO_WAIT_SIGACTIVE,
1754b973f2b91343554586da3c952c63c2369acd879whr * then LIO_WAIT_NONE.
1755b973f2b91343554586da3c952c63c2369acd879whr *
1756b973f2b91343554586da3c952c63c2369acd879whr * If no wait method was specified the default wait method is: recall(2)
1757b973f2b91343554586da3c952c63c2369acd879whr * or aio_suspend(3), as appropriate.
1758b973f2b91343554586da3c952c63c2369acd879whr *
1759b973f2b91343554586da3c952c63c2369acd879whr * Return Values
1760b973f2b91343554586da3c952c63c2369acd879whr *	<0: errno of failed recall
1761b973f2b91343554586da3c952c63c2369acd879whr *	0 : async io was completed
1762b973f2b91343554586da3c952c63c2369acd879whr *	1 : async was not waited for, io may not have completed.
1763b973f2b91343554586da3c952c63c2369acd879whr *
1764b973f2b91343554586da3c952c63c2369acd879whr * (rrl 04/96)
1765b973f2b91343554586da3c952c63c2369acd879whr ***********************************************************************/
1766b973f2b91343554586da3c952c63c2369acd879whr#ifdef CRAY
176726e07d5ac935b2a1336944aa5288e9151fead61esubrata_modakint lio_wait4asyncio(int method, int fd, struct iosw **statptr)
1768ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#elif defined(sgi)
1769354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint lio_wait4asyncio(int method, int fd, aiocb_t * aiocbp)
177026e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#elif defined(__linux__) && !defined(__UCLIBC__)
1771354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint lio_wait4asyncio(int method, int fd, struct aiocb *aiocbp)
1772b973f2b91343554586da3c952c63c2369acd879whr{
1773354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int cnt;
1774b973f2b91343554586da3c952c63c2369acd879whr#ifdef sgi
1775354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int ret;
1776354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	const aiocb_t *aioary[1];
1777b973f2b91343554586da3c952c63c2369acd879whr#endif
177826e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(__linux__)&& !defined(__UCLIBC__)
1779ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak	int ret;
1780ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak	const struct aiocb *aioary[1];
1781ea37be8bf7db7f9709cf36fce28521071a4dae40subrata_modak#endif
1782b973f2b91343554586da3c952c63c2369acd879whr
1783354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if ((method & LIO_WAIT_RECALL)
178426e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#if defined(sgi) || (defined(__linux__)&& !defined(__UCLIBC__))
1785354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	    || (method & LIO_WAIT_CBSUSPEND)
1786354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	    || (method & LIO_WAIT_SIGSUSPEND)
1787b973f2b91343554586da3c952c63c2369acd879whr#endif
1788354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	    || ((method & LIO_WAIT_TYPES) == 0)) {
1789354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		/*
1790354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * If method has LIO_WAIT_RECALL bit set or method does
1791354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * not have any wait method bits set (default), use recall/aio_suspend.
1792354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 */
1793b973f2b91343554586da3c952c63c2369acd879whr#ifdef CRAY
1794354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level > 2)
1795354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: wait method : recall\n", __FILE__,
1796354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       __LINE__);
1797354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sigon();
1798354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (recall(fd, 1, statptr)) {
1799354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(Errormsg,
1800354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				"%s/%d recall(%d, 1, stat) failed, errno:%d %s",
1801354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				__FILE__, __LINE__, fd, errno, strerror(errno));
1802354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return -errno;
1803354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
1804b973f2b91343554586da3c952c63c2369acd879whr#else
1805354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level > 2)
1806354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf
1807354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ("DEBUG %s/%d: wait method : aio_suspend, sigev_notify=%s\n",
1808354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     __FILE__, __LINE__,
1809354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     (aiocbp->aio_sigevent.sigev_notify ==
1810354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			      SIGEV_SIGNAL ? "signal" : aiocbp->aio_sigevent.
1811354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			      sigev_notify == SIGEV_NONE ? "none" :
1812e6508f8343333b4fe0696cf354e5f0cd7a2289b6mridge#ifdef SIGEV_CALLBACK
1813354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			      aiocbp->aio_sigevent.sigev_notify ==
1814354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			      SIGEV_CALLBACK ? "callback" :
1815354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif
1816354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			      aiocbp->aio_sigevent.sigev_notify ==
1817354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			      SIGEV_THREAD ? "thread" : "unknown"));
1818354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1819354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		aioary[0] = aiocbp;
1820354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		ret = aio_suspend(aioary, 1, NULL);
1821354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if ((ret == -1) && (errno == EINTR)) {
1822354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (aiocbp->aio_sigevent.sigev_notify == SIGEV_SIGNAL) {
1823354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				if (Debug_level > 2) {
1824354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					printf
1825354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    ("DEBUG %s/%d: aio_suspend received EINTR, sigev_notify=SIGEV_SIGNAL -- ok\n",
1826354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					     __FILE__, __LINE__);
1827354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				}
1828354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			} else {
1829354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				sprintf(Errormsg,
1830354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					"%s/%d aio_suspend received EINTR, sigev_notify=%s, not ok\n",
1831354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					__FILE__, __LINE__,
1832354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					(aiocbp->aio_sigevent.sigev_notify ==
1833354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					 SIGEV_SIGNAL ? "signal" : aiocbp->
1834354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					 aio_sigevent.sigev_notify ==
1835354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					 SIGEV_NONE ? "none" :
1836e6508f8343333b4fe0696cf354e5f0cd7a2289b6mridge#ifdef SIGEV_CALLBACK
1837354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					 aiocbp->aio_sigevent.sigev_notify ==
1838354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					 SIGEV_CALLBACK ? "callback" :
1839e6508f8343333b4fe0696cf354e5f0cd7a2289b6mridge#endif
1840354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					 aiocbp->aio_sigevent.sigev_notify ==
1841354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					 SIGEV_THREAD ? "thread" : "unknown"));
1842354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				return -errno;
1843354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			}
1844354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		} else if (ret) {
1845354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(Errormsg,
1846354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				"%s/%d aio_suspend(fildes=%d, aioary, 1, NULL) failed, errno:%d %s",
1847354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				__FILE__, __LINE__, fd, errno, strerror(errno));
1848b973f2b91343554586da3c952c63c2369acd879whr			return -errno;
1849b973f2b91343554586da3c952c63c2369acd879whr		}
1850b973f2b91343554586da3c952c63c2369acd879whr#endif
1851b973f2b91343554586da3c952c63c2369acd879whr
1852354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	} else if (method & LIO_WAIT_ACTIVE) {
1853354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level > 2)
1854354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: wait method : active\n", __FILE__,
1855354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       __LINE__);
1856b973f2b91343554586da3c952c63c2369acd879whr#ifdef CRAY
1857354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sigon();
1858354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		/*
1859354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * loop until sw_flag, sw_count or sw_error field elements
1860354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * change to non-zero.
1861354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 */
1862354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		cnt = 0;
1863354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		while ((*statptr)->sw_flag == 0 &&
1864354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		       (*statptr)->sw_count == 0 && (*statptr)->sw_error == 0) {
1865354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			cnt++;
1866354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
1867b973f2b91343554586da3c952c63c2369acd879whr#else
1868354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		/* loop while aio_error() returns EINPROGRESS */
1869354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		cnt = 0;
1870354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		while (1) {
1871354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			ret = aio_error(aiocbp);
1872354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if ((ret == 0) || (ret != EINPROGRESS)) {
1873354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				break;
1874354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			}
1875354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			++cnt;
1876b973f2b91343554586da3c952c63c2369acd879whr		}
1877b973f2b91343554586da3c952c63c2369acd879whr
1878b973f2b91343554586da3c952c63c2369acd879whr#endif
1879354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level > 5 && cnt && (cnt % 50) == 0)
1880354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: wait active cnt = %d\n",
1881354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       __FILE__, __LINE__, cnt);
1882b973f2b91343554586da3c952c63c2369acd879whr
1883354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	} else if (method & LIO_WAIT_SIGPAUSE) {
1884354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level > 2)
1885354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: wait method : sigpause\n",
1886354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       __FILE__, __LINE__);
1887b973f2b91343554586da3c952c63c2369acd879whr#ifdef sgi
1888354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		/* note: don't do the sigon() for CRAY in this case.  why? -- roehrich 6/11/97 */
1889354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (aiocbp->aio_sigevent.sigev_notify == SIGEV_SIGNAL)
1890354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sigrelse(aiocbp->aio_sigevent.sigev_signo);
1891354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		else {
1892354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: sigev_notify != SIGEV_SIGNAL\n",
1893354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       __FILE__, __LINE__);
1894354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return -1;
1895354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
1896b973f2b91343554586da3c952c63c2369acd879whr#endif
1897354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		pause();
1898b973f2b91343554586da3c952c63c2369acd879whr
1899354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	} else if (method & LIO_WAIT_SIGACTIVE) {
1900354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level > 2)
1901354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: wait method : sigactive\n",
1902354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       __FILE__, __LINE__);
1903b973f2b91343554586da3c952c63c2369acd879whr#ifdef CRAY
1904354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sigon();
1905b973f2b91343554586da3c952c63c2369acd879whr#else
1906354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (aiocbp->aio_sigevent.sigev_notify == SIGEV_SIGNAL)
1907354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sigrelse(aiocbp->aio_sigevent.sigev_signo);
1908354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		else {
1909354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: sigev_notify != SIGEV_SIGNAL\n",
1910354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       __FILE__, __LINE__);
1911354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return -1;
1912354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
1913b973f2b91343554586da3c952c63c2369acd879whr#endif
1914354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		/* loop waiting for signal */
1915354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		while (Received_signal == Rec_signal) {
1916b973f2b91343554586da3c952c63c2369acd879whr#ifdef CRAY
1917354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sigon();
1918b973f2b91343554586da3c952c63c2369acd879whr#else
1919354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sigrelse(aiocbp->aio_sigevent.sigev_signo);
1920b973f2b91343554586da3c952c63c2369acd879whr#endif
1921354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
1922b973f2b91343554586da3c952c63c2369acd879whr
1923354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	} else if (method & LIO_WAIT_NONE) {
1924354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level > 2)
1925354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: wait method : none\n", __FILE__,
1926354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       __LINE__);
1927354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		/* It's broken because the aiocb/iosw is an automatic variable in
1928354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * lio_{read,write}_buffer, so when the function returns and the
1929354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * I/O completes there will be nowhere to write the I/O status.
1930354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * It doesn't cause a problem on unicos--probably because of some
1931354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * compiler quirk, or an accident.  It causes POSIX async I/O
1932354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 * to core dump some threads.   spr/pv 705909.  6/27/97 roehrich
1933354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 */
1934354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(Errormsg,
1935354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			"%s/%d LIO_WAIT_NONE was selected (this is broken)\n",
1936354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			__FILE__, __LINE__);
1937b973f2b91343554586da3c952c63c2369acd879whr#ifdef CRAY
1938354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sigon();
1939b973f2b91343554586da3c952c63c2369acd879whr#endif
1940b973f2b91343554586da3c952c63c2369acd879whr/*        return 1;*/
1941354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return -1;
1942354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	} else {
1943354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (Debug_level > 2)
1944354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("DEBUG %s/%d: no wait method was chosen\n",
1945354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       __FILE__, __LINE__);
1946354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return -1;
1947354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
1948b973f2b91343554586da3c952c63c2369acd879whr
1949354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	return 0;
1950b973f2b91343554586da3c952c63c2369acd879whr
1951354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao}				/* end of lio_wait4asyncio */
1952b973f2b91343554586da3c952c63c2369acd879whr
1953b973f2b91343554586da3c952c63c2369acd879whr#endif /* ifndef linux */
195426e07d5ac935b2a1336944aa5288e9151fead61esubrata_modak#endif
1955b973f2b91343554586da3c952c63c2369acd879whr
1956b973f2b91343554586da3c952c63c2369acd879whr#if UNIT_TEST
1957b973f2b91343554586da3c952c63c2369acd879whr/***********************************************************************
1958b973f2b91343554586da3c952c63c2369acd879whr * The following code is provided as unit test.
1959b973f2b91343554586da3c952c63c2369acd879whr * Just define add "-DUNIT_TEST=1" to the cc line.
196045a8ba0302fa0632410b2f100f92701651dd7a0fvapier *
1961b973f2b91343554586da3c952c63c2369acd879whr * (rrl 04/96)
1962b973f2b91343554586da3c952c63c2369acd879whr ***********************************************************************/
1963b973f2b91343554586da3c952c63c2369acd879whrstruct unit_info_t {
1964354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int method;
1965354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int sig;
1966354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	char *str;
1967354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao} Unit_info[] = {
1968354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{
1969354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	LIO_IO_SYNC, 0, "sync io"}, {
1970354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	LIO_IO_SYNCV, 0, "sync readv/writev"}, {
1971354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	LIO_IO_SYNCP, 0, "sync pread/pwrite"}, {
1972354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	LIO_IO_ASYNC, 0, "async io, def wait"}, {
1973354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	LIO_IO_SLISTIO, 0, "sync listio"}, {
1974354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	LIO_IO_ALISTIO, 0, "async listio, def wait"}, {
1975354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	LIO_IO_ASYNC | LIO_WAIT_ACTIVE, 0, "async active"}, {
1976354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	LIO_IO_ASYNC | LIO_WAIT_RECALL, 0, "async recall/suspend"}, {
1977354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	LIO_IO_ASYNC | LIO_WAIT_SIGPAUSE, SIGUSR1, "async sigpause"}, {
1978354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	LIO_IO_ASYNC | LIO_WAIT_SIGACTIVE, SIGUSR1, "async sigactive"}, {
1979354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	LIO_IO_ALISTIO | LIO_WAIT_ACTIVE, 0, "async listio active"}, {
1980354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	LIO_IO_ALISTIO | LIO_WAIT_RECALL, 0, "async listio recall"}, {
1981354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	LIO_IO_ALISTIO | LIO_WAIT_SIGACTIVE, SIGUSR1, "async listio sigactive"},
1982354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{
1983354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	LIO_IO_ALISTIO | LIO_WAIT_SIGPAUSE, SIGUSR1, "async listio sigpause"},
1984354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{
1985354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	LIO_IO_ASYNC, SIGUSR2, "async io, def wait, sigusr2"}, {
1986354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong GaoLIO_IO_ALISTIO, SIGUSR2, "async listio, def wait, sigusr2"},};
1987354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
1988354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint main(argc, argv)
1989b973f2b91343554586da3c952c63c2369acd879whrint argc;
1990b973f2b91343554586da3c952c63c2369acd879whrchar **argv;
1991b973f2b91343554586da3c952c63c2369acd879whr{
1992354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	extern char *optarg;
1993354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	extern int optind;
1994b973f2b91343554586da3c952c63c2369acd879whr
1995354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int fd;
1996354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	char *err;
1997354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	char buffer[4096];
1998354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int size = 4096;
1999354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int ret;
2000354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int ind;
2001354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int iter = 3;
2002354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int method;
2003354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int exit_status = 0;
2004354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int c;
2005354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int i;
2006354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	char *symbols = NULL;
2007354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int die_on_err = 0;
2008354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
2009354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	while ((c = getopt(argc, argv, "s:di:")) != -1) {
2010354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		switch (c) {
2011354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		case 's':
2012354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			symbols = optarg;
2013354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			break;
2014354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		case 'd':
2015354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			++die_on_err;
2016354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			break;
2017354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		case 'i':
2018354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			iter = atoi(optarg);
2019354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			break;
2020354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
2021354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
2022b973f2b91343554586da3c952c63c2369acd879whr
2023354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if ((fd =
2024354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	     open("unit_test_file", O_CREAT | O_RDWR | O_TRUNC, 0777)) == -1) {
2025354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		perror
2026354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    ("open(unit_test_file, O_CREAT|O_RDWR|O_TRUNC, 0777) failed");
2027b973f2b91343554586da3c952c63c2369acd879whr		exit(1);
2028b973f2b91343554586da3c952c63c2369acd879whr	}
2029b973f2b91343554586da3c952c63c2369acd879whr
2030354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	Debug_level = 9;
2031b973f2b91343554586da3c952c63c2369acd879whr
2032354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (symbols != NULL) {
2033354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if ((method = lio_parse_io_arg2(symbols, &err)) == -1) {
2034354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf
2035354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ("lio_parse_io_arg2(%s, &err) failed, bad token starting at %s\n",
2036354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     symbols, err);
2037354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (die_on_err)
2038354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				exit(1);
2039354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		} else
2040354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("lio_parse_io_arg2(%s, &err) returned %#o\n",
2041354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       symbols, method);
2042354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
2043354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		exit_status = 0;
2044354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		for (ind = 0; ind < iter; ind++) {
2045354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			memset(buffer, 'A', 4096);
2046354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (lseek(fd, 0, 0) == -1) {
2047354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				printf("lseek(fd,0,0), %d, failed, errno %d\n",
2048354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				       __LINE__, errno);
2049354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				++exit_status;
2050354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			}
2051354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if ((ret = lio_write_buffer(fd, method, buffer,
2052354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    size, SIGUSR1, &err,
2053354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    0)) != size) {
2054354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				printf
2055354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    ("lio_write_buffer returned -1, err = %s\n",
2056354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     err);
2057354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			} else
2058354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				printf("lio_write_buffer returned %d\n", ret);
2059354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
2060354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			memset(buffer, 'B', 4096);
2061354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (lseek(fd, 0, 0) == -1) {
2062354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				printf("lseek(fd,0,0), %d, failed, errno %d\n",
2063354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				       __LINE__, errno);
2064354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				++exit_status;
2065354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			}
2066354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if ((ret = lio_read_buffer(fd, method, buffer,
2067354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						   size, SIGUSR2, &err,
2068354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						   0)) != size) {
2069354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				printf
2070354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    ("lio_read_buffer returned -1, err = %s\n",
2071354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     err);
2072354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			} else
2073354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				printf("lio_read_buffer returned %d\n", ret);
2074354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
2075354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			for (i = 0; i < 4096; ++i) {
2076354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				if (buffer[i] != 'A') {
2077354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					printf("  buffer[%d] = %d\n", i,
2078354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					       buffer[i]);
2079354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					++exit_status;
2080354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					break;
2081354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				}
2082354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			}
2083b973f2b91343554586da3c952c63c2369acd879whr
2084354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (exit_status)
2085354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				exit(exit_status);
2086b973f2b91343554586da3c952c63c2369acd879whr
2087354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
2088b973f2b91343554586da3c952c63c2369acd879whr
2089354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		unlink("unit_test_file");
2090354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		exit(0);
2091b973f2b91343554586da3c952c63c2369acd879whr	}
2092b973f2b91343554586da3c952c63c2369acd879whr
2093354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	for (ind = 0; ind < sizeof(Unit_info) / sizeof(struct unit_info_t);
2094354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	     ind++) {
2095b973f2b91343554586da3c952c63c2369acd879whr
2096354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		printf("\n********* write %s ***************\n",
2097354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		       Unit_info[ind].str);
2098354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (lseek(fd, 0, 0) == -1) {
2099354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("lseek(fd,0,0), %d, failed, errno %d\n",
2100354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       __LINE__, errno);
2101354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			++exit_status;
2102354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
2103b973f2b91343554586da3c952c63c2369acd879whr
2104354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		memset(buffer, 'A', 4096);
2105354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if ((ret = lio_write_buffer(fd, Unit_info[ind].method, buffer,
2106354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    size, Unit_info[ind].sig, &err,
2107354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    0)) != size) {
2108354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf
2109354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    (">>>>> lio_write_buffer(fd,0%x,buffer,%d,%d,err,0) returned -1,\n   err = %s\n",
2110354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     Unit_info[ind].method, size, Unit_info[ind].sig,
2111354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     err);
2112b973f2b91343554586da3c952c63c2369acd879whr			++exit_status;
2113903910df985927e941076692964ab88d691c8ccbGarrett Cooper			if (die_on_err)
2114b973f2b91343554586da3c952c63c2369acd879whr				exit(exit_status);
2115354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		} else {
2116354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("lio_write_buffer returned %d\n", ret);
2117b973f2b91343554586da3c952c63c2369acd879whr		}
2118b973f2b91343554586da3c952c63c2369acd879whr
2119354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		printf("\n********* read %s ***************\n",
2120354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		       Unit_info[ind].str);
2121354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (lseek(fd, 0, 0) == -1) {
2122354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("lseek(fd,0,0), %d, failed, errno %d\n",
2123354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       __LINE__, errno);
2124354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			++exit_status;
2125354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
2126354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		memset(buffer, 'B', 4096);
2127354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if ((ret = lio_read_buffer(fd, Unit_info[ind].method, buffer,
2128354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					   size, Unit_info[ind].sig, &err,
2129354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					   0)) != size) {
2130354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf
2131354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    (">>>>> lio_read_buffer(fd,0%x,buffer,%d,%d,err,0) returned -1,\n   err = %s\n",
2132354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     Unit_info[ind].method, size, Unit_info[ind].sig,
2133354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     err);
2134354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			++exit_status;
2135354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (die_on_err)
2136354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				exit(exit_status);
2137354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		} else {
2138354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("lio_read_buffer returned %d\n", ret);
2139354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
2140b973f2b91343554586da3c952c63c2369acd879whr
2141354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		for (i = 0; i < 4096; ++i) {
2142354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (buffer[i] != 'A') {
2143354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				printf("  buffer[%d] = %d\n", i, buffer[i]);
2144354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				++exit_status;
2145354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				if (die_on_err)
2146354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					exit(exit_status);
2147354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				break;
2148354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			}
2149354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
2150354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
2151354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		fflush(stdout);
2152354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		fflush(stderr);
2153354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sleep(1);
2154354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
2155354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
2156b973f2b91343554586da3c952c63c2369acd879whr
2157354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	unlink("unit_test_file");
2158b973f2b91343554586da3c952c63c2369acd879whr
2159354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	exit(exit_status);
2160b973f2b91343554586da3c952c63c2369acd879whr}
21619ef7f2dd2951a5fb970f45ab6cd465c0152f2ed6Garrett Cooper#endif
2162