// SPDX-License-Identifier: GPL-2.0 /* * Copyright (c) 2000 Silicon Graphics, Inc. * All Rights Reserved. */ /* * Define io syscalls supported by doio */ #define READ 1 #define WRITE 2 #define READA 3 #define WRITEA 4 #define SSREAD 5 #define SSWRITE 6 #define LISTIO 7 #define LREAD 10 /* listio - single stride, single entry */ #define LREADA 11 #define LWRITE 12 #define LWRITEA 13 #define LSREAD 14 /* listio - multi-stride, single entry */ #define LSREADA 15 #define LSWRITE 16 #define LSWRITEA 17 #define LEREAD 18 /* listio - single stride, multiple entry */ #define LEREADA 19 #define LEWRITE 20 #define LEWRITEA 21 /* System Calls */ #define PREAD 100 #define PWRITE 101 #define READV 102 #define WRITEV 103 #define AREAD 104 #define AWRITE 105 #define LLREAD 110 #define LLAREAD 111 #define LLWRITE 112 #define LLAWRITE 113 #define MMAPR 120 #define MMAPW 121 #define RESVSP 122 /* xfsctl(XFS_IOC_RESVSP) */ #define UNRESVSP 123 /* xfsctl(XFS_IOC_UNRESVSP) */ #define FSYNC2 125 /* fsync(2) */ #define FDATASYNC 126 /* fdatasync(2) */ #define DOIO_MAGIC 07116601 /* * Define various user flags (r_uflag field) that io requests can have * specified. */ #define F_WORD_ALIGNED 0001 /* force request to be word aligned */ /* * define various doio exit status's */ #define E_NORMAL 000 /* normal completion */ #define E_USAGE 001 /* cmdline usage error */ #define E_SETUP 002 /* any of a million setup conditions */ #define E_COMPARE 004 /* data compare error from doio child */ #define E_INTERNAL 010 /* various internal errors */ #define E_LOCKD 020 /* lockd startup/timeout errors */ #define E_SIGNAL 040 /* killed by signal */ /* * Define async io completion strategies supported by doio. */ #define A_POLL 1 /* poll iosw for completion */ #define A_SIGNAL 2 /* get signal for completion */ #define A_RECALL 3 /* use recall(2) to wait */ #define A_RECALLA 4 /* use recalla(2) to wait */ #define A_RECALLS 5 /* use recalls(2) to wait */ #define A_SUSPEND 6 /* use aio_suspend(2) to wait */ #define A_CALLBACK 7 /* use a callback signal op. */ /* * Define individual structures for each syscall type. These will all be * unionized into a single io_req structure which io generators fill in and * pass to doio. * * Note: It is VERY important that the r_file, r_oflags, r_offset, and * r_nbytes fields occupy the same record positions in the * read_req, reada_req, write_req, and writea_req structures and * that they have the same type. It is also that r_pattern * has the same type/offset in the write_req and writea_req * structures. * * Since doio.c accesses all information through the r_data * union in io_req, if the above assumptions hold, the above * fields can be accessed without regard to structure type. * This is an allowed assumption in C. */ #define MAX_FNAME_LENGTH 128 struct read_req { char r_file[MAX_FNAME_LENGTH]; int r_oflags; /* open flags */ int r_offset; int r_nbytes; int r_uflags; /* user flags: mem alignment */ int r_aio_strat; /* asynch read completion strategy */ int r_nstrides; /* listio: multiple strides */ int r_nent; /* listio: multiple list entries */ }; struct write_req { char r_file[MAX_FNAME_LENGTH]; int r_oflags; int r_offset; int r_nbytes; char r_pattern; int r_uflags; /* user flags: mem alignment */ int r_aio_strat; /* asynch write completion strategy */ int r_nstrides; /* listio: multiple strides */ int r_nent; /* listio: multiple list entries */ }; struct ssread_req { int r_nbytes; }; struct sswrite_req { int r_nbytes; char r_pattern; }; struct listio_req { char r_file[MAX_FNAME_LENGTH]; int r_cmd; /* LC_START or LC_WAIT */ int r_offset; /* file offset */ int r_opcode; /* LO_READ, or LO_WRITE */ int r_nbytes; /* bytes per stride */ int r_nstrides; /* how many strides to make */ int r_nent; /* how many listreq entries to make */ int r_filestride; /* always 0 for now */ int r_memstride; /* always 0 for now */ char r_pattern; /* for LO_WRITE operations */ int r_oflags; /* open(2) flags */ int r_aio_strat; /* async I/O completion strategy */ int r_uflags; /* user flags: memory alignment */ }; #define rw_req listio_req /* listio is superset of everything */ /* * Main structure for sending a request to doio. Any tools which form IO * for doio must present it using one of these structures. */ struct io_req { int r_type; /* must be one of the #defines above */ int r_magic; /* must be set to DOIO_MAGIC by requestor */ union { struct read_req read; struct write_req write; struct ssread_req ssread; struct sswrite_req sswrite; struct listio_req listio; struct rw_req io; } r_data; };