10dc076565f772bb1953209fb69ea150b494aaa40robbiew/* 20dc076565f772bb1953209fb69ea150b494aaa40robbiew * Copyright (c) 2004, Bull SA. All rights reserved. 30dc076565f772bb1953209fb69ea150b494aaa40robbiew * Created by: Laurent.Vivier@bull.net 40dc076565f772bb1953209fb69ea150b494aaa40robbiew * This file is licensed under the GPL license. For the full content 52c28215423293e443469a07ae7011135d058b671Garrett Cooper * of this license, see the COPYING file at the top level of this 60dc076565f772bb1953209fb69ea150b494aaa40robbiew * source tree. 70dc076565f772bb1953209fb69ea150b494aaa40robbiew */ 80dc076565f772bb1953209fb69ea150b494aaa40robbiew 90dc076565f772bb1953209fb69ea150b494aaa40robbiew/* 100dc076565f772bb1953209fb69ea150b494aaa40robbiew * assertion: 110dc076565f772bb1953209fb69ea150b494aaa40robbiew * 122c28215423293e443469a07ae7011135d058b671Garrett Cooper * if mode is LIO_NOWAIT, lio_listio() shall return the value zero if 130dc076565f772bb1953209fb69ea150b494aaa40robbiew * operation is successfuly queued. 140dc076565f772bb1953209fb69ea150b494aaa40robbiew * 150dc076565f772bb1953209fb69ea150b494aaa40robbiew * method: 160dc076565f772bb1953209fb69ea150b494aaa40robbiew * 170dc076565f772bb1953209fb69ea150b494aaa40robbiew * - open a file for writing 180dc076565f772bb1953209fb69ea150b494aaa40robbiew * - submit a list of writes to lio_listio in LIO_NOWAIT mode 190dc076565f772bb1953209fb69ea150b494aaa40robbiew * - check that lio_listio returns 0 and operations complete successfully 200dc076565f772bb1953209fb69ea150b494aaa40robbiew * 210dc076565f772bb1953209fb69ea150b494aaa40robbiew */ 220dc076565f772bb1953209fb69ea150b494aaa40robbiew 230dc076565f772bb1953209fb69ea150b494aaa40robbiew#define _XOPEN_SOURCE 600 2480886b520423c015b63cff03082e274147042243Garrett Cooper#include <sys/stat.h> 2580886b520423c015b63cff03082e274147042243Garrett Cooper#include <aio.h> 260dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <errno.h> 2780886b520423c015b63cff03082e274147042243Garrett Cooper#include <fcntl.h> 2880886b520423c015b63cff03082e274147042243Garrett Cooper#include <signal.h> 2980886b520423c015b63cff03082e274147042243Garrett Cooper#include <stdio.h> 300dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdlib.h> 3180886b520423c015b63cff03082e274147042243Garrett Cooper#include <string.h> 3280886b520423c015b63cff03082e274147042243Garrett Cooper#include <unistd.h> 330dc076565f772bb1953209fb69ea150b494aaa40robbiew#include "posixtest.h" 340dc076565f772bb1953209fb69ea150b494aaa40robbiew 350dc076565f772bb1953209fb69ea150b494aaa40robbiew#define TNAME "lio_listio/10-1.c" 360dc076565f772bb1953209fb69ea150b494aaa40robbiew 370dc076565f772bb1953209fb69ea150b494aaa40robbiew#define NUM_AIOCBS 10 380dc076565f772bb1953209fb69ea150b494aaa40robbiew#define BUF_SIZE 1024 390dc076565f772bb1953209fb69ea150b494aaa40robbiew 40354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint received_selected = 0; 41354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint received_all = 0; 420dc076565f772bb1953209fb69ea150b494aaa40robbiew 43354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid sigrt1_handler(int signum, siginfo_t * info, void *context) 440dc076565f772bb1953209fb69ea150b494aaa40robbiew{ 450dc076565f772bb1953209fb69ea150b494aaa40robbiew received_selected = info->si_value.sival_int; 460dc076565f772bb1953209fb69ea150b494aaa40robbiew} 470dc076565f772bb1953209fb69ea150b494aaa40robbiew 48354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid sigrt2_handler(int signum, siginfo_t * info, void *context) 490dc076565f772bb1953209fb69ea150b494aaa40robbiew{ 500dc076565f772bb1953209fb69ea150b494aaa40robbiew received_all = 1; 510dc076565f772bb1953209fb69ea150b494aaa40robbiew} 520dc076565f772bb1953209fb69ea150b494aaa40robbiew 534ca2bbdcd3003f3c8df4e6129e9c7b2bd1514f87Cyril Hrubisint main(void) 540dc076565f772bb1953209fb69ea150b494aaa40robbiew{ 550dc076565f772bb1953209fb69ea150b494aaa40robbiew char tmpfname[256]; 560dc076565f772bb1953209fb69ea150b494aaa40robbiew int fd; 570dc076565f772bb1953209fb69ea150b494aaa40robbiew 580dc076565f772bb1953209fb69ea150b494aaa40robbiew struct aiocb *aiocbs[NUM_AIOCBS]; 590dc076565f772bb1953209fb69ea150b494aaa40robbiew char *bufs; 600dc076565f772bb1953209fb69ea150b494aaa40robbiew struct sigaction action; 610dc076565f772bb1953209fb69ea150b494aaa40robbiew struct sigevent event; 620dc076565f772bb1953209fb69ea150b494aaa40robbiew int errors = 0; 630dc076565f772bb1953209fb69ea150b494aaa40robbiew int ret; 640dc076565f772bb1953209fb69ea150b494aaa40robbiew int err; 650dc076565f772bb1953209fb69ea150b494aaa40robbiew int i; 660dc076565f772bb1953209fb69ea150b494aaa40robbiew 67264074b49e13b99960b37be37fd3731e525b5461Garrett Cooper if (sysconf(_SC_ASYNCHRONOUS_IO) < 200112L) 686b6f81b02cbd9b4c7507af6b6aec6980c2eb257dGarrett Cooper exit(PTS_UNSUPPORTED); 690dc076565f772bb1953209fb69ea150b494aaa40robbiew 702c28215423293e443469a07ae7011135d058b671Garrett Cooper snprintf(tmpfname, sizeof(tmpfname), "/tmp/pts_lio_listio_10_1_%d", 71354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao getpid()); 720dc076565f772bb1953209fb69ea150b494aaa40robbiew unlink(tmpfname); 730dc076565f772bb1953209fb69ea150b494aaa40robbiew 740dc076565f772bb1953209fb69ea150b494aaa40robbiew fd = open(tmpfname, O_CREAT | O_RDWR | O_EXCL, S_IRUSR | S_IWUSR); 750dc076565f772bb1953209fb69ea150b494aaa40robbiew 760dc076565f772bb1953209fb69ea150b494aaa40robbiew if (fd == -1) { 77354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf(TNAME " Error at open(): %s\n", strerror(errno)); 780dc076565f772bb1953209fb69ea150b494aaa40robbiew exit(PTS_UNRESOLVED); 790dc076565f772bb1953209fb69ea150b494aaa40robbiew } 800dc076565f772bb1953209fb69ea150b494aaa40robbiew 810dc076565f772bb1953209fb69ea150b494aaa40robbiew unlink(tmpfname); 820dc076565f772bb1953209fb69ea150b494aaa40robbiew 83d218f348c12b42a78fa0306d9a033bfa4f67238bCyril Hrubis bufs = malloc(NUM_AIOCBS * BUF_SIZE); 840dc076565f772bb1953209fb69ea150b494aaa40robbiew 850dc076565f772bb1953209fb69ea150b494aaa40robbiew if (bufs == NULL) { 86354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf(TNAME " Error at malloc(): %s\n", strerror(errno)); 87354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao close(fd); 880dc076565f772bb1953209fb69ea150b494aaa40robbiew exit(PTS_UNRESOLVED); 890dc076565f772bb1953209fb69ea150b494aaa40robbiew } 900dc076565f772bb1953209fb69ea150b494aaa40robbiew 910dc076565f772bb1953209fb69ea150b494aaa40robbiew /* Queue up a bunch of aio writes */ 920dc076565f772bb1953209fb69ea150b494aaa40robbiew for (i = 0; i < NUM_AIOCBS; i++) { 930dc076565f772bb1953209fb69ea150b494aaa40robbiew 94d218f348c12b42a78fa0306d9a033bfa4f67238bCyril Hrubis aiocbs[i] = malloc(sizeof(struct aiocb)); 950dc076565f772bb1953209fb69ea150b494aaa40robbiew memset(aiocbs[i], 0, sizeof(struct aiocb)); 960dc076565f772bb1953209fb69ea150b494aaa40robbiew 970dc076565f772bb1953209fb69ea150b494aaa40robbiew aiocbs[i]->aio_fildes = fd; 980dc076565f772bb1953209fb69ea150b494aaa40robbiew aiocbs[i]->aio_offset = 0; 99354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao aiocbs[i]->aio_buf = &bufs[i * BUF_SIZE]; 1000dc076565f772bb1953209fb69ea150b494aaa40robbiew aiocbs[i]->aio_nbytes = BUF_SIZE; 1010dc076565f772bb1953209fb69ea150b494aaa40robbiew aiocbs[i]->aio_lio_opcode = LIO_WRITE; 1020dc076565f772bb1953209fb69ea150b494aaa40robbiew 1030dc076565f772bb1953209fb69ea150b494aaa40robbiew /* Use SIRTMIN+1 for individual completions */ 1040dc076565f772bb1953209fb69ea150b494aaa40robbiew aiocbs[i]->aio_sigevent.sigev_notify = SIGEV_SIGNAL; 105354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao aiocbs[i]->aio_sigevent.sigev_signo = SIGRTMIN + 1; 1060dc076565f772bb1953209fb69ea150b494aaa40robbiew aiocbs[i]->aio_sigevent.sigev_value.sival_int = i; 1070dc076565f772bb1953209fb69ea150b494aaa40robbiew } 1080dc076565f772bb1953209fb69ea150b494aaa40robbiew 1090dc076565f772bb1953209fb69ea150b494aaa40robbiew /* Use SIGRTMIN+2 for list completion */ 1100dc076565f772bb1953209fb69ea150b494aaa40robbiew event.sigev_notify = SIGEV_SIGNAL; 111354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao event.sigev_signo = SIGRTMIN + 2; 1120dc076565f772bb1953209fb69ea150b494aaa40robbiew event.sigev_value.sival_ptr = NULL; 1130dc076565f772bb1953209fb69ea150b494aaa40robbiew 1140dc076565f772bb1953209fb69ea150b494aaa40robbiew /* Setup handler for individual operation completion */ 1150dc076565f772bb1953209fb69ea150b494aaa40robbiew action.sa_sigaction = sigrt1_handler; 1160dc076565f772bb1953209fb69ea150b494aaa40robbiew sigemptyset(&action.sa_mask); 117354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao action.sa_flags = SA_SIGINFO | SA_RESTART; 118354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sigaction(SIGRTMIN + 1, &action, NULL); 1190dc076565f772bb1953209fb69ea150b494aaa40robbiew 1200dc076565f772bb1953209fb69ea150b494aaa40robbiew /* Setup handler for list completion */ 1210dc076565f772bb1953209fb69ea150b494aaa40robbiew action.sa_sigaction = sigrt2_handler; 1220dc076565f772bb1953209fb69ea150b494aaa40robbiew sigemptyset(&action.sa_mask); 123354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao action.sa_flags = SA_SIGINFO | SA_RESTART; 124354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sigaction(SIGRTMIN + 2, &action, NULL); 1250dc076565f772bb1953209fb69ea150b494aaa40robbiew 1260dc076565f772bb1953209fb69ea150b494aaa40robbiew /* Submit request list */ 1270dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = lio_listio(LIO_NOWAIT, aiocbs, NUM_AIOCBS, &event); 1280dc076565f772bb1953209fb69ea150b494aaa40robbiew 1290dc076565f772bb1953209fb69ea150b494aaa40robbiew if (ret) { 130354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf(TNAME " Error at lio_listio() %d: %s\n", errno, 131354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao strerror(errno)); 132354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao for (i = 0; i < NUM_AIOCBS; i++) 133354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao free(aiocbs[i]); 134354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao free(bufs); 135354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao close(fd); 136354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao exit(PTS_FAIL); 1370dc076565f772bb1953209fb69ea150b494aaa40robbiew } 1380dc076565f772bb1953209fb69ea150b494aaa40robbiew 1390dc076565f772bb1953209fb69ea150b494aaa40robbiew while (received_all == 0) 140354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sleep(1); 1410dc076565f772bb1953209fb69ea150b494aaa40robbiew 1420dc076565f772bb1953209fb69ea150b494aaa40robbiew /* Check return code and free things */ 1430dc076565f772bb1953209fb69ea150b494aaa40robbiew for (i = 0; i < NUM_AIOCBS; i++) { 144354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao err = aio_error(aiocbs[i]); 1450dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = aio_return(aiocbs[i]); 1460dc076565f772bb1953209fb69ea150b494aaa40robbiew 1470dc076565f772bb1953209fb69ea150b494aaa40robbiew if ((err != 0) && (ret != BUF_SIZE)) { 148354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf(TNAME " req %d: error = %d - return = %d\n", i, 149354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao err, ret); 1500dc076565f772bb1953209fb69ea150b494aaa40robbiew errors++; 1510dc076565f772bb1953209fb69ea150b494aaa40robbiew } 1520dc076565f772bb1953209fb69ea150b494aaa40robbiew 153354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao free(aiocbs[i]); 1540dc076565f772bb1953209fb69ea150b494aaa40robbiew } 1550dc076565f772bb1953209fb69ea150b494aaa40robbiew 156354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao free(bufs); 1570dc076565f772bb1953209fb69ea150b494aaa40robbiew 1580dc076565f772bb1953209fb69ea150b494aaa40robbiew close(fd); 1590dc076565f772bb1953209fb69ea150b494aaa40robbiew 1600dc076565f772bb1953209fb69ea150b494aaa40robbiew if (errors != 0) 161354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao exit(PTS_FAIL); 1620dc076565f772bb1953209fb69ea150b494aaa40robbiew 163354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf(TNAME " PASSED\n"); 1640dc076565f772bb1953209fb69ea150b494aaa40robbiew 1650dc076565f772bb1953209fb69ea150b494aaa40robbiew return PTS_PASS; 166ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman} 167