Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/tools/testing/selftests/kvm/lib/io.c
38235 views
1
// SPDX-License-Identifier: GPL-2.0-only
2
/*
3
* tools/testing/selftests/kvm/lib/io.c
4
*
5
* Copyright (C) 2018, Google LLC.
6
*/
7
8
#include "test_util.h"
9
10
/* Test Write
11
*
12
* A wrapper for write(2), that automatically handles the following
13
* special conditions:
14
*
15
* + Interrupted system call (EINTR)
16
* + Write of less than requested amount
17
* + Non-block return (EAGAIN)
18
*
19
* For each of the above, an additional write is performed to automatically
20
* continue writing the requested data.
21
* There are also many cases where write(2) can return an unexpected
22
* error (e.g. EIO). Such errors cause a TEST_ASSERT failure.
23
*
24
* Note, for function signature compatibility with write(2), this function
25
* returns the number of bytes written, but that value will always be equal
26
* to the number of requested bytes. All other conditions in this and
27
* future enhancements to this function either automatically issue another
28
* write(2) or cause a TEST_ASSERT failure.
29
*
30
* Args:
31
* fd - Opened file descriptor to file to be written.
32
* count - Number of bytes to write.
33
*
34
* Output:
35
* buf - Starting address of data to be written.
36
*
37
* Return:
38
* On success, number of bytes written.
39
* On failure, a TEST_ASSERT failure is caused.
40
*/
41
ssize_t test_write(int fd, const void *buf, size_t count)
42
{
43
ssize_t rc;
44
ssize_t num_written = 0;
45
size_t num_left = count;
46
const char *ptr = buf;
47
48
/* Note: Count of zero is allowed (see "RETURN VALUE" portion of
49
* write(2) manpage for details.
50
*/
51
TEST_ASSERT(count >= 0, "Unexpected count, count: %li", count);
52
53
do {
54
rc = write(fd, ptr, num_left);
55
56
switch (rc) {
57
case -1:
58
TEST_ASSERT(errno == EAGAIN || errno == EINTR,
59
"Unexpected write failure,\n"
60
" rc: %zi errno: %i", rc, errno);
61
continue;
62
63
case 0:
64
TEST_FAIL("Unexpected EOF,\n"
65
" rc: %zi num_written: %zi num_left: %zu",
66
rc, num_written, num_left);
67
break;
68
69
default:
70
TEST_ASSERT(rc >= 0, "Unexpected ret from write,\n"
71
" rc: %zi errno: %i", rc, errno);
72
num_written += rc;
73
num_left -= rc;
74
ptr += rc;
75
break;
76
}
77
} while (num_written < count);
78
79
return num_written;
80
}
81
82
/* Test Read
83
*
84
* A wrapper for read(2), that automatically handles the following
85
* special conditions:
86
*
87
* + Interrupted system call (EINTR)
88
* + Read of less than requested amount
89
* + Non-block return (EAGAIN)
90
*
91
* For each of the above, an additional read is performed to automatically
92
* continue reading the requested data.
93
* There are also many cases where read(2) can return an unexpected
94
* error (e.g. EIO). Such errors cause a TEST_ASSERT failure. Note,
95
* it is expected that the file opened by fd at the current file position
96
* contains at least the number of requested bytes to be read. A TEST_ASSERT
97
* failure is produced if an End-Of-File condition occurs, before all the
98
* data is read. It is the callers responsibility to assure that sufficient
99
* data exists.
100
*
101
* Note, for function signature compatibility with read(2), this function
102
* returns the number of bytes read, but that value will always be equal
103
* to the number of requested bytes. All other conditions in this and
104
* future enhancements to this function either automatically issue another
105
* read(2) or cause a TEST_ASSERT failure.
106
*
107
* Args:
108
* fd - Opened file descriptor to file to be read.
109
* count - Number of bytes to read.
110
*
111
* Output:
112
* buf - Starting address of where to write the bytes read.
113
*
114
* Return:
115
* On success, number of bytes read.
116
* On failure, a TEST_ASSERT failure is caused.
117
*/
118
ssize_t test_read(int fd, void *buf, size_t count)
119
{
120
ssize_t rc;
121
ssize_t num_read = 0;
122
size_t num_left = count;
123
char *ptr = buf;
124
125
/* Note: Count of zero is allowed (see "If count is zero" portion of
126
* read(2) manpage for details.
127
*/
128
TEST_ASSERT(count >= 0, "Unexpected count, count: %li", count);
129
130
do {
131
rc = read(fd, ptr, num_left);
132
133
switch (rc) {
134
case -1:
135
TEST_ASSERT(errno == EAGAIN || errno == EINTR,
136
"Unexpected read failure,\n"
137
" rc: %zi errno: %i", rc, errno);
138
break;
139
140
case 0:
141
TEST_FAIL("Unexpected EOF,\n"
142
" rc: %zi num_read: %zi num_left: %zu",
143
rc, num_read, num_left);
144
break;
145
146
default:
147
TEST_ASSERT(rc > 0, "Unexpected ret from read,\n"
148
" rc: %zi errno: %i", rc, errno);
149
num_read += rc;
150
num_left -= rc;
151
ptr += rc;
152
break;
153
}
154
} while (num_read < count);
155
156
return num_read;
157
}
158
159