aboutsummaryrefslogtreecommitdiffstats
path: root/fs/aio.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/aio.c')
-rw-r--r--fs/aio.c32
1 files changed, 7 insertions, 25 deletions
diff --git a/fs/aio.c b/fs/aio.c
index d6b1551342b7..edfca5b75535 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -398,7 +398,7 @@ static struct kiocb fastcall *__aio_get_req(struct kioctx *ctx)
398 if (unlikely(!req)) 398 if (unlikely(!req))
399 return NULL; 399 return NULL;
400 400
401 req->ki_flags = 1 << KIF_LOCKED; 401 req->ki_flags = 0;
402 req->ki_users = 2; 402 req->ki_users = 2;
403 req->ki_key = 0; 403 req->ki_key = 0;
404 req->ki_ctx = ctx; 404 req->ki_ctx = ctx;
@@ -547,25 +547,6 @@ struct kioctx *lookup_ioctx(unsigned long ctx_id)
547 return ioctx; 547 return ioctx;
548} 548}
549 549
550static int lock_kiocb_action(void *param)
551{
552 schedule();
553 return 0;
554}
555
556static inline void lock_kiocb(struct kiocb *iocb)
557{
558 wait_on_bit_lock(&iocb->ki_flags, KIF_LOCKED, lock_kiocb_action,
559 TASK_UNINTERRUPTIBLE);
560}
561
562static inline void unlock_kiocb(struct kiocb *iocb)
563{
564 kiocbClearLocked(iocb);
565 smp_mb__after_clear_bit();
566 wake_up_bit(&iocb->ki_flags, KIF_LOCKED);
567}
568
569/* 550/*
570 * use_mm 551 * use_mm
571 * Makes the calling kernel thread take on the specified 552 * Makes the calling kernel thread take on the specified
@@ -796,9 +777,7 @@ static int __aio_run_iocbs(struct kioctx *ctx)
796 * Hold an extra reference while retrying i/o. 777 * Hold an extra reference while retrying i/o.
797 */ 778 */
798 iocb->ki_users++; /* grab extra reference */ 779 iocb->ki_users++; /* grab extra reference */
799 lock_kiocb(iocb);
800 aio_run_iocb(iocb); 780 aio_run_iocb(iocb);
801 unlock_kiocb(iocb);
802 if (__aio_put_req(ctx, iocb)) /* drop extra ref */ 781 if (__aio_put_req(ctx, iocb)) /* drop extra ref */
803 put_ioctx(ctx); 782 put_ioctx(ctx);
804 } 783 }
@@ -1418,6 +1397,9 @@ static ssize_t aio_setup_iocb(struct kiocb *kiocb)
1418 if (unlikely(!access_ok(VERIFY_WRITE, kiocb->ki_buf, 1397 if (unlikely(!access_ok(VERIFY_WRITE, kiocb->ki_buf,
1419 kiocb->ki_left))) 1398 kiocb->ki_left)))
1420 break; 1399 break;
1400 ret = security_file_permission(file, MAY_READ);
1401 if (unlikely(ret))
1402 break;
1421 ret = -EINVAL; 1403 ret = -EINVAL;
1422 if (file->f_op->aio_read) 1404 if (file->f_op->aio_read)
1423 kiocb->ki_retry = aio_pread; 1405 kiocb->ki_retry = aio_pread;
@@ -1430,6 +1412,9 @@ static ssize_t aio_setup_iocb(struct kiocb *kiocb)
1430 if (unlikely(!access_ok(VERIFY_READ, kiocb->ki_buf, 1412 if (unlikely(!access_ok(VERIFY_READ, kiocb->ki_buf,
1431 kiocb->ki_left))) 1413 kiocb->ki_left)))
1432 break; 1414 break;
1415 ret = security_file_permission(file, MAY_WRITE);
1416 if (unlikely(ret))
1417 break;
1433 ret = -EINVAL; 1418 ret = -EINVAL;
1434 if (file->f_op->aio_write) 1419 if (file->f_op->aio_write)
1435 kiocb->ki_retry = aio_pwrite; 1420 kiocb->ki_retry = aio_pwrite;
@@ -1542,7 +1527,6 @@ int fastcall io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
1542 1527
1543 spin_lock_irq(&ctx->ctx_lock); 1528 spin_lock_irq(&ctx->ctx_lock);
1544 aio_run_iocb(req); 1529 aio_run_iocb(req);
1545 unlock_kiocb(req);
1546 if (!list_empty(&ctx->run_list)) { 1530 if (!list_empty(&ctx->run_list)) {
1547 /* drain the run list */ 1531 /* drain the run list */
1548 while (__aio_run_iocbs(ctx)) 1532 while (__aio_run_iocbs(ctx))
@@ -1674,7 +1658,6 @@ asmlinkage long sys_io_cancel(aio_context_t ctx_id, struct iocb __user *iocb,
1674 if (NULL != cancel) { 1658 if (NULL != cancel) {
1675 struct io_event tmp; 1659 struct io_event tmp;
1676 pr_debug("calling cancel\n"); 1660 pr_debug("calling cancel\n");
1677 lock_kiocb(kiocb);
1678 memset(&tmp, 0, sizeof(tmp)); 1661 memset(&tmp, 0, sizeof(tmp));
1679 tmp.obj = (u64)(unsigned long)kiocb->ki_obj.user; 1662 tmp.obj = (u64)(unsigned long)kiocb->ki_obj.user;
1680 tmp.data = kiocb->ki_user_data; 1663 tmp.data = kiocb->ki_user_data;
@@ -1686,7 +1669,6 @@ asmlinkage long sys_io_cancel(aio_context_t ctx_id, struct iocb __user *iocb,
1686 if (copy_to_user(result, &tmp, sizeof(tmp))) 1669 if (copy_to_user(result, &tmp, sizeof(tmp)))
1687 ret = -EFAULT; 1670 ret = -EFAULT;
1688 } 1671 }
1689 unlock_kiocb(kiocb);
1690 } else 1672 } else
1691 ret = -EINVAL; 1673 ret = -EINVAL;
1692 1674