]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/pipe.c
Merge branch 'for-upstream/mali-dp' of git://linux-arm.org/linux-ld into drm-fixes
[linux.git] / fs / pipe.c
index 349c9d56d4b34a0b307c5ef5b3fdc552ae030b0c..6d98566201ef5c1f152a11c5849e9e02bd55189b 100644 (file)
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -1018,13 +1018,19 @@ const struct file_operations pipefifo_fops = {
 
 /*
  * Currently we rely on the pipe array holding a power-of-2 number
- * of pages.
+ * of pages. Returns 0 on error.
  */
-static inline unsigned int round_pipe_size(unsigned int size)
+unsigned int round_pipe_size(unsigned int size)
 {
        unsigned long nr_pages;
 
+       if (size < pipe_min_size)
+               size = pipe_min_size;
+
        nr_pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
+       if (nr_pages == 0)
+               return 0;
+
        return roundup_pow_of_two(nr_pages) << PAGE_SHIFT;
 }
 
@@ -1040,6 +1046,8 @@ static long pipe_set_size(struct pipe_inode_info *pipe, unsigned long arg)
        long ret = 0;
 
        size = round_pipe_size(arg);
+       if (size == 0)
+               return -EINVAL;
        nr_pages = size >> PAGE_SHIFT;
 
        if (!nr_pages)
@@ -1117,20 +1125,13 @@ static long pipe_set_size(struct pipe_inode_info *pipe, unsigned long arg)
 }
 
 /*
- * This should work even if CONFIG_PROC_FS isn't set, as proc_dointvec_minmax
+ * This should work even if CONFIG_PROC_FS isn't set, as proc_dopipe_max_size
  * will return an error.
  */
 int pipe_proc_fn(struct ctl_table *table, int write, void __user *buf,
                 size_t *lenp, loff_t *ppos)
 {
-       int ret;
-
-       ret = proc_dointvec_minmax(table, write, buf, lenp, ppos);
-       if (ret < 0 || !write)
-               return ret;
-
-       pipe_max_size = round_pipe_size(pipe_max_size);
-       return ret;
+       return proc_dopipe_max_size(table, write, buf, lenp, ppos);
 }
 
 /*