diff options
author | Jens Axboe <axboe@suse.de> | 2006-05-02 15:29:57 +0200 |
---|---|---|
committer | Jens Axboe <axboe@suse.de> | 2006-05-02 15:29:57 +0200 |
commit | 330ab71619bacc4d4494227a6cfc9b7f5500403d (patch) | |
tree | 43a9045011116f1afa506b80de1ede9872f45935 | |
parent | a893b99be71f1d669b74f840e3a683dd077d007b (diff) | |
download | op-kernel-dev-330ab71619bacc4d4494227a6cfc9b7f5500403d.zip op-kernel-dev-330ab71619bacc4d4494227a6cfc9b7f5500403d.tar.gz |
[PATCH] vmsplice: restrict stealing a little more
Apply the same rules as the anon pipe pages, only allow stealing
if no one else is using the page.
Signed-off-by: Jens Axboe <axboe@suse.de>
-rw-r--r-- | fs/pipe.c | 6 | ||||
-rw-r--r-- | fs/splice.c | 2 | ||||
-rw-r--r-- | include/linux/pipe_fs_i.h | 1 |
3 files changed, 5 insertions, 4 deletions
@@ -184,8 +184,8 @@ void generic_pipe_buf_unmap(struct pipe_inode_info *pipe, kunmap(buf->page); } -static int anon_pipe_buf_steal(struct pipe_inode_info *pipe, - struct pipe_buffer *buf) +int generic_pipe_buf_steal(struct pipe_inode_info *pipe, + struct pipe_buffer *buf) { struct page *page = buf->page; @@ -213,7 +213,7 @@ static struct pipe_buf_operations anon_pipe_buf_ops = { .unmap = generic_pipe_buf_unmap, .pin = generic_pipe_buf_pin, .release = anon_pipe_buf_release, - .steal = anon_pipe_buf_steal, + .steal = generic_pipe_buf_steal, .get = generic_pipe_buf_get, }; diff --git a/fs/splice.c b/fs/splice.c index 3318b96..7fb0497 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -141,7 +141,7 @@ static int user_page_pipe_buf_steal(struct pipe_inode_info *pipe, if (!(buf->flags & PIPE_BUF_FLAG_GIFT)) return 1; - return 0; + return generic_pipe_buf_steal(pipe, buf); } static struct pipe_buf_operations user_page_pipe_buf_ops = { diff --git a/include/linux/pipe_fs_i.h b/include/linux/pipe_fs_i.h index 070954f..ba73108 100644 --- a/include/linux/pipe_fs_i.h +++ b/include/linux/pipe_fs_i.h @@ -69,6 +69,7 @@ void *generic_pipe_buf_map(struct pipe_inode_info *, struct pipe_buffer *, int); void generic_pipe_buf_unmap(struct pipe_inode_info *, struct pipe_buffer *, void *); void generic_pipe_buf_get(struct pipe_inode_info *, struct pipe_buffer *); int generic_pipe_buf_pin(struct pipe_inode_info *, struct pipe_buffer *); +int generic_pipe_buf_steal(struct pipe_inode_info *, struct pipe_buffer *); /* * splice is tied to pipes as a transport (at least for now), so we'll just |