[dm-devel] [PATCH 15/21] libmultipath: update_bindings_file: use a single write()
Benjamin Marzinski
bmarzins at redhat.com
Wed Sep 6 22:45:15 UTC 2023
On Fri, Sep 01, 2023 at 08:02:28PM +0200, mwilck at suse.com wrote:
> From: Martin Wilck <mwilck at suse.com>
>
> Save code and syscalls by assembling the content in memory first.
> write() may return less bytes written than expected. Deal with it.
>
Reviewed-by: Benjamin Marzinski <bmarzins at redhat.com>
> Signed-off-by: Martin Wilck <mwilck at suse.com>
> ---
> libmultipath/alias.c | 26 +++++++++++++++++---------
> 1 file changed, 17 insertions(+), 9 deletions(-)
>
> diff --git a/libmultipath/alias.c b/libmultipath/alias.c
> index 76d852f..c26f37c 100644
> --- a/libmultipath/alias.c
> +++ b/libmultipath/alias.c
> @@ -118,22 +118,30 @@ static int add_binding(Bindings *bindings, const char *alias, const char *wwid)
> static int write_bindings_file(const Bindings *bindings, int fd)
> {
> struct binding *bnd;
> - STRBUF_ON_STACK(line);
> + STRBUF_ON_STACK(content);
> int i;
> + size_t len;
>
> - if (write(fd, BINDINGS_FILE_HEADER, sizeof(BINDINGS_FILE_HEADER) - 1)
> - != sizeof(BINDINGS_FILE_HEADER) - 1)
> + if (__append_strbuf_str(&content, BINDINGS_FILE_HEADER,
> + sizeof(BINDINGS_FILE_HEADER) - 1) == -1)
> return -1;
>
> vector_foreach_slot(bindings, bnd, i) {
> - int len;
> + if (print_strbuf(&content, "%s %s\n",
> + bnd->alias, bnd->wwid) < 0)
> + return -1;
> + }
> + len = get_strbuf_len(&content);
> + while (len > 0) {
> + ssize_t n = write(fd, get_strbuf_str(&content), len);
>
> - if ((len = print_strbuf(&line, "%s %s\n",
> - bnd->alias, bnd->wwid)) < 0)
> + if (n < 0)
> + return n;
> + else if (n == 0) {
> + condlog(2, "%s: short write", __func__);
> return -1;
> - if (write(fd, get_strbuf_str(&line), len) != len)
> - return -1;
> - truncate_strbuf(&line, 0);
> + }
> + len -= n;
> }
> return 0;
> }
> --
> 2.41.0
More information about the dm-devel
mailing list