From: Pavel Emelyanov <xe...@openvz.org>

A helper which gets called when read reports less bytes than was requested.
See patch #6 (trust kernel i_size only) for details.

Signed-off-by: Maxim Patlasov <mpatla...@parallels.com>
Signed-off-by: Pavel Emelyanov <xe...@openvz.org>
---
 fs/fuse/file.c |   21 +++++++++++++--------
 1 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index 6b6d307..ea70814 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -653,6 +653,15 @@ static void fuse_read_update_size(struct inode *inode, 
loff_t size,
        spin_unlock(&fc->lock);
 }
 
+static void fuse_short_read(struct fuse_req *req, struct inode *inode,
+                           u64 attr_ver)
+{
+       size_t num_read = req->out.args[0].size;
+
+       loff_t pos = page_offset(req->pages[0]) + num_read;
+       fuse_read_update_size(inode, pos, attr_ver);
+}
+
 static int fuse_readpage(struct file *file, struct page *page)
 {
        struct fuse_io_priv io = { .async = 0, .file = file };
@@ -690,18 +699,18 @@ static int fuse_readpage(struct file *file, struct page 
*page)
        req->page_descs[0].length = count;
        num_read = fuse_send_read(req, &io, pos, count, NULL);
        err = req->out.h.error;
-       fuse_put_request(fc, req);
 
        if (!err) {
                /*
                 * Short read means EOF.  If file size is larger, truncate it
                 */
                if (num_read < count)
-                       fuse_read_update_size(inode, pos + num_read, attr_ver);
+                       fuse_short_read(req, inode, attr_ver);
 
                SetPageUptodate(page);
        }
 
+       fuse_put_request(fc, req);
        fuse_invalidate_attr(inode); /* atime changed */
  out:
        unlock_page(page);
@@ -724,13 +733,9 @@ static void fuse_readpages_end(struct fuse_conn *fc, 
struct fuse_req *req)
                /*
                 * Short read means EOF. If file size is larger, truncate it
                 */
-               if (!req->out.h.error && num_read < count) {
-                       loff_t pos;
+               if (!req->out.h.error && num_read < count)
+                       fuse_short_read(req, inode, req->misc.read.attr_ver);
 
-                       pos = page_offset(req->pages[0]) + num_read;
-                       fuse_read_update_size(inode, pos,
-                                             req->misc.read.attr_ver);
-               }
                fuse_invalidate_attr(inode); /* atime changed */
        }
 

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to