int LL_PROC_PROTO(proc_max_dirty_pages_in_mb) { int rc = 0; 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 - PAGE_CACHE_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 > ((totalram_pages / 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, ((totalram_pages / 10) * 9)); obd_max_dirty_pages = ((totalram_pages / 10) * 9); } else if (obd_max_dirty_pages < 4 << (20 - PAGE_CACHE_SHIFT)) { obd_max_dirty_pages = 4 << (20 - PAGE_CACHE_SHIFT); } } else { char buf[21]; int len; len = lprocfs_read_frac_helper(buf, sizeof(buf), *(unsigned int *)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; }
static int osc_wr_max_dirty_mb(struct file *file, const char *buffer, unsigned long count, void *data) { struct obd_device *dev = data; struct client_obd *cli = &dev->u.cli; int pages_number, mult, rc; mult = 1 << (20 - CFS_PAGE_SHIFT); rc = lprocfs_write_frac_helper(buffer, count, &pages_number, mult); if (rc) return rc; if (pages_number < 0 || pages_number > OSC_MAX_DIRTY_MB_MAX << (20 - CFS_PAGE_SHIFT) || pages_number > cfs_num_physpages / 4) /* 1/4 of RAM */ return -ERANGE; client_obd_list_lock(&cli->cl_loi_list_lock); cli->cl_dirty_max = (obd_count)(pages_number << CFS_PAGE_SHIFT); osc_wake_cache_waiters(cli); client_obd_list_unlock(&cli->cl_loi_list_lock); return count; }