From mboxrd@z Thu Jan 1 00:00:00 1970 From: akpm@linux-foundation.org Subject: [patch 09/12] sendfile: several fixes Date: Thu, 06 Aug 2009 16:10:15 -0700 Message-ID: <200908062310.n76NAFKE012978@imap1.linux-foundation.org> Cc: linux-fsdevel@vger.kernel.org, akpm@linux-foundation.org, msb@google.com, rlove@google.com To: viro@zeniv.linux.org.uk Return-path: Received: from smtp1.linux-foundation.org ([140.211.169.13]:45143 "EHLO smtp1.linux-foundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756902AbZHFXSv (ORCPT ); Thu, 6 Aug 2009 19:18:51 -0400 Sender: linux-fsdevel-owner@vger.kernel.org List-ID: From: Mandeep Singh Baines 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. Signed-off-by: Robert Love Cc: Al Viro Signed-off-by: Andrew Morton --- fs/read_write.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff -puN fs/read_write.c~sendfile-several-fixes fs/read_write.c --- a/fs/read_write.c~sendfile-several-fixes +++ a/fs/read_write.c @@ -835,8 +835,15 @@ static ssize_t do_sendfile(int out_fd, i 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; _