extern struct device_type iio_device_type;
 
+struct iio_dev_buffer_pair {
+       struct iio_dev          *indio_dev;
+       struct iio_buffer       *buffer;
+};
+
 #define IIO_IOCTL_UNHANDLED    1
 struct iio_ioctl_handler {
        struct list_head entry;
 
 ssize_t iio_buffer_read_outer(struct file *filp, char __user *buf,
                              size_t n, loff_t *f_ps)
 {
-       struct iio_dev *indio_dev = filp->private_data;
-       struct iio_buffer *rb = indio_dev->buffer;
+       struct iio_dev_buffer_pair *ib = filp->private_data;
+       struct iio_buffer *rb = ib->buffer;
+       struct iio_dev *indio_dev = ib->indio_dev;
        DEFINE_WAIT_FUNC(wait, woken_wake_function);
        size_t datum_size;
        size_t to_wait;
 __poll_t iio_buffer_poll(struct file *filp,
                             struct poll_table_struct *wait)
 {
-       struct iio_dev *indio_dev = filp->private_data;
-       struct iio_buffer *rb = indio_dev->buffer;
+       struct iio_dev_buffer_pair *ib = filp->private_data;
+       struct iio_buffer *rb = ib->buffer;
+       struct iio_dev *indio_dev = ib->indio_dev;
 
        if (!indio_dev->info || rb == NULL)
                return 0;
 
 {
        struct iio_dev *indio_dev = container_of(inode->i_cdev,
                                                struct iio_dev, chrdev);
+       struct iio_dev_buffer_pair *ib;
 
        if (test_and_set_bit(IIO_BUSY_BIT_POS, &indio_dev->flags))
                return -EBUSY;
 
        iio_device_get(indio_dev);
 
-       filp->private_data = indio_dev;
+       ib = kmalloc(sizeof(*ib), GFP_KERNEL);
+       if (!ib) {
+               iio_device_put(indio_dev);
+               clear_bit(IIO_BUSY_BIT_POS, &indio_dev->flags);
+               return -ENOMEM;
+       }
+
+       ib->indio_dev = indio_dev;
+       ib->buffer = indio_dev->buffer;
+
+       filp->private_data = ib;
 
        return 0;
 }
  */
 static int iio_chrdev_release(struct inode *inode, struct file *filp)
 {
+       struct iio_dev_buffer_pair *ib = filp->private_data;
        struct iio_dev *indio_dev = container_of(inode->i_cdev,
                                                struct iio_dev, chrdev);
+       kfree(ib);
        clear_bit(IIO_BUSY_BIT_POS, &indio_dev->flags);
        iio_device_put(indio_dev);
 
 
 static long iio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 {
-       struct iio_dev *indio_dev = filp->private_data;
+       struct iio_dev_buffer_pair *ib = filp->private_data;
+       struct iio_dev *indio_dev = ib->indio_dev;
        struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev);
        struct iio_ioctl_handler *h;
        int ret = -ENODEV;