All of lore.kernel.org
 help / color / mirror / Atom feed
From: Philippe Troin <phil@fifi.org>
To: Linus Torvalds <torvalds@osdl.org>
Cc: Albert Cahalan <albert@users.sourceforge.net>,
	linux-kernel mailing list <linux-kernel@vger.kernel.org>,
	Andrew Morton OSDL <akpm@osdl.org>
Subject: Re: errno
Date: 05 May 2004 18:16:15 -0700	[thread overview]
Message-ID: <87smeejqxs.fsf@ceramic.fifi.org> (raw)
In-Reply-To: <87r7u0g2cf.fsf@electrolyt.fifi.org>

Philippe Troin <phil@fifi.org> writes:

> Linus Torvalds <torvalds@osdl.org> writes:
> 
> > On Mon, 3 May 2004, Albert Cahalan wrote:
> > > 
> > > The obvious fix would be to stuff errno into the
> > > task_struct, hmmm?
> > 
> > No. "errno" is one of those fundamentally broken things that should not 
> > exist. It was wrogn in original UNIX, it's wrong now.
> > 
> > The kernel usage comes not from the kernel wanting to use it per se (the 
> > kernel has always used the "negative error" approach), but from some 
> > misguided kernel modules using the user-space interfaces.
> > 
> > The Linux way of returning negative error numbers is much nicer. It's
> > inherently thread-safe, and it has no performance downsides. Of course, it
> > does depend on having enough of a result domain that you can always
> > separate error returns from good returns, but that's true in practice for
> > all system calls.
> 
> Except of course for fcntl(fd, F_GETOWN) where the owner is a
> (negative) process group... If the owning process group has a "low
> enough" PGID, it collides with errors and glibc reports an error and
> sets errno to -PGID. One might argue that in this instance, that the
> BSD's overloading of the pid field with pgids is at fault, but the bug
> still remains :-)

This is a patch against 2.6.5 for what I am talking about. Of course,
glibc needs to be patched as well to transparently issue a
F_GETOWN_ARG when the user requests F_GETOWN...

Phil.

diff -rcN linux-2.6.5.orig/fs/fcntl.c linux-2.6.5/fs/fcntl.c
*** linux-2.6.5.orig/fs/fcntl.c	Sat Apr  3 19:37:36 2004
--- linux-2.6.5/fs/fcntl.c	Wed May  5 18:06:02 2004
***************
*** 323,328 ****
--- 323,339 ----
  			err = filp->f_owner.pid;
  			force_successful_syscall_return();
  			break;
+ 		case F_GETOWN_ARG:
+ 			/*
+ 			 * Works around F_GETOWN's return limitations.
+ 			 * Libc will transparently convert F_GETOWN to 
+ 			 * F_GETOWN_ARG.
+ 			 */
+ 			err = 0;
+ 			if (copy_to_user(&filp->f_owner.pid, (void*)arg, 
+ 					 sizeof(filp->f_owner.pid)))
+ 				err = -EFAULT;
+ 			break;
  		case F_SETOWN:
  			err = f_setown(filp, arg, 1);
  			break;
diff -rcN linux-2.6.5.orig/include/asm-alpha/fcntl.h linux-2.6.5/include/asm-alpha/fcntl.h
*** linux-2.6.5.orig/include/asm-alpha/fcntl.h	Sat Apr  3 19:37:24 2004
--- linux-2.6.5/include/asm-alpha/fcntl.h	Wed May  5 17:57:03 2004
***************
*** 36,41 ****
--- 36,43 ----
  #define F_SETSIG	10	/*  for sockets. */
  #define F_GETSIG	11	/*  for sockets. */
  
+ #define F_GETOWN_ARG	12	/*  same as F_GETOWN, but uses arg */
+ 
  /* for F_[GET|SET]FL */
  #define FD_CLOEXEC	1	/* actually anything with low bit set goes */
  
diff -rcN linux-2.6.5.orig/include/asm-arm/fcntl.h linux-2.6.5/include/asm-arm/fcntl.h
*** linux-2.6.5.orig/include/asm-arm/fcntl.h	Sat Apr  3 19:36:27 2004
--- linux-2.6.5/include/asm-arm/fcntl.h	Wed May  5 17:56:51 2004
***************
*** 39,44 ****
--- 39,46 ----
  #define F_SETLK64	13
  #define F_SETLKW64	14
  
