Hi. Adding the bug reporter, Nazar for the discussion (as I'm not familiar with send/receive feature/code).
---- Cheers, Lakshmipathi.G http://www.giis.co.in http://www.webminal.org On Fri, Apr 28, 2017 at 3:25 PM, Christian Brauner <christian.brau...@canonical.com> wrote: > > Hi, > > On Fri, Apr 28, 2017 at 02:55:31PM +0530, Lakshmipathi.G wrote: > > Seems like user reported an issue with this patch. please check > > https://bugzilla.kernel.org/show_bug.cgi?id=195597 > > I can take a look. What I'm wondering about is why it fails only in the HDD > to SSD case. If -ENODATA is returned with this patch it should mean that there > was no header data. So is the user sure that this doesn't indicate a valid > error? > > Christian > > > > > ---- > > Cheers, > > Lakshmipathi.G > > > > > > On Tue, Apr 4, 2017 at 1:51 AM, Christian Brauner < > > christian.brau...@ubuntu.com> 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> > > > --- > > > Changelog: 2017-04-03 > > > - no changes > > > --- > > > 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 > -- 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