git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v6 5/6] Change copy_fd() to not close input fd

From
Steffen Prohaska <prohaska@zib.de>
Date
Aug 28, 2014, 15:37 UTC
Message-ID
<3947B7A7-98D0-4313-B7D7-D5EB35427E56@zib.de>
In-Reply-To
<20140826182905.GD17546@peff.net>
On Aug 26, 2014, at 8:29 PM, Jeff King <peff@peff.net> wrote:
Show 46 quoted lines
> On Tue, Aug 26, 2014 at 05:23:24PM +0200, Steffen Prohaska wrote:
> 
>> The caller opened the fd, so it should be responsible for closing it.
>> 
>> Signed-off-by: Steffen Prohaska <prohaska@zib.de>
>> ---
>> copy.c     | 5 +----
>> lockfile.c | 3 +++
>> 2 files changed, 4 insertions(+), 4 deletions(-)
>> 
>> diff --git a/copy.c b/copy.c
>> index a7f58fd..d0a1d82 100644
>> --- a/copy.c
>> +++ b/copy.c
>> @@ -10,7 +10,6 @@ int copy_fd(int ifd, int ofd)
>> 			break;
>> 		if (len < 0) {
>> 			int read_error = errno;
>> -			close(ifd);
>> 			return error("copy-fd: read returned %s",
>> 				     strerror(read_error));
>> 		}
> 
> This saved errno is not necessary anymore (the problem was that close()
> clobbered the error in the original code). It can go away, and we can
> even drop the curly braces.
> 
>> @@ -21,17 +20,14 @@ int copy_fd(int ifd, int ofd)
>> 				len -= written;
>> 			}
>> 			else if (!written) {
>> -				close(ifd);
>> 				return error("copy-fd: write returned 0");
>> 			} else {
>> 				int write_error = errno;
>> -				close(ifd);
>> 				return error("copy-fd: write returned %s",
>> 					     strerror(write_error));
>> 			}
>> 		}
> 
> Ditto here. Actually, isn't this whole write just a reimplementation of
> write_in_full? The latter treats a return of 0 as ENOSPC rather than
> using a custom message, but I think that is sane.
> 
> All together:
Makes all sense, and seems sane to me, too.

Junio, I saw that you have the changes on pu with 'SQUASH???...'. Will you squash it, or shall I send another complete update of the patch series?

	Steffen
Show 48 quoted lines
> ---
> copy.c | 28 +++++-----------------------
> 1 file changed, 5 insertions(+), 23 deletions(-)
> 
> diff --git a/copy.c b/copy.c
> index a7f58fd..53a9ece 100644
> --- a/copy.c
> +++ b/copy.c
> @@ -4,34 +4,16 @@ int copy_fd(int ifd, int ofd)
> {
> 	while (1) {
> 		char buffer[8192];
> -		char *buf = buffer;
> 		ssize_t len = xread(ifd, buffer, sizeof(buffer));
> 		if (!len)
> 			break;
> -		if (len < 0) {
> -			int read_error = errno;
> -			close(ifd);
> +		if (len < 0)
> 			return error("copy-fd: read returned %s",
> -				     strerror(read_error));
> -		}
> -		while (len) {
> -			int written = xwrite(ofd, buf, len);
> -			if (written > 0) {
> -				buf += written;
> -				len -= written;
> -			}
> -			else if (!written) {
> -				close(ifd);
> -				return error("copy-fd: write returned 0");
> -			} else {
> -				int write_error = errno;
> -				close(ifd);
> -				return error("copy-fd: write returned %s",
> -					     strerror(write_error));
> -			}
> -		}
> +				     strerror(errno));
> +		if (write_in_full(ofd, buffer, len) < 0)
> +			return error("copy-fd: write returned %s",
> +				     strerror(errno));
> 	}
> -	close(ifd);
> 	return 0;
> }
> 
Previous: Jeff KingNext: Junio C Hamano
Message 17 of 19 in “Stream fd to clean filter; GIT_MMAP_LIMIT, GIT_ALLOC_LIMIT with git_env_ulong()”
  1. 0/6 Stream fd to clean filter; GIT_MMAP_LIMIT, GIT_ALLOC_LIMIT with git_env_ulong()Steffen Prohaska, Aug 26, 2014
  2. 1/6 convert: drop arguments other than 'path' from would_convert_to_git()Steffen Prohaska, Aug 26, 2014
  3. 2/6 Add git_env_ulong() to parse environment variableSteffen Prohaska, Aug 26, 2014
  4. Jeff KingAug 26, 2014
  5. Junio C HamanoAug 26, 2014
  6. Jeff KingAug 26, 2014
  7. Junio C HamanoAug 26, 2014
  8. Jeff KingAug 27, 2014
  9. Junio C HamanoAug 27, 2014
  10. Steffen ProhaskaAug 28, 2014
  11. Junio C HamanoAug 28, 2014
  12. 3/6 Change GIT_ALLOC_LIMIT check to use git_env_ulong()Steffen Prohaska, Aug 26, 2014
  13. 4/6 Introduce GIT_MMAP_LIMIT to allow testing expected mmap sizeSteffen Prohaska, Aug 26, 2014
  14. 5/6 Change copy_fd() to not close input fdSteffen Prohaska, Aug 26, 2014
  15. Junio C HamanoAug 26, 2014
  16. Jeff KingAug 26, 2014
  17. Steffen ProhaskaAug 28, 2014
  18. Junio C HamanoAug 28, 2014
  19. 6/6 convert: stream from fd to required clean filter to reduce used address spaceSteffen Prohaska, Aug 26, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.