From e588b75745a524e41aca72580a9173d0607c8ba0 Mon Sep 17 00:00:00 2001 From: Robert Love Date: Thu, 18 Jun 2009 14:42:11 -0400 Subject: [PATCH] three fixes for sendfile Three fixes for sendfile, mostly related to sending large files from pseudo filesystems: - Fix sendfile for offsets > 300G. This can happen with pseudo filesystems. This happens because the overflow check is using inode->i_sb->s_maxbytes and not the superblock of the backing device's s_maxbytes. For a regular file these are interchangible but for a special file these are different and you want the latter. - Don't compare against the max of the out_inode's superblock. Doesn't make sense. - For pseudo and other filesystems with s_maxbytes set to ~0ULL, max ends up holding a negative number as it is signed. Check for and correct that. Patch is against 2.6.30. Robert From: Mandeep Singh Baines Signed-off-by: Robert Love --- fs/read_write.c | 11 +++++++++-- 1 files changed, 9 insertions(+), 2 deletions(-) diff --git a/fs/read_write.c b/fs/read_write.c index 6c8c55d..b586763 100644 --- a/fs/read_write.c +++ b/fs/read_write.c @@ -835,8 +835,15 @@ static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, goto fput_out; count = retval; - if (!max) - max = min(in_inode->i_sb->s_maxbytes, out_inode->i_sb->s_maxbytes); + if (!max) { + max = in_inode->i_mapping->host->i_sb->s_maxbytes; + /* + * For psuedo filesystems, s_maxbytes is ~0ULL. When converted + * to loff_t, it can go negative. So we check for and fix that. + */ + if (max < 0) + max = LLONG_MAX; + } pos = *ppos; retval = -EINVAL; -- 1.6.2.2