Re: IA-32 support patch: fcntl64 calls are broken

Arun Sharma
2003-07-08T18:57:21Z

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

Arun Sharma wrote:
>
> Currently, sys32_fcntl64() is broken, because it passes F_*64 commands
> to sys_fcntl(), which it doesn't understand. The F_XXX64 commands need
> to be converted to F_XXX before calling sys_fcntl().
>
> We also eliminated a copy, because the 32 bit struct flock64 and the 64
> bit struct flock seem to be identical.
>

Turns out that the structures are not identical (even though the data types of all the members have the same size) due to alignment issues. So the copy can not be eliminated.

> This patch is relevant only to 2.4, as it has already been taken care of
> in 2.5.

A new patch is attached.

-Arun

[-- Attachment #2: fcntl.29.txt --]
[-- Type: text/plain, Size: 594 bytes --]

--- linux/arch/ia64/ia32/sys_ia32.c- Tue Jun 24 15:43:39 2003
+++ linux/arch/ia64/ia32/sys_ia32.c Tue Jul 1 14:09:27 2003
@@ -3622,9 +3622,11 @@
return -EFAULT;
old_fs = get_fs();
set_fs(KERNEL_DS);
- ret = sys_fcntl(fd, cmd, (unsigned long) &f);
+ ret = sys_fcntl(fd, (cmd == F_GETLK64) ? F_GETLK :
+ ((cmd == F_SETLK64) ? F_SETLK : F_SETLKW),
+ (unsigned long) &f);
set_fs(old_fs);
- if (cmd == F_GETLK && ia32_put_flock(&f, arg))
+ if (cmd == F_GETLK64 && ia32_put_flock(&f, arg))
return -EFAULT;
break;