]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
io_uring: honor original task RLIMIT_FSIZE
authorJens Axboe <axboe@kernel.dk>
Fri, 20 Mar 2020 17:23:41 +0000 (11:23 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 17 Apr 2020 14:12:09 +0000 (16:12 +0200)
commit 4ed734b0d0913e566a9d871e15d24eb240f269f7 upstream.

With the previous fixes for number of files open checking, I added some
debug code to see if we had other spots where we're checking rlimit()
against the async io-wq workers. The only one I found was file size
checking, which we should also honor.

During write and fallocate prep, store the max file size and override
that for the current ask if we're in io-wq worker context.

Cc: stable@vger.kernel.org # 5.1+
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/io_uring.c

index c5d5a7293822f94f522cf1853d94e77e55c6372b..b9777ce36a9b78b448239149c40980f1ffc753b2 100644 (file)
@@ -432,6 +432,7 @@ struct io_kiocb {
 #define REQ_F_INFLIGHT         16384   /* on inflight list */
 #define REQ_F_COMP_LOCKED      32768   /* completion under lock */
 #define REQ_F_HARDLINK         65536   /* doesn't sever on completion < 0 */
+       unsigned long           fsize;
        u64                     user_data;
        u32                     result;
        u32                     sequence;
@@ -1899,6 +1900,8 @@ static int io_write_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe,
        if (unlikely(!(req->file->f_mode & FMODE_WRITE)))
                return -EBADF;
 
+       req->fsize = rlimit(RLIMIT_FSIZE);
+
        if (!req->io)
                return 0;
 
@@ -1970,10 +1973,17 @@ static int io_write(struct io_kiocb *req, struct io_kiocb **nxt,
                }
                kiocb->ki_flags |= IOCB_WRITE;
 
+               if (!force_nonblock)
+                       current->signal->rlim[RLIMIT_FSIZE].rlim_cur = req->fsize;
+
                if (req->file->f_op->write_iter)
                        ret2 = call_write_iter(req->file, kiocb, &iter);
                else
                        ret2 = loop_rw_iter(WRITE, req->file, kiocb, &iter);
+
+               if (!force_nonblock)
+                       current->signal->rlim[RLIMIT_FSIZE].rlim_cur = RLIM_INFINITY;
+
                /*
                 * Raw bdev writes will -EOPNOTSUPP for IOCB_NOWAIT. Just
                 * retry them without IOCB_NOWAIT.