vhost: don't hold onto file pointer for VHOST_SET_LOG_FD
authorEric Biggers <ebiggers@google.com>
Sat, 6 Jan 2018 22:52:21 +0000 (14:52 -0800)
committerMichael S. Tsirkin <mst@redhat.com>
Thu, 1 Feb 2018 14:26:47 +0000 (16:26 +0200)
We already hold a reference to the eventfd_ctx, which is sufficient;
there's no need to hold a reference to the struct file as well.  So get
rid of vhost_dev->log_file.

Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Jason Wang <jasowang@redhat.com>
drivers/vhost/vhost.c
drivers/vhost/vhost.h

index 40a72d1..6677544 100644 (file)
@@ -419,7 +419,6 @@ void vhost_dev_init(struct vhost_dev *dev,
        dev->nvqs = nvqs;
        mutex_init(&dev->mutex);
        dev->log_ctx = NULL;
-       dev->log_file = NULL;
        dev->umem = NULL;
        dev->iotlb = NULL;
        dev->mm = NULL;
@@ -625,9 +624,6 @@ void vhost_dev_cleanup(struct vhost_dev *dev)
        if (dev->log_ctx)
                eventfd_ctx_put(dev->log_ctx);
        dev->log_ctx = NULL;
-       if (dev->log_file)
-               fput(dev->log_file);
-       dev->log_file = NULL;
        /* No one will access memory at this point */
        vhost_umem_clean(dev->umem);
        dev->umem = NULL;
@@ -1572,8 +1568,7 @@ EXPORT_SYMBOL_GPL(vhost_init_device_iotlb);
 /* Caller must have device mutex */
 long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *argp)
 {
-       struct file *eventfp, *filep = NULL;
-       struct eventfd_ctx *ctx = NULL;
+       struct eventfd_ctx *ctx;
        u64 p;
        long r;
        int i, fd;
@@ -1619,19 +1614,12 @@ long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *argp)
                r = get_user(fd, (int __user *)argp);
                if (r < 0)
                        break;
-               eventfp = fd == -1 ? NULL : eventfd_fget(fd);
-               if (IS_ERR(eventfp)) {
-                       r = PTR_ERR(eventfp);
+               ctx = fd == -1 ? NULL : eventfd_ctx_fdget(fd);
+               if (IS_ERR(ctx)) {
+                       r = PTR_ERR(ctx);
                        break;
                }
-               if (eventfp != d->log_file) {
-                       filep = d->log_file;
-                       d->log_file = eventfp;
-                       ctx = d->log_ctx;
-                       d->log_ctx = eventfp ?
-                               eventfd_ctx_fileget(eventfp) : NULL;
-               } else
-                       filep = eventfp;
+               swap(ctx, d->log_ctx);
                for (i = 0; i < d->nvqs; ++i) {
                        mutex_lock(&d->vqs[i]->mutex);
                        d->vqs[i]->log_ctx = d->log_ctx;
@@ -1639,8 +1627,6 @@ long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *argp)
                }
                if (ctx)
                        eventfd_ctx_put(ctx);
-               if (filep)
-                       fput(filep);
                break;
        default:
                r = -ENOIOCTLCMD;
index e3c463c..45d12b0 100644 (file)
@@ -157,7 +157,6 @@ struct vhost_dev {
        struct mutex mutex;
        struct vhost_virtqueue **vqs;
        int nvqs;
-       struct file *log_file;
        struct eventfd_ctx *log_ctx;
        struct llist_head work_list;
        struct task_struct *worker;