|
@@ -174,7 +174,8 @@ clocks_calc_mult_shift(u32 *mult, u32 *shift, u32 from, u32 to, u32 maxsec)
|
|
|
static struct clocksource *curr_clocksource;
|
|
|
static LIST_HEAD(clocksource_list);
|
|
|
static DEFINE_MUTEX(clocksource_mutex);
|
|
|
-static char override_name[32];
|
|
|
+#define CS_NAME_LEN 32
|
|
|
+static char override_name[CS_NAME_LEN];
|
|
|
static int finished_booting;
|
|
|
|
|
|
#ifdef CONFIG_CLOCKSOURCE_WATCHDOG
|
|
@@ -838,6 +839,23 @@ sysfs_show_current_clocksources(struct device *dev,
|
|
|
return count;
|
|
|
}
|
|
|
|
|
|
+static size_t clocksource_get_uname(const char *buf, char *dst, size_t cnt)
|
|
|
+{
|
|
|
+ size_t ret = cnt;
|
|
|
+
|
|
|
+ /* strings from sysfs write are not 0 terminated! */
|
|
|
+ if (!cnt || cnt >= CS_NAME_LEN)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ /* strip of \n: */
|
|
|
+ if (buf[cnt-1] == '\n')
|
|
|
+ cnt--;
|
|
|
+ if (cnt > 0)
|
|
|
+ memcpy(dst, buf, cnt);
|
|
|
+ dst[cnt] = 0;
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* sysfs_override_clocksource - interface for manually overriding clocksource
|
|
|
* @dev: unused
|
|
@@ -852,22 +870,13 @@ static ssize_t sysfs_override_clocksource(struct device *dev,
|
|
|
struct device_attribute *attr,
|
|
|
const char *buf, size_t count)
|
|
|
{
|
|
|
- size_t ret = count;
|
|
|
-
|
|
|
- /* strings from sysfs write are not 0 terminated! */
|
|
|
- if (count >= sizeof(override_name))
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
- /* strip of \n: */
|
|
|
- if (buf[count-1] == '\n')
|
|
|
- count--;
|
|
|
+ size_t ret;
|
|
|
|
|
|
mutex_lock(&clocksource_mutex);
|
|
|
|
|
|
- if (count > 0)
|
|
|
- memcpy(override_name, buf, count);
|
|
|
- override_name[count] = 0;
|
|
|
- clocksource_select();
|
|
|
+ ret = clocksource_get_uname(buf, override_name, count);
|
|
|
+ if (ret >= 0)
|
|
|
+ clocksource_select();
|
|
|
|
|
|
mutex_unlock(&clocksource_mutex);
|
|
|
|