+ #define F_GETOWN_ARG	15	/*  same as F_GETOWN, but uses arg */
+ 
  /* for F_[GET|SET]FL */
  #define FD_CLOEXEC	1	/* actually anything with low bit set goes */
  
diff -rcN linux-2.6.5.orig/include/asm-arm26/fcntl.h linux-2.6.5/include/asm-arm26/fcntl.h
*** linux-2.6.5.orig/include/asm-arm26/fcntl.h	Sat Apr  3 19:37:40 2004
--- linux-2.6.5/include/asm-arm26/fcntl.h	Wed May  5 17:56:47 2004
***************
*** 39,44 ****
--- 39,46 ----
  #define F_SETLK64	13
  #define F_SETLKW64	14
  
+ #define F_GETOWN_ARG	15	/*  same as F_GETOWN, but uses arg */
+ 
  /* for F_[GET|SET]FL */
  #define FD_CLOEXEC	1	/* actually anything with low bit set goes */
  
diff -rcN linux-2.6.5.orig/include/asm-cris/fcntl.h linux-2.6.5/include/asm-cris/fcntl.h
*** linux-2.6.5.orig/include/asm-cris/fcntl.h	Sat Apr  3 19:36:25 2004
--- linux-2.6.5/include/asm-cris/fcntl.h	Wed May  5 17:56:41 2004
***************
*** 41,46 ****
--- 41,48 ----
  #define F_SETLK64      13
  #define F_SETLKW64     14
  
+ #define F_GETOWN_ARG	15	/*  same as F_GETOWN, but uses arg */
+ 
  /* for F_[GET|SET]FL */
  #define FD_CLOEXEC	1	/* actually anything with low bit set goes */
  
diff -rcN linux-2.6.5.orig/include/asm-h8300/fcntl.h linux-2.6.5/include/asm-h8300/fcntl.h
*** linux-2.6.5.orig/include/asm-h8300/fcntl.h	Sat Apr  3 19:37:43 2004
--- linux-2.6.5/include/asm-h8300/fcntl.h	Wed May  5 17:56:37 2004
***************
*** 39,44 ****
--- 39,46 ----
  #define F_SETLK64	13
  #define F_SETLKW64	14
  
+ #define F_GETOWN_ARG	15	/*  same as F_GETOWN, but uses arg */
+ 
  /* for F_[GET|SET]FL */
  #define FD_CLOEXEC	1	/* actually anything with low bit set goes */
  
diff -rcN linux-2.6.5.orig/include/asm-i386/fcntl.h linux-2.6.5/include/asm-i386/fcntl.h
*** linux-2.6.5.orig/include/asm-i386/fcntl.h	Sat Apr  3 19:37:23 2004
--- linux-2.6.5/include/asm-i386/fcntl.h	Wed May  5 17:56:21 2004
***************
*** 39,44 ****
--- 39,46 ----
  #define F_SETLK64	13
  #define F_SETLKW64	14
  
+ #define F_GETOWN_ARG	15	/*  same as F_GETOWN, but uses arg */
+ 
  /* for F_[GET|SET]FL */
  #define FD_CLOEXEC	1	/* actually anything with low bit set goes */
  
diff -rcN linux-2.6.5.orig/include/asm-ia64/fcntl.h linux-2.6.5/include/asm-ia64/fcntl.h
*** linux-2.6.5.orig/include/asm-ia64/fcntl.h	Sat Apr  3 19:37:23 2004
--- linux-2.6.5/include/asm-ia64/fcntl.h	Wed May  5 17:56:11 2004
***************
*** 43,48 ****
--- 43,50 ----
  #define F_SETSIG	10	/*  for sockets. */
  #define F_GETSIG	11	/*  for sockets. */
  
+ #define F_GETOWN_ARG	12	/*  same as F_GETOWN, but uses arg */
+ 
  /* for F_[GET|SET]FL */
  #define FD_CLOEXEC	1	/* actually anything with low bit set goes */
  
diff -rcN linux-2.6.5.orig/include/asm-m68k/fcntl.h linux-2.6.5/include/asm-m68k/fcntl.h
*** linux-2.6.5.orig/include/asm-m68k/fcntl.h	Sat Apr  3 19:36:53 2004
--- linux-2.6.5/include/asm-m68k/fcntl.h	Wed May  5 17:55:57 2004
***************
*** 39,44 ****
--- 39,46 ----
  #define F_SETLK64	13
  #define F_SETLKW64	14
  
