patch-2.4.22 linux-2.4.22/arch/ppc64/kernel/sys_ppc32.c
Next file: linux-2.4.22/arch/ppc64/kernel/syscalls.c
Previous file: linux-2.4.22/arch/ppc64/kernel/stab.c
Back to the patch index
Back to the overall index
- Lines: 145
- Date:
2003-08-25 04:44:40.000000000 -0700
- Orig file:
linux-2.4.21/arch/ppc64/kernel/sys_ppc32.c
- Orig date:
2003-06-13 07:51:32.000000000 -0700
diff -urN linux-2.4.21/arch/ppc64/kernel/sys_ppc32.c linux-2.4.22/arch/ppc64/kernel/sys_ppc32.c
@@ -454,7 +454,7 @@
return err;
}
-struct dqblk32 {
+struct user_dqblk32 {
__u32 dqb_bhardlimit;
__u32 dqb_bsoftlimit;
__u32 dqb_curblocks;
@@ -473,13 +473,13 @@
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
-asmlinkage long sys32_quotactl(u32 cmd_parm, const char *special, u32 id_parm, unsigned long addr)
+asmlinkage long sys32_quotactl(u32 cmd_parm, const char *special, u32 id_parm, caddr_t addr)
{
- int cmd = (int)cmd_parm;
- int id = (int)id_parm;
+ int cmd = (int)cmd_parm;
+ int id = (int)id_parm;
int cmds = cmd >> SUBCMDSHIFT;
int err;
- struct dqblk d;
+ struct v1c_mem_dqblk d;
mm_segment_t old_fs;
char *spec;
@@ -487,35 +487,33 @@
current->pid, current, current->comm);
switch (cmds) {
- case Q_GETQUOTA:
+ case Q_V1_GETQUOTA:
break;
- case Q_SETQUOTA:
- case Q_SETUSE:
- case Q_SETQLIM:
- if (copy_from_user (&d, (struct dqblk32 *)addr,
- sizeof (struct dqblk32)))
+ case Q_V1_SETQUOTA:
+ case Q_V1_SETUSE:
+ case Q_V1_SETQLIM:
+ if (copy_from_user(&d, addr, sizeof(struct user_dqblk32)))
return -EFAULT;
- d.dqb_itime = ((struct dqblk32 *)&d)->dqb_itime;
- d.dqb_btime = ((struct dqblk32 *)&d)->dqb_btime;
+ d.dqb_itime = ((struct user_dqblk32 *)&d)->dqb_itime;
+ d.dqb_btime = ((struct user_dqblk32 *)&d)->dqb_btime;
break;
default:
- return sys_quotactl(cmd, special,
- id, (caddr_t)addr);
+ return sys_quotactl(cmd, special, id, addr);
}
- spec = getname (special);
+ spec = getname(special);
err = PTR_ERR(spec);
- if (IS_ERR(spec)) return err;
- old_fs = get_fs ();
+ if (IS_ERR(spec))
+ return err;
+ old_fs = get_fs();
set_fs (KERNEL_DS);
err = sys_quotactl(cmd, (const char *)spec, id, (caddr_t)&d);
set_fs (old_fs);
putname (spec);
- if (cmds == Q_GETQUOTA) {
+ if (cmds == Q_V1_GETQUOTA) {
__kernel_time_t b = d.dqb_btime, i = d.dqb_itime;
- ((struct dqblk32 *)&d)->dqb_itime = i;
- ((struct dqblk32 *)&d)->dqb_btime = b;
- if (copy_to_user ((struct dqblk32 *)addr, &d,
- sizeof (struct dqblk32)))
+ ((struct user_dqblk32 *)&d)->dqb_itime = i;
+ ((struct user_dqblk32 *)&d)->dqb_btime = b;
+ if (copy_to_user(addr, &d, sizeof(struct user_dqblk32)))
return -EFAULT;
}
@@ -2311,7 +2309,11 @@
u32 totalswap;
u32 freeswap;
unsigned short procs;
- char _f[22];
+ unsigned short pad;
+ u32 totalhigh;
+ u32 freehigh;
+ u32 mem_unit;
+ char _f[20-2*sizeof(u32)-sizeof(int)];
};
extern asmlinkage long sys_sysinfo(struct sysinfo *info);
@@ -2320,6 +2322,7 @@
{
struct sysinfo s;
int ret, err;
+ int bitcount = 0;
mm_segment_t old_fs = get_fs ();
PPCDBG(PPCDBG_SYS32, "sys32_sysinfo - entered - pid=%ld current=%lx comm=%s \n", current->pid, current, current->comm);
@@ -2327,6 +2330,24 @@
set_fs (KERNEL_DS);
ret = sys_sysinfo(&s);
set_fs (old_fs);
+ /* Check to see if any memory value is too large for 32-bit and scale
+ * down if needed
+ */
+ if ((s.totalram >> 32) || (s.totalswap >> 32)) {
+ while (s.mem_unit < PAGE_SIZE) {
+ s.mem_unit <<= 1;
+ bitcount++;
+ }
+ s.totalram >>= bitcount;
+ s.freeram >>= bitcount;
+ s.sharedram >>= bitcount;
+ s.bufferram >>= bitcount;
+ s.totalswap >>= bitcount;
+ s.freeswap >>= bitcount;
+ s.totalhigh >>= bitcount;
+ s.freehigh >>= bitcount;
+ }
+
err = put_user (s.uptime, &info->uptime);
err |= __put_user (s.loads[0], &info->loads[0]);
err |= __put_user (s.loads[1], &info->loads[1]);
@@ -2338,6 +2359,10 @@
err |= __put_user (s.totalswap, &info->totalswap);
err |= __put_user (s.freeswap, &info->freeswap);
err |= __put_user (s.procs, &info->procs);
+ err |= __put_user (s.totalhigh, &info->totalhigh);
+ err |= __put_user (s.freehigh, &info->freehigh);
+ err |= __put_user (s.mem_unit, &info->mem_unit);
+
if (err)
return -EFAULT;
@@ -3029,7 +3054,7 @@
err = do_sys32_shmctl(first, second, (void *)AA(ptr));
break;
default:
- err = -EINVAL;
+ err = -ENOSYS;
break;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)