Hi guys, Friendly ping. Just checking in on this patch since I haven't heard back so far and this is a blocker in some scenarios where we're using btrfs.
Thanks! Christian On Fri, Mar 24, 2017 at 04:00:57PM +0100, Christian Brauner wrote: > The old check here tried to ensure that empty streams are not considered > valid. > The old check however, will always fail when only one run through the while(1) > loop is needed and honor_end_cmd is set. So this: > > btrfs send /some/subvol | btrfs receive -e /some/ > > will consistently fail because -e causes honor_cmd_to be set and > btrfs_read_and_process_send_stream() to correctly return 1. So the command > will > be successful but btrfs receive will error out because the send - receive > concluded in one run through the while(1) loop. > > If we want to exclude empty streams we need a way to tell the difference > between > btrfs_read_and_process_send_stream() returning 1 because read_buf() did not > detect any data and read_and_process_cmd() returning 1 because honor_end_cmd > was > set. Without introducing too many changes the best way to me seems to have > btrfs_read_and_process_send_stream() return -ENODATA in the first case. The > rest > stays the same. We can then check for -ENODATA in do_receive() and report a > proper error in this case. This should also be backwards compatible to > previous > versions of btrfs receive. They will fail on empty streams because a negative > value is returned. The only thing that they will lack is a nice error message. > > Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> > --- > cmds-receive.c | 13 +++++-------- > send-stream.c | 2 +- > 2 files changed, 6 insertions(+), 9 deletions(-) > > diff --git a/cmds-receive.c b/cmds-receive.c > index 6cf22637..b59f00e4 100644 > --- a/cmds-receive.c > +++ b/cmds-receive.c > @@ -1091,7 +1091,6 @@ static int do_receive(struct btrfs_receive *rctx, const > char *tomnt, > char *dest_dir_full_path; > char root_subvol_path[PATH_MAX]; > int end = 0; > - int count; > > dest_dir_full_path = realpath(tomnt, NULL); > if (!dest_dir_full_path) { > @@ -1186,7 +1185,6 @@ static int do_receive(struct btrfs_receive *rctx, const > char *tomnt, > if (ret < 0) > goto out; > > - count = 0; > while (!end) { > if (rctx->cached_capabilities_len) { > if (g_verbose >= 3) > @@ -1200,16 +1198,15 @@ static int do_receive(struct btrfs_receive *rctx, > const char *tomnt, > rctx, > rctx->honor_end_cmd, > max_errors); > - if (ret < 0) > - goto out; > - /* Empty stream is invalid */ > - if (ret && count == 0) { > + if (ret < 0 && ret == -ENODATA) { > + /* Empty stream is invalid */ > error("empty stream is not considered valid"); > ret = -EINVAL; > goto out; > + } else if (ret < 0) { > + goto out; > } > - count++; > - if (ret) > + if (ret > 0) > end = 1; > > close_inode_for_write(rctx); > diff --git a/send-stream.c b/send-stream.c > index 5a028cd9..78f2571a 100644 > --- a/send-stream.c > +++ b/send-stream.c > @@ -492,7 +492,7 @@ int btrfs_read_and_process_send_stream(int fd, > if (ret < 0) > goto out; > if (ret) { > - ret = 1; > + ret = -ENODATA; > goto out; > } > > -- > 2.11.0 > -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html