btrfs-progs: receiv: fail on first -ENODATA only

Returning -ENODATA is only considered invalid on the first run of the
loop where we would detect entirely empty stream.

The enhanced test misc-tests/018-recv-end-of-stream now passes.

Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=195597
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Christian Brauner 2017-04-29 23:54:05 +02:00 committed by David Sterba
parent f8c82394c4
commit 9845d93bb2

View File

@ -1091,6 +1091,7 @@ static int do_receive(struct btrfs_receive *rctx, const char *tomnt,
char *dest_dir_full_path; char *dest_dir_full_path;
char root_subvol_path[PATH_MAX]; char root_subvol_path[PATH_MAX];
int end = 0; int end = 0;
int iterations = 0;
dest_dir_full_path = realpath(tomnt, NULL); dest_dir_full_path = realpath(tomnt, NULL);
if (!dest_dir_full_path) { if (!dest_dir_full_path) {
@ -1198,13 +1199,18 @@ static int do_receive(struct btrfs_receive *rctx, const char *tomnt,
rctx, rctx,
rctx->honor_end_cmd, rctx->honor_end_cmd,
max_errors); max_errors);
if (ret < 0 && ret == -ENODATA) { if (ret < 0) {
if (ret != -ENODATA)
goto out;
/* Empty stream is invalid */ /* Empty stream is invalid */
if (iterations == 0) {
error("empty stream is not considered valid"); error("empty stream is not considered valid");
ret = -EINVAL; ret = -EINVAL;
goto out; goto out;
} else if (ret < 0) { }
goto out;
ret = 1;
} }
if (ret > 0) if (ret > 0)
end = 1; end = 1;
@ -1213,6 +1219,8 @@ static int do_receive(struct btrfs_receive *rctx, const char *tomnt,
ret = finish_subvol(rctx); ret = finish_subvol(rctx);
if (ret < 0) if (ret < 0)
goto out; goto out;
iterations++;
} }
ret = 0; ret = 0;