X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fs390%2Fmm%2Fcmm.c;h=cb29503010616dc3afbe66074df8eb853ab238d9;hb=9bf4aaab3e101692164d49b7ca357651eb691cb6;hp=095a5648c1cfc5a4bbd78f8c650640df1bb4f465;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/arch/s390/mm/cmm.c b/arch/s390/mm/cmm.c index 095a5648c..cb2950301 100644 --- a/arch/s390/mm/cmm.c +++ b/arch/s390/mm/cmm.c @@ -19,6 +19,7 @@ #include #include +#include #include "../../../drivers/s390/net/smsgiucv.h" @@ -255,13 +256,13 @@ static struct ctl_table cmm_table[]; static int cmm_pages_handler(ctl_table *ctl, int write, struct file *filp, - void *buffer, size_t *lenp) + void *buffer, size_t *lenp, loff_t *ppos) { char buf[16], *p; long pages; int len; - if (!*lenp || (filp->f_pos && !write)) { + if (!*lenp || (*ppos && !write)) { *lenp = 0; return 0; } @@ -290,19 +291,19 @@ cmm_pages_handler(ctl_table *ctl, int write, struct file *filp, return -EFAULT; } *lenp = len; - filp->f_pos += len; + *ppos += len; return 0; } static int cmm_timeout_handler(ctl_table *ctl, int write, struct file *filp, - void *buffer, size_t *lenp) + void *buffer, size_t *lenp, loff_t *ppos) { char buf[64], *p; long pages, seconds; int len; - if (!*lenp || (filp->f_pos && !write)) { + if (!*lenp || (*ppos && !write)) { *lenp = 0; return 0; } @@ -327,7 +328,7 @@ cmm_timeout_handler(ctl_table *ctl, int write, struct file *filp, return -EFAULT; } *lenp = len; - filp->f_pos += len; + *ppos += len; return 0; } @@ -407,6 +408,14 @@ struct ctl_table_header *cmm_sysctl_header; static int cmm_init (void) { + int rc; + + /* Prevent logical cpu 0 from being set offline. */ + rc = smp_get_cpu(cpumask_of_cpu(0)); + if (rc) { + printk(KERN_ERR "CMM: unable to reserve cpu 0\n"); + return rc; + } #ifdef CONFIG_CMM_PROC cmm_sysctl_header = register_sysctl_table(cmm_dir_table, 1); #endif @@ -430,6 +439,8 @@ cmm_exit(void) #ifdef CONFIG_CMM_IUCV smsg_unregister_callback(SMSG_PREFIX, cmm_smsg_target); #endif + /* Allow logical cpu 0 to be set offline again. */ + smp_put_cpu(0); } module_init(cmm_init);