]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/fuse/file.c
fuse: use true,false for bool variable
[linux.git] / fs / fuse / file.c
index db48a5cf862095160179b7d205c7c8cd8c046c24..9d67b830fb7a25445bfd4f930c6ef7fa66fbbd1e 100644 (file)
@@ -713,8 +713,10 @@ static ssize_t fuse_async_req_send(struct fuse_conn *fc,
 
        ia->ap.args.end = fuse_aio_complete_req;
        err = fuse_simple_background(fc, &ia->ap.args, GFP_KERNEL);
+       if (err)
+               fuse_aio_complete_req(fc, &ia->ap.args, err);
 
-       return err ?: num_bytes;
+       return num_bytes;
 }
 
 static ssize_t fuse_send_read(struct fuse_io_args *ia, loff_t pos, size_t count,
@@ -801,6 +803,10 @@ static int fuse_do_readpage(struct file *file, struct page *page)
 
        attr_ver = fuse_get_attr_version(fc);
 
+       /* Don't overflow end offset */
+       if (pos + (desc.length - 1) == LLONG_MAX)
+               desc.length--;
+
        fuse_read_args_fill(&ia, file, pos, desc.length, FUSE_READ);
        res = fuse_simple_request(fc, &ia.ap.args);
        if (res < 0)
@@ -880,11 +886,20 @@ static void fuse_send_readpages(struct fuse_io_args *ia, struct file *file)
        struct fuse_args_pages *ap = &ia->ap;
        loff_t pos = page_offset(ap->pages[0]);
        size_t count = ap->num_pages << PAGE_SHIFT;
+       ssize_t res;
        int err;
 
        ap->args.out_pages = true;
        ap->args.page_zeroing = true;
        ap->args.page_replace = true;
+
+       /* Don't overflow end offset */
+       if (pos + (count - 1) == LLONG_MAX) {
+               count--;
+               ap->descs[ap->num_pages - 1].length--;
+       }
+       WARN_ON((loff_t) (pos + count) < 0);
+
        fuse_read_args_fill(ia, file, pos, count, FUSE_READ);
        ia->read.attr_ver = fuse_get_attr_version(fc);
        if (fc->async_read) {
@@ -894,7 +909,8 @@ static void fuse_send_readpages(struct fuse_io_args *ia, struct file *file)
                if (!err)
                        return;
        } else {
-               err = fuse_simple_request(fc, &ap->args);
+               res = fuse_simple_request(fc, &ap->args);
+               err = res < 0 ? res : 0;
        }
        fuse_readpages_end(fc, &ap->args, err);
 }
@@ -1096,6 +1112,8 @@ static ssize_t fuse_send_write_pages(struct fuse_io_args *ia,
        ia->write.in.flags = fuse_write_flags(iocb);
 
        err = fuse_simple_request(fc, &ap->args);
+       if (!err && ia->write.out.size > count)
+               err = -EIO;
 
        offset = ap->descs[0].offset;
        count = ia->write.out.size;
@@ -1391,9 +1409,9 @@ static int fuse_get_user_pages(struct fuse_args_pages *ap, struct iov_iter *ii,
        }
 
        if (write)
-               ap->args.in_pages = 1;
+               ap->args.in_pages = true;
        else
-               ap->args.out_pages = 1;
+               ap->args.out_pages = true;
 
        *nbytesp = nbytes;
 
@@ -1459,6 +1477,7 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter,
                }
                ia = NULL;
                if (nres < 0) {
+                       iov_iter_revert(iter, nbytes);
                        err = nres;
                        break;
                }
@@ -1467,8 +1486,10 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter,
                count -= nres;
                res += nres;
                pos += nres;
-               if (nres != nbytes)
+               if (nres != nbytes) {
+                       iov_iter_revert(iter, nbytes - nres);
                        break;
+               }
                if (count) {
                        max_pages = iov_iter_npages(iter, fc->max_pages);
                        ia = fuse_io_alloc(io, max_pages);