mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Robert Love <rlove@google.com>
To: lkml <linux-kernel@vger.kernel.org>, Al Viro <viro@zeniv.linux.org.uk>
Subject: Re: [patch] small sendfile fixes
Date: Mon, 22 Jun 2009 15:04:15 -0400	[thread overview]
Message-ID: <21c5ff280906221204i72bec97awc7469a3db10f5759@mail.gmail.com> (raw)
In-Reply-To: <21c5ff280906221115v302d8b95t4a4ae2df86289056@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 38 bytes --]

And...the actual patch.

      Robert

[-- Attachment #2: sendfile-fix-2.6.30-rlove-1.patch --]
[-- Type: application/octet-stream, Size: 1723 bytes --]

From e588b75745a524e41aca72580a9173d0607c8ba0 Mon Sep 17 00:00:00 2001
From: Robert Love <rlove@dhcp-172-31-205-236.cam.corp.google.com>
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 <msb@google.com>
Signed-off-by: Robert Love <rlove@google.com>

---
 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


      reply	other threads:[~2009-06-22 19:12 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-06-22 18:15 Robert Love
2009-06-22 19:04 ` Robert Love [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=21c5ff280906221204i72bec97awc7469a3db10f5759@mail.gmail.com \
    --to=rlove@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=viro@zeniv.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®