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