Lines Matching full:writer
43 * The buffered writer allows efficient I/O by buffering writes and committing page-sized segments
273 /* Create a buffered writer for an index region starting at offset. */
279 struct buffered_writer *writer; in uds_make_buffered_writer() local
285 result = vdo_allocate(1, struct buffered_writer, "buffered writer", &writer); in uds_make_buffered_writer()
291 *writer = (struct buffered_writer) { in uds_make_buffered_writer()
303 *writer_ptr = writer; in uds_make_buffered_writer()
307 static size_t get_remaining_write_space(struct buffered_writer *writer) in get_remaining_write_space() argument
309 return writer->start + UDS_BLOCK_SIZE - writer->end; in get_remaining_write_space()
312 static int __must_check prepare_next_buffer(struct buffered_writer *writer) in prepare_next_buffer() argument
317 if (writer->block_number >= writer->limit) { in prepare_next_buffer()
318 writer->error = UDS_OUT_OF_RANGE; in prepare_next_buffer()
322 data = dm_bufio_new(writer->client, writer->block_number, &buffer); in prepare_next_buffer()
324 writer->error = -PTR_ERR(data); in prepare_next_buffer()
325 return writer->error; in prepare_next_buffer()
328 writer->buffer = buffer; in prepare_next_buffer()
329 writer->start = data; in prepare_next_buffer()
330 writer->end = data; in prepare_next_buffer()
334 static int flush_previous_buffer(struct buffered_writer *writer) in flush_previous_buffer() argument
338 if (writer->buffer == NULL) in flush_previous_buffer()
339 return writer->error; in flush_previous_buffer()
341 if (writer->error == UDS_SUCCESS) { in flush_previous_buffer()
342 available = get_remaining_write_space(writer); in flush_previous_buffer()
345 memset(writer->end, 0, available); in flush_previous_buffer()
347 dm_bufio_mark_buffer_dirty(writer->buffer); in flush_previous_buffer()
350 dm_bufio_release(writer->buffer); in flush_previous_buffer()
351 writer->buffer = NULL; in flush_previous_buffer()
352 writer->start = NULL; in flush_previous_buffer()
353 writer->end = NULL; in flush_previous_buffer()
354 writer->block_number++; in flush_previous_buffer()
355 return writer->error; in flush_previous_buffer()
358 void uds_free_buffered_writer(struct buffered_writer *writer) in uds_free_buffered_writer() argument
362 if (writer == NULL) in uds_free_buffered_writer()
365 flush_previous_buffer(writer); in uds_free_buffered_writer()
366 result = -dm_bufio_write_dirty_buffers(writer->client); in uds_free_buffered_writer()
370 dm_bufio_client_destroy(writer->client); in uds_free_buffered_writer()
371 uds_put_io_factory(writer->factory); in uds_free_buffered_writer()
372 vdo_free(writer); in uds_free_buffered_writer()
379 int uds_write_to_buffered_writer(struct buffered_writer *writer, const u8 *data, in uds_write_to_buffered_writer() argument
382 int result = writer->error; in uds_write_to_buffered_writer()
386 if (writer->buffer == NULL) { in uds_write_to_buffered_writer()
387 result = prepare_next_buffer(writer); in uds_write_to_buffered_writer()
391 chunk_size = min(length, get_remaining_write_space(writer)); in uds_write_to_buffered_writer()
393 memset(writer->end, 0, chunk_size); in uds_write_to_buffered_writer()
395 memcpy(writer->end, data, chunk_size); in uds_write_to_buffered_writer()
400 writer->end += chunk_size; in uds_write_to_buffered_writer()
402 if (get_remaining_write_space(writer) == 0) in uds_write_to_buffered_writer()
403 result = uds_flush_buffered_writer(writer); in uds_write_to_buffered_writer()
409 int uds_flush_buffered_writer(struct buffered_writer *writer) in uds_flush_buffered_writer() argument
411 if (writer->error != UDS_SUCCESS) in uds_flush_buffered_writer()
412 return writer->error; in uds_flush_buffered_writer()
414 return flush_previous_buffer(writer); in uds_flush_buffered_writer()