|
@@ -356,14 +356,14 @@ lo_direct_splice_actor(struct pipe_inode_info *pipe, struct splice_desc *sd)
|
|
|
return __splice_from_pipe(pipe, sd, lo_splice_actor);
|
|
|
}
|
|
|
|
|
|
-static int
|
|
|
+static ssize_t
|
|
|
do_lo_receive(struct loop_device *lo,
|
|
|
struct bio_vec *bvec, int bsize, loff_t pos)
|
|
|
{
|
|
|
struct lo_read_data cookie;
|
|
|
struct splice_desc sd;
|
|
|
struct file *file;
|
|
|
- long retval;
|
|
|
+ ssize_t retval;
|
|
|
|
|
|
cookie.lo = lo;
|
|
|
cookie.page = bvec->bv_page;
|
|
@@ -379,26 +379,28 @@ do_lo_receive(struct loop_device *lo,
|
|
|
file = lo->lo_backing_file;
|
|
|
retval = splice_direct_to_actor(file, &sd, lo_direct_splice_actor);
|
|
|
|
|
|
- if (retval < 0)
|
|
|
- return retval;
|
|
|
- if (retval != bvec->bv_len)
|
|
|
- return -EIO;
|
|
|
- return 0;
|
|
|
+ return retval;
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
lo_receive(struct loop_device *lo, struct bio *bio, int bsize, loff_t pos)
|
|
|
{
|
|
|
struct bio_vec *bvec;
|
|
|
- int i, ret = 0;
|
|
|
+ ssize_t s;
|
|
|
+ int i;
|
|
|
|
|
|
bio_for_each_segment(bvec, bio, i) {
|
|
|
- ret = do_lo_receive(lo, bvec, bsize, pos);
|
|
|
- if (ret < 0)
|
|
|
+ s = do_lo_receive(lo, bvec, bsize, pos);
|
|
|
+ if (s < 0)
|
|
|
+ return s;
|
|
|
+
|
|
|
+ if (s != bvec->bv_len) {
|
|
|
+ zero_fill_bio(bio);
|
|
|
break;
|
|
|
+ }
|
|
|
pos += bvec->bv_len;
|
|
|
}
|
|
|
- return ret;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static int do_bio_filebacked(struct loop_device *lo, struct bio *bio)
|