diff options
author | Jens Axboe <jaxboe@fusionio.com> | 2010-06-01 06:42:12 -0400 |
---|---|---|
committer | Jens Axboe <jaxboe@fusionio.com> | 2010-06-01 06:42:12 -0400 |
commit | b4ca761577535b2b4d153689ee97342797dfff05 (patch) | |
tree | 29054d55508f1faa22ec32acf7c245751af03348 /fs/pipe.c | |
parent | 28f4197e5d4707311febeec8a0eb97cb5fd93c97 (diff) | |
parent | 67a3e12b05e055c0415c556a315a3d3eb637e29e (diff) |
Merge branch 'master' into for-linus
Conflicts:
fs/pipe.c
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
Diffstat (limited to 'fs/pipe.c')
-rw-r--r-- | fs/pipe.c | 21 |
1 files changed, 16 insertions, 5 deletions
@@ -230,6 +230,7 @@ void *generic_pipe_buf_map(struct pipe_inode_info *pipe, | |||
230 | 230 | ||
231 | return kmap(buf->page); | 231 | return kmap(buf->page); |
232 | } | 232 | } |
233 | EXPORT_SYMBOL(generic_pipe_buf_map); | ||
233 | 234 | ||
234 | /** | 235 | /** |
235 | * generic_pipe_buf_unmap - unmap a previously mapped pipe buffer | 236 | * generic_pipe_buf_unmap - unmap a previously mapped pipe buffer |
@@ -249,6 +250,7 @@ void generic_pipe_buf_unmap(struct pipe_inode_info *pipe, | |||
249 | } else | 250 | } else |
250 | kunmap(buf->page); | 251 | kunmap(buf->page); |
251 | } | 252 | } |
253 | EXPORT_SYMBOL(generic_pipe_buf_unmap); | ||
252 | 254 | ||
253 | /** | 255 | /** |
254 | * generic_pipe_buf_steal - attempt to take ownership of a &pipe_buffer | 256 | * generic_pipe_buf_steal - attempt to take ownership of a &pipe_buffer |
@@ -279,6 +281,7 @@ int generic_pipe_buf_steal(struct pipe_inode_info *pipe, | |||
279 | 281 | ||
280 | return 1; | 282 | return 1; |
281 | } | 283 | } |
284 | EXPORT_SYMBOL(generic_pipe_buf_steal); | ||
282 | 285 | ||
283 | /** | 286 | /** |
284 | * generic_pipe_buf_get - get a reference to a &struct pipe_buffer | 287 | * generic_pipe_buf_get - get a reference to a &struct pipe_buffer |
@@ -294,6 +297,7 @@ void generic_pipe_buf_get(struct pipe_inode_info *pipe, struct pipe_buffer *buf) | |||
294 | { | 297 | { |
295 | page_cache_get(buf->page); | 298 | page_cache_get(buf->page); |
296 | } | 299 | } |
300 | EXPORT_SYMBOL(generic_pipe_buf_get); | ||
297 | 301 | ||
298 | /** | 302 | /** |
299 | * generic_pipe_buf_confirm - verify contents of the pipe buffer | 303 | * generic_pipe_buf_confirm - verify contents of the pipe buffer |
@@ -309,6 +313,7 @@ int generic_pipe_buf_confirm(struct pipe_inode_info *info, | |||
309 | { | 313 | { |
310 | return 0; | 314 | return 0; |
311 | } | 315 | } |
316 | EXPORT_SYMBOL(generic_pipe_buf_confirm); | ||
312 | 317 | ||
313 | /** | 318 | /** |
314 | * generic_pipe_buf_release - put a reference to a &struct pipe_buffer | 319 | * generic_pipe_buf_release - put a reference to a &struct pipe_buffer |
@@ -323,6 +328,7 @@ void generic_pipe_buf_release(struct pipe_inode_info *pipe, | |||
323 | { | 328 | { |
324 | page_cache_release(buf->page); | 329 | page_cache_release(buf->page); |
325 | } | 330 | } |
331 | EXPORT_SYMBOL(generic_pipe_buf_release); | ||
326 | 332 | ||
327 | static const struct pipe_buf_operations anon_pipe_buf_ops = { | 333 | static const struct pipe_buf_operations anon_pipe_buf_ops = { |
328 | .can_merge = 1, | 334 | .can_merge = 1, |
@@ -1172,16 +1178,20 @@ long pipe_fcntl(struct file *file, unsigned int cmd, unsigned long arg) | |||
1172 | nr_pages = (arg + PAGE_SIZE - 1) >> PAGE_SHIFT; | 1178 | nr_pages = (arg + PAGE_SIZE - 1) >> PAGE_SHIFT; |
1173 | nr_pages = roundup_pow_of_two(nr_pages); | 1179 | nr_pages = roundup_pow_of_two(nr_pages); |
1174 | 1180 | ||
1175 | if (!capable(CAP_SYS_ADMIN) && nr_pages > pipe_max_pages) | 1181 | if (!capable(CAP_SYS_ADMIN) && nr_pages > pipe_max_pages) { |
1176 | return -EPERM; | 1182 | ret = -EPERM; |
1183 | goto out; | ||
1184 | } | ||
1177 | 1185 | ||
1178 | /* | 1186 | /* |
1179 | * The pipe needs to be at least 2 pages large to | 1187 | * The pipe needs to be at least 2 pages large to |
1180 | * guarantee POSIX behaviour. | 1188 | * guarantee POSIX behaviour. |
1181 | */ | 1189 | */ |
1182 | if (nr_pages < 2) | 1190 | if (arg < 2) { |
1183 | return -EINVAL; | 1191 | ret = -EINVAL; |
1184 | ret = pipe_set_size(pipe, nr_pages); | 1192 | goto out; |
1193 | } | ||
1194 | ret = pipe_set_size(pipe, arg); | ||
1185 | break; | 1195 | break; |
1186 | } | 1196 | } |
1187 | case F_GETPIPE_SZ: | 1197 | case F_GETPIPE_SZ: |
@@ -1192,6 +1202,7 @@ long pipe_fcntl(struct file *file, unsigned int cmd, unsigned long arg) | |||
1192 | break; | 1202 | break; |
1193 | } | 1203 | } |
1194 | 1204 | ||
1205 | out: | ||
1195 | mutex_unlock(&pipe->inode->i_mutex); | 1206 | mutex_unlock(&pipe->inode->i_mutex); |
1196 | return ret; | 1207 | return ret; |
1197 | } | 1208 | } |