Lines Matching defs:reader

29 /* The buffered reader allows efficient I/O by reading page-sized segments into a buffer. */
112 static void read_ahead(struct buffered_reader *reader, sector_t block_number)
114 if (block_number < reader->limit) {
116 reader->limit - block_number);
118 dm_bufio_prefetch(reader->client, block_number, read_ahead);
122 void uds_free_buffered_reader(struct buffered_reader *reader)
124 if (reader == NULL)
127 if (reader->buffer != NULL)
128 dm_bufio_release(reader->buffer);
130 dm_bufio_client_destroy(reader->client);
131 uds_put_io_factory(reader->factory);
132 vdo_free(reader);
135 /* Create a buffered reader for an index region starting at offset. */
141 struct buffered_reader *reader = NULL;
147 result = vdo_allocate(1, struct buffered_reader, "buffered reader", &reader);
153 *reader = (struct buffered_reader) {
163 read_ahead(reader, 0);
165 *reader_ptr = reader;
169 static int position_reader(struct buffered_reader *reader, sector_t block_number,
175 if ((reader->end == NULL) || (block_number != reader->block_number)) {
176 if (block_number >= reader->limit)
179 if (reader->buffer != NULL)
180 dm_bufio_release(vdo_forget(reader->buffer));
182 data = dm_bufio_read(reader->client, block_number, &buffer);
186 reader->buffer = buffer;
187 reader->start = data;
188 if (block_number == reader->block_number + 1)
189 read_ahead(reader, block_number + 1);
192 reader->block_number = block_number;
193 reader->end = reader->start + offset;
197 static size_t bytes_remaining_in_read_buffer(struct buffered_reader *reader)
199 return (reader->end == NULL) ? 0 : reader->start + UDS_BLOCK_SIZE - reader->end;
202 static int reset_reader(struct buffered_reader *reader)
206 if (bytes_remaining_in_read_buffer(reader) > 0)
209 block_number = reader->block_number;
210 if (reader->end != NULL)
213 return position_reader(reader, block_number, 0);
216 int uds_read_from_buffered_reader(struct buffered_reader *reader, u8 *data,
223 result = reset_reader(reader);
227 chunk_size = min(length, bytes_remaining_in_read_buffer(reader));
228 memcpy(data, reader->end, chunk_size);
231 reader->end += chunk_size;
238 * Verify that the next data on the reader matches the required value. If the value matches, the
239 * matching contents are consumed. If the value does not match, the reader state is unchanged.
241 int uds_verify_buffered_data(struct buffered_reader *reader, const u8 *value,
246 sector_t start_block_number = reader->block_number;
247 int start_offset = reader->end - reader->start;
250 result = reset_reader(reader);
256 chunk_size = min(length, bytes_remaining_in_read_buffer(reader));
257 if (memcmp(value, reader->end, chunk_size) != 0) {
264 reader->end += chunk_size;
268 position_reader(reader, start_block_number, start_offset);