reftable/stack: stop using `write_in_full()`
Similar to the preceding commit, drop our use of `write_in_full()` and implement a new wrapper `reftable_write_full()` that handles this logic for us. This is done to reduce our dependency on the Git library. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Patrick Steinhardt committed
Feb 18, 2025 at 10:20 UTC
e31db89558b7f1d622e5a64cf37779b721099814
1 file changed
+24
-4
reftable/stack.c
+24
-4
@@ -48,6 +48,25 @@ static int stack_fsync(const struct reftable_write_options *opts, int fd)
48
return fsync(fd);
49
}
50
51
+static ssize_t reftable_write_data(int fd, const void *data, size_t size)
52
+{
53
+ size_t total_written = 0;
54
+ const char *p = data;
55
+
56
+ while (total_written < size) {
57
+ ssize_t bytes_written = write(fd, p, size - total_written);
58
+ if (bytes_written < 0 && (errno == EAGAIN || errno == EINTR))
59
+ continue;
60
+ if (bytes_written < 0)
61
+ return REFTABLE_IO_ERROR;
62
+
63
+ total_written += bytes_written;
64
+ p += bytes_written;
65
+ }
66
+
67
+ return total_written;
68
+}
69
+
70
struct fd_writer {
71
const struct reftable_write_options *opts;
72
int fd;
@@ -56,7 +75,7 @@ struct fd_writer {
75
static ssize_t fd_writer_write(void *arg, const void *data, size_t sz)
76
{
77
struct fd_writer *writer = arg;
59
- return write_in_full(writer->fd, data, sz);
78
+ return reftable_write_data(writer->fd, data, sz);
79
}
80
81
static int fd_writer_flush(void *arg)
@@ -784,7 +803,8 @@ int reftable_addition_commit(struct reftable_addition *add)
803
goto done;
804
}
805
787
- err = write_in_full(add->tables_list_lock.fd, table_list.buf, table_list.len);
806
+ err = reftable_write_data(add->tables_list_lock.fd,
807
+ table_list.buf, table_list.len);
808
reftable_buf_release(&table_list);
809
if (err < 0) {
810
err = REFTABLE_IO_ERROR;
@@ -1470,8 +1490,8 @@ static int stack_compact_range(struct reftable_stack *st,
1490
goto done;
1491
}
1492
1473
- err = write_in_full(tables_list_lock.fd,
1474
- tables_list_buf.buf, tables_list_buf.len);
1493
+ err = reftable_write_data(tables_list_lock.fd,
1494
+ tables_list_buf.buf, tables_list_buf.len);
1495
if (err < 0) {
1496
err = REFTABLE_IO_ERROR;
1497
unlink(new_table_path.buf);