+ #define F_GETOWN_ARG	15	/*  same as F_GETOWN, but uses arg */
+ 
  /* for F_[GET|SET]FL */
  #define FD_CLOEXEC	1	/* actually anything with low bit set goes */
  
diff -rcN linux-2.6.5.orig/include/asm-mips/fcntl.h linux-2.6.5/include/asm-mips/fcntl.h
*** linux-2.6.5.orig/include/asm-mips/fcntl.h	Sat Apr  3 19:37:43 2004
--- linux-2.6.5/include/asm-mips/fcntl.h	Wed May  5 17:55:36 2004
***************
*** 42,47 ****
--- 42,48 ----
  #define F_GETOWN	23	/*  for sockets. */
  #define F_SETSIG	10	/*  for sockets. */
  #define F_GETSIG	11	/*  for sockets. */
+ #define F_GETOWN_ARG	25	/*  same as F_GETOWN, but uses arg */
  
  #ifndef __mips64
  #define F_GETLK64	33	/*  using 'struct flock64' */
diff -rcN linux-2.6.5.orig/include/asm-parisc/fcntl.h linux-2.6.5/include/asm-parisc/fcntl.h
*** linux-2.6.5.orig/include/asm-parisc/fcntl.h	Sat Apr  3 19:37:07 2004
--- linux-2.6.5/include/asm-parisc/fcntl.h	Wed May  5 17:55:10 2004
***************
*** 42,47 ****
--- 42,48 ----
  #define F_SETOWN	12	/*  for sockets. */
  #define F_SETSIG	13	/*  for sockets. */
  #define F_GETSIG	14	/*  for sockets. */
+ #define F_GETOWN_ARG	15	/*  same as F_GETOWN, but uses arg */
  
  /* for F_[GET|SET]FL */
  #define FD_CLOEXEC	1	/* actually anything with low bit set goes */
diff -rcN linux-2.6.5.orig/include/asm-ppc/fcntl.h linux-2.6.5/include/asm-ppc/fcntl.h
*** linux-2.6.5.orig/include/asm-ppc/fcntl.h	Sat Apr  3 19:37:07 2004
--- linux-2.6.5/include/asm-ppc/fcntl.h	Wed May  5 17:54:59 2004
***************
*** 39,44 ****
--- 39,46 ----
  #define F_SETLK64	13
  #define F_SETLKW64	14
  
+ #define F_GETOWN_ARG	15	/*  same as F_GETOWN, but uses arg */
+ 
  /* for F_[GET|SET]FL */
  #define FD_CLOEXEC	1	/* actually anything with low bit set goes */
  
diff -rcN linux-2.6.5.orig/include/asm-ppc64/fcntl.h linux-2.6.5/include/asm-ppc64/fcntl.h
*** linux-2.6.5.orig/include/asm-ppc64/fcntl.h	Sat Apr  3 19:36:15 2004
--- linux-2.6.5/include/asm-ppc64/fcntl.h	Wed May  5 17:54:51 2004
***************
*** 42,47 ****
--- 42,49 ----
  #define F_SETSIG	10	/*  for sockets. */
  #define F_GETSIG	11	/*  for sockets. */
  
+ #define F_GETOWN_ARG	12	/*  same as F_GETOWN, but uses arg */
+ 
  /* for F_[GET|SET]FL */
  #define FD_CLOEXEC	1	/* actually anything with low bit set goes */
  
diff -rcN linux-2.6.5.orig/include/asm-s390/fcntl.h linux-2.6.5/include/asm-s390/fcntl.h
*** linux-2.6.5.orig/include/asm-s390/fcntl.h	Sat Apr  3 19:36:12 2004
--- linux-2.6.5/include/asm-s390/fcntl.h	Wed May  5 17:54:43 2004
***************
*** 48,53 ****
--- 48,55 ----
  #define F_SETLKW64	14
  #endif /* ! __s390x__ */
  
+ #define F_GETOWN_ARG	15	/*  same as F_GETOWN, but uses arg */
+ 
  /* for F_[GET|SET]FL */
  #define FD_CLOEXEC	1	/* actually anything with low bit set goes */
  
