lkml.org 
[lkml]   [2020]   [Jul]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 02/26] net/bpfilter: split __bpfilter_process_sockopt
    Date
    Split __bpfilter_process_sockopt into a low-level send request routine and
    the actual setsockopt hook to split the init time ping from the actual
    setsockopt processing.

    Signed-off-by: Christoph Hellwig <hch@lst.de>
    ---
    net/bpfilter/bpfilter_kern.c | 51 +++++++++++++++++++-----------------
    1 file changed, 27 insertions(+), 24 deletions(-)

    diff --git a/net/bpfilter/bpfilter_kern.c b/net/bpfilter/bpfilter_kern.c
    index 3bac5820062af1..78d561f2c54da7 100644
    --- a/net/bpfilter/bpfilter_kern.c
    +++ b/net/bpfilter/bpfilter_kern.c
    @@ -31,48 +31,51 @@ static void __stop_umh(void)
    shutdown_umh();
    }

    -static int __bpfilter_process_sockopt(struct sock *sk, int optname,
    - char __user *optval,
    - unsigned int optlen, bool is_set)
    +static int bpfilter_send_req(struct mbox_request *req)
    {
    - struct mbox_request req;
    struct mbox_reply reply;
    loff_t pos;
    ssize_t n;
    - int ret = -EFAULT;

    - req.is_set = is_set;
    - req.pid = current->pid;
    - req.cmd = optname;
    - req.addr = (uintptr_t)optval;
    - req.len = optlen;
    if (!bpfilter_ops.info.tgid)
    - goto out;
    + return -EFAULT;
    pos = 0;
    - n = kernel_write(bpfilter_ops.info.pipe_to_umh, &req, sizeof(req),
    + n = kernel_write(bpfilter_ops.info.pipe_to_umh, req, sizeof(*req),
    &pos);
    - if (n != sizeof(req)) {
    + if (n != sizeof(*req)) {
    pr_err("write fail %zd\n", n);
    - __stop_umh();
    - ret = -EFAULT;
    - goto out;
    + goto stop;
    }
    pos = 0;
    n = kernel_read(bpfilter_ops.info.pipe_from_umh, &reply, sizeof(reply),
    &pos);
    if (n != sizeof(reply)) {
    pr_err("read fail %zd\n", n);
    - __stop_umh();
    - ret = -EFAULT;
    - goto out;
    + goto stop;
    }
    - ret = reply.status;
    -out:
    - return ret;
    + return reply.status;
    +stop:
    + __stop_umh();
    + return -EFAULT;
    +}
    +
    +static int bpfilter_process_sockopt(struct sock *sk, int optname,
    + char __user *optval, unsigned int optlen,
    + bool is_set)
    +{
    + struct mbox_request req = {
    + .is_set = is_set,
    + .pid = current->pid,
    + .cmd = optname,
    + .addr = (uintptr_t)optval,
    + .len = optlen,
    + };
    + return bpfilter_send_req(&req);
    }

    static int start_umh(void)
    {
    + struct mbox_request req = { .pid = current->pid };
    int err;

    /* fork usermode process */
    @@ -82,7 +85,7 @@ static int start_umh(void)
    pr_info("Loaded bpfilter_umh pid %d\n", pid_nr(bpfilter_ops.info.tgid));

    /* health check that usermode process started correctly */
    - if (__bpfilter_process_sockopt(NULL, 0, NULL, 0, 0) != 0) {
    + if (bpfilter_send_req(&req) != 0) {
    shutdown_umh();
    return -EFAULT;
    }
    @@ -103,7 +106,7 @@ static int __init load_umh(void)
    mutex_lock(&bpfilter_ops.lock);
    err = start_umh();
    if (!err && IS_ENABLED(CONFIG_INET)) {
    - bpfilter_ops.sockopt = &__bpfilter_process_sockopt;
    + bpfilter_ops.sockopt = &bpfilter_process_sockopt;
    bpfilter_ops.start = &start_umh;
    }
    mutex_unlock(&bpfilter_ops.lock);
    --
    2.27.0
    \
     
     \ /
      Last update: 2020-07-23 08:14    [W:4.049 / U:0.196 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site