vhost: don't hold onto file pointer for VHOST_SET_LOG_FD
[muen/linux.git] / drivers / vhost / vhost.c
index 40a72d15361fac7de5f9efb6675d6e156c68abf1..66775446248a79deefa805d331c1312845741141 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;