diff -rcN linux-2.6.5.orig/include/asm-sh/fcntl.h linux-2.6.5/include/asm-sh/fcntl.h
*** linux-2.6.5.orig/include/asm-sh/fcntl.h	Sat Apr  3 19:37:42 2004
--- linux-2.6.5/include/asm-sh/fcntl.h	Wed May  5 17:54:29 2004
***************
*** 39,44 ****
--- 39,46 ----
  #define F_SETLK64	13
  #define F_SETLKW64	14
  
+ #define F_GETOWN_ARG	15	/*  same as F_GETOWN, but uses arg */
+ 
  /* for F_[GET|SET]FL */
  #define FD_CLOEXEC	1	/* actually anything with low bit set goes */
  
diff -rcN linux-2.6.5.orig/include/asm-sparc/fcntl.h linux-2.6.5/include/asm-sparc/fcntl.h
*** linux-2.6.5.orig/include/asm-sparc/fcntl.h	Sat Apr  3 19:38:20 2004
--- linux-2.6.5/include/asm-sparc/fcntl.h	Wed May  5 17:54:23 2004
***************
*** 39,44 ****
--- 39,46 ----
  #define F_SETLK64	13
  #define F_SETLKW64	14
  
+ #define F_GETOWN_ARG	15	/*  same as F_GETOWN, but uses arg */
+ 
  /* for F_[GET|SET]FL */
  #define FD_CLOEXEC	1	/* actually anything with low bit set goes */
  
diff -rcN linux-2.6.5.orig/include/asm-sparc64/fcntl.h linux-2.6.5/include/asm-sparc64/fcntl.h
*** linux-2.6.5.orig/include/asm-sparc64/fcntl.h	Sat Apr  3 19:38:20 2004
--- linux-2.6.5/include/asm-sparc64/fcntl.h	Wed May  5 17:54:18 2004
***************
*** 35,40 ****
--- 35,41 ----
  #define F_SETLKW	9
  #define F_SETSIG	10	/*  for sockets. */
  #define F_GETSIG	11	/*  for sockets. */
+ #define F_GETOWN_ARG	12	/*  same as F_GETOWN, but uses arg */
  
  /* for F_[GET|SET]FL */
  #define FD_CLOEXEC	1	/* actually anything with low bit set goes */
diff -rcN linux-2.6.5.orig/include/asm-v850/fcntl.h linux-2.6.5/include/asm-v850/fcntl.h
*** linux-2.6.5.orig/include/asm-v850/fcntl.h	Sat Apr  3 19:36:53 2004
--- linux-2.6.5/include/asm-v850/fcntl.h	Wed May  5 17:53:58 2004
***************
*** 39,44 ****
--- 39,46 ----
  #define F_SETLK64	13
  #define F_SETLKW64	14
  
+ #define F_GETOWN_ARG	15	/*  same as F_GETOWN, but uses arg */
+ 
  /* for F_[GET|SET]FL */
  #define FD_CLOEXEC	1	/* actually anything with low bit set goes */
  
diff -rcN linux-2.6.5.orig/include/asm-x86_64/fcntl.h linux-2.6.5/include/asm-x86_64/fcntl.h
*** linux-2.6.5.orig/include/asm-x86_64/fcntl.h	Sat Apr  3 19:36:26 2004
--- linux-2.6.5/include/asm-x86_64/fcntl.h	Wed May  5 17:53:48 2004
***************
*** 34,39 ****
--- 34,40 ----
  #define F_GETOWN	9	/*  for sockets. */
  #define F_SETSIG	10	/*  for sockets. */
  #define F_GETSIG	11	/*  for sockets. */
+ #define F_GETOWN_ARG	12	/*  same as F_GETOWN, but uses arg */
  
  /* for F_[GET|SET]FL */
  #define FD_CLOEXEC	1	/* actually anything with low bit set goes */

      reply	other threads:[~2004-05-06  1:16 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-05-04  1:26 errno Albert Cahalan
2004-05-04  4:14 ` errno Linus Torvalds
2004-05-04  5:58   ` errno Philippe Troin
2004-05-06  1:16     ` Philippe Troin [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=87smeejqxs.fsf@ceramic.fifi.org \
    --to=phil@fifi.org \
    --cc=akpm@osdl.org \
    --cc=albert@users.sourceforge.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=torvalds@osdl.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.