- char buf[22];
- int len;
- DECLARE_LL_PROC_PPOS_DECL;
-
- if (!*lenp || (*ppos && !write)) {
- *lenp = 0;
- return 0;
- }
- if (write)
- return -EINVAL;
-
- len = snprintf(buf, sizeof(buf), LPU64"\n", obd_pages_max());
- if (len > *lenp)
- len = *lenp;
- buf[len] = '\0';
- if (cfs_copy_to_user(buffer, buf, len))
- return -EFAULT;
- *lenp = len;
- *ppos += *lenp;
- return 0;
-}
-
-int LL_PROC_PROTO(proc_max_dirty_pages_in_mb)
-{
- int rc = 0;
- DECLARE_LL_PROC_PPOS_DECL;
-
- if (!table->data || !table->maxlen || !*lenp || (*ppos && !write)) {
- *lenp = 0;
- return 0;
- }
- if (write) {
- rc = lprocfs_write_frac_helper(buffer, *lenp,
- (unsigned int*)table->data,
- 1 << (20 - CFS_PAGE_SHIFT));
- /* Don't allow them to let dirty pages exceed 90% of system
- * memory and set a hard minimum of 4MB. */
- if (obd_max_dirty_pages > ((cfs_num_physpages / 10) * 9)) {
- CERROR("Refusing to set max dirty pages to %u, which "
- "is more than 90%% of available RAM; setting "
- "to %lu\n", obd_max_dirty_pages,
- ((cfs_num_physpages / 10) * 9));
- obd_max_dirty_pages = ((cfs_num_physpages / 10) * 9);
- } else if (obd_max_dirty_pages < 4 << (20 - CFS_PAGE_SHIFT)) {
- obd_max_dirty_pages = 4 << (20 - CFS_PAGE_SHIFT);
- }
- } else {
- char buf[21];
- int len;
-
- len = lprocfs_read_frac_helper(buf, sizeof(buf),
- *(unsigned int*)table->data,
- 1 << (20 - CFS_PAGE_SHIFT));
- if (len > *lenp)
- len = *lenp;
- buf[len] = '\0';
- if (cfs_copy_to_user(buffer, buf, len))
- return -EFAULT;
- *lenp = len;
- }
- *ppos += *lenp;
- return rc;
-}
-
-#ifdef RANDOM_FAIL_ALLOC
-int LL_PROC_PROTO(proc_alloc_fail_rate)
-{
- int rc = 0;
- DECLARE_LL_PROC_PPOS_DECL;
-
- if (!table->data || !table->maxlen || !*lenp || (*ppos && !write)) {
- *lenp = 0;
- return 0;
- }
- if (write) {
- rc = lprocfs_write_frac_helper(buffer, *lenp,
- (unsigned int*)table->data,
- OBD_ALLOC_FAIL_MULT);
- } else {
- char buf[21];
- int len;
-
- len = lprocfs_read_frac_helper(buf, 21,
- *(unsigned int*)table->data,
- OBD_ALLOC_FAIL_MULT);
- if (len > *lenp)
- len = *lenp;
- buf[len] = '\0';
- if (cfs_copy_to_user(buffer, buf, len))
- return -EFAULT;
- *lenp = len;
- }
- *ppos += *lenp;
- return rc;
-}
-#endif
-
-int LL_PROC_PROTO(proc_at_min)
-{
- return ll_proc_dointvec(table, write, filp, buffer, lenp, ppos);
-}
-int LL_PROC_PROTO(proc_at_max)
-{
- return ll_proc_dointvec(table, write, filp, buffer, lenp, ppos);
-}
-int LL_PROC_PROTO(proc_at_extra)
-{
- return ll_proc_dointvec(table, write, filp, buffer, lenp, ppos);
-}
-int LL_PROC_PROTO(proc_at_early_margin)
-{
- return ll_proc_dointvec(table, write, filp, buffer, lenp, ppos);
-}
-int LL_PROC_PROTO(proc_at_history)
-{
- return ll_proc_dointvec(table, write, filp, buffer, lenp, ppos);
+ __s64 val;
+ int rc = 0;
+
+ if (!table->data || !table->maxlen || !*lenp || (*ppos && !write)) {
+ *lenp = 0;
+ return 0;
+ }
+ if (write) {
+ rc = lprocfs_str_with_units_to_s64(buffer, *lenp, &val, 'M');
+ if (rc)
+ return rc;
+
+ if (val < 0)
+ return -ERANGE;
+
+ val >>= PAGE_CACHE_SHIFT;
+
+ /* Don't allow them to let dirty pages exceed 90% of system
+ * memory and set a hard minimum of 4MB. */
+ if (val > ((totalram_pages / 10) * 9)) {
+ CERROR("Refusing to set max dirty pages to "LPD64", "
+ "which is more than 90%% of available RAM; "
+ "setting to %lu\n", val,
+ ((totalram_pages / 10) * 9));
+ obd_max_dirty_pages = ((totalram_pages / 10) * 9);
+ } else if (val < 4 << (20 - PAGE_CACHE_SHIFT)) {
+ obd_max_dirty_pages = 4 << (20 - PAGE_CACHE_SHIFT);
+ } else {
+ obd_max_dirty_pages = val;
+ }
+ } else {
+ char buf[21];
+ int len;
+
+ len = lprocfs_read_frac_helper(buf, sizeof(buf),
+ *(unsigned long *)table->data,
+ 1 << (20 - PAGE_CACHE_SHIFT));
+ if (len > *lenp)
+ len = *lenp;
+ buf[len] = '\0';
+ if (copy_to_user(buffer, buf, len))
+ return -EFAULT;
+ *lenp = len;
+ }
+ *ppos += *lenp;
+ return rc;