patch-2.4.19 linux-2.4.19/drivers/char/rtc.c
Next file: linux-2.4.19/drivers/char/sb1250_duart.c
Previous file: linux-2.4.19/drivers/char/rocket_int.h
Back to the patch index
Back to the overall index
- Lines: 122
- Date:
Fri Aug 2 17:39:43 2002
- Orig file:
linux-2.4.18/drivers/char/rtc.c
- Orig date:
Fri Dec 21 09:41:54 2001
diff -urN linux-2.4.18/drivers/char/rtc.c linux-2.4.19/drivers/char/rtc.c
@@ -67,6 +67,7 @@
#include <linux/poll.h>
#include <linux/proc_fs.h>
#include <linux/spinlock.h>
+#include <linux/sysctl.h>
#include <asm/io.h>
#include <asm/uaccess.h>
@@ -138,6 +139,7 @@
static unsigned long rtc_status = 0; /* bitmapped status byte. */
static unsigned long rtc_freq = 0; /* Current periodic IRQ rate */
static unsigned long rtc_irq_data = 0; /* our output to the world */
+static unsigned long rtc_max_user_freq = 64; /* > this, need CAP_SYS_RESOURCE */
/*
* If this driver ever becomes modularised, it will be really nice
@@ -187,6 +189,38 @@
#endif
/*
+ * sysctl-tuning infrastructure.
+ */
+static ctl_table rtc_table[] = {
+ { 1, "max-user-freq", &rtc_max_user_freq, sizeof(int), 0644, NULL,
+ &proc_dointvec, NULL, },
+ { 0, }
+};
+
+static ctl_table rtc_root[] = {
+ { 1, "rtc", NULL, 0, 0555, rtc_table, },
+ { 0, }
+};
+
+static ctl_table dev_root[] = {
+ { CTL_DEV, "dev", NULL, 0, 0555, rtc_root, },
+ { 0, }
+};
+
+static struct ctl_table_header *sysctl_header;
+
+static int __init init_sysctl(void)
+{
+ sysctl_header = register_sysctl_table(dev_root, 0);
+ return 0;
+}
+
+static void __exit cleanup_sysctl(void)
+{
+ unregister_sysctl_table(sysctl_header);
+}
+
+/*
* Now all the various file operations that we export.
*/
@@ -295,7 +329,8 @@
* We don't really want Joe User enabling more
* than 64Hz of interrupts on a multi-user machine.
*/
- if ((rtc_freq > 64) && (!capable(CAP_SYS_RESOURCE)))
+ if ((rtc_freq > rtc_max_user_freq) &&
+ (!capable(CAP_SYS_RESOURCE)))
return -EACCES;
if (!(rtc_status & RTC_TIMER_ON)) {
@@ -493,7 +528,7 @@
* We don't really want Joe User generating more
* than 64Hz of interrupts on a multi-user machine.
*/
- if ((arg > 64) && (!capable(CAP_SYS_RESOURCE)))
+ if ((arg > rtc_max_user_freq) && (!capable(CAP_SYS_RESOURCE)))
return -EACCES;
while (arg > (1<<tmp))
@@ -534,7 +569,7 @@
return 0;
}
default:
- return -EINVAL;
+ return -ENOTTY;
}
return copy_to_user((void *)arg, &wtime, sizeof wtime) ? -EFAULT : 0;
}
@@ -720,7 +755,7 @@
}
no_irq:
#else
- if (check_region (RTC_PORT (0), RTC_IO_EXTENT))
+ if (!request_region(RTC_PORT(0), RTC_IO_EXTENT, "rtc"))
{
printk(KERN_ERR "rtc: I/O port %d is not free.\n", RTC_PORT (0));
return -EIO;
@@ -731,11 +766,11 @@
{
/* Yeah right, seeing as irq 8 doesn't even hit the bus. */
printk(KERN_ERR "rtc: IRQ %d is not free.\n", RTC_IRQ);
+ release_region(RTC_PORT(0), RTC_IO_EXTENT);
return -EIO;
}
#endif
- request_region(RTC_PORT(0), RTC_IO_EXTENT, "rtc");
#endif /* __sparc__ vs. others */
misc_register(&rtc_dev);
@@ -798,6 +833,8 @@
no_irq2:
#endif
+ (void) init_sysctl();
+
printk(KERN_INFO "Real Time Clock Driver v" RTC_VERSION "\n");
return 0;
@@ -805,6 +842,7 @@
static void __exit rtc_exit (void)
{
+ cleanup_sysctl();
remove_proc_entry ("driver/rtc", NULL);
misc_deregister(&rtc_dev);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)