aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorVasily Tarasov <vtaras@openvz.org>2007-07-16 02:41:12 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-07-16 12:05:48 -0400
commitb716395e2b8e450e294537de0c91476ded2f0395 (patch)
tree7f8fd39022c1caca71abb30303a453d77cf4d905 /arch
parent4b7775870b69129e640ed583c9b362d5cd66159d (diff)
diskquota: 32bit quota tools on 64bit architectures
OpenVZ Linux kernel team has discovered the problem with 32bit quota tools working on 64bit architectures. In 2.6.10 kernel sys32_quotactl() function was replaced by sys_quotactl() with the comment "sys_quotactl seems to be 32/64bit clean, enable it for 32bit" However this isn't right. Look at if_dqblk structure: struct if_dqblk { __u64 dqb_bhardlimit; __u64 dqb_bsoftlimit; __u64 dqb_curspace; __u64 dqb_ihardlimit; __u64 dqb_isoftlimit; __u64 dqb_curinodes; __u64 dqb_btime; __u64 dqb_itime; __u32 dqb_valid; }; For 32 bit quota tools sizeof(if_dqblk) == 0x44. But for 64 bit kernel its size is 0x48, 'cause of alignment! Thus we got a problem. Attached patch reintroduce sys32_quotactl() function, that handles this and related situations. [michal.k.k.piotrowski@gmail.com: build fix] [akpm@linux-foundation.org: Make it link with CONFIG_QUOTA=n] Signed-off-by: Vasily Tarasov <vtaras@openvz.org> Cc: Andi Kleen <ak@suse.de> Cc: "Luck, Tony" <tony.luck@intel.com> Cc: Jan Kara <jack@ucw.cz> Cc: <linux-arch@vger.kernel.org> Signed-off-by: Michal Piotrowski <michal.k.k.piotrowski@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/ia64/ia32/ia32_entry.S2
-rw-r--r--arch/x86_64/ia32/ia32entry.S2
2 files changed, 2 insertions, 2 deletions
diff --git a/arch/ia64/ia32/ia32_entry.S b/arch/ia64/ia32/ia32_entry.S
index 99b665e2b1d5..06efd1f9b800 100644
--- a/arch/ia64/ia32/ia32_entry.S
+++ b/arch/ia64/ia32/ia32_entry.S
@@ -304,7 +304,7 @@ ia32_syscall_table:
304 data8 sys_ni_syscall /* init_module */ 304 data8 sys_ni_syscall /* init_module */
305 data8 sys_ni_syscall /* delete_module */ 305 data8 sys_ni_syscall /* delete_module */
306 data8 sys_ni_syscall /* get_kernel_syms */ /* 130 */ 306 data8 sys_ni_syscall /* get_kernel_syms */ /* 130 */
307 data8 sys_quotactl 307 data8 sys32_quotactl
308 data8 sys_getpgid 308 data8 sys_getpgid
309 data8 sys_fchdir 309 data8 sys_fchdir
310 data8 sys_ni_syscall /* sys_bdflush */ 310 data8 sys_ni_syscall /* sys_bdflush */
diff --git a/arch/x86_64/ia32/ia32entry.S b/arch/x86_64/ia32/ia32entry.S
index 47565c3345d2..782dea819438 100644
--- a/arch/x86_64/ia32/ia32entry.S
+++ b/arch/x86_64/ia32/ia32entry.S
@@ -526,7 +526,7 @@ ia32_sys_call_table:
526 .quad sys_init_module 526 .quad sys_init_module
527 .quad sys_delete_module 527 .quad sys_delete_module
528 .quad quiet_ni_syscall /* 130 get_kernel_syms */ 528 .quad quiet_ni_syscall /* 130 get_kernel_syms */
529 .quad sys_quotactl 529 .quad sys32_quotactl
530 .quad sys_getpgid 530 .quad sys_getpgid
531 .quad sys_fchdir 531 .quad sys_fchdir
532 .quad quiet_ni_syscall /* bdflush */ 532 .quad quiet_ni_syscall /* bdflush */