kfree(kf);
 }
 
+static size_t iio_kfifo_buf_space_available(struct iio_buffer *r)
+{
+       struct iio_kfifo *kf = iio_to_kfifo(r);
+       size_t avail;
+
+       mutex_lock(&kf->user_lock);
+       avail = kfifo_avail(&kf->kf);
+       mutex_unlock(&kf->user_lock);
+
+       return avail;
+}
+
+static int iio_kfifo_remove_from(struct iio_buffer *r, void *data)
+{
+       int ret;
+       struct iio_kfifo *kf = iio_to_kfifo(r);
+
+       if (kfifo_size(&kf->kf) < 1)
+               return -EBUSY;
+
+       ret = kfifo_out(&kf->kf, data, 1);
+       if (ret != 1)
+               return -EBUSY;
+
+       wake_up_interruptible_poll(&r->pollq, EPOLLOUT | EPOLLWRNORM);
+
+       return 0;
+}
+
+static int iio_kfifo_write(struct iio_buffer *r, size_t n,
+       const char __user *buf)
+{
+       struct iio_kfifo *kf = iio_to_kfifo(r);
+       int ret, copied;
+
+       mutex_lock(&kf->user_lock);
+       if (!kfifo_initialized(&kf->kf) || n < kfifo_esize(&kf->kf))
+               ret = -EINVAL;
+       else
+               ret = kfifo_from_user(&kf->kf, buf, n, &copied);
+       mutex_unlock(&kf->user_lock);
+       if (ret)
+               return ret;
+
+       return copied;
+}
+
 static const struct iio_buffer_access_funcs kfifo_access_funcs = {
        .store_to = &iio_store_to_kfifo,
        .read = &iio_read_kfifo,
        .data_available = iio_kfifo_buf_data_available,
+       .remove_from = &iio_kfifo_remove_from,
+       .write = &iio_kfifo_write,
+       .space_available = &iio_kfifo_buf_space_available,
        .request_update = &iio_request_update_kfifo,
        .set_bytes_per_datum = &iio_set_bytes_per_datum_kfifo,
        .set_length = &iio_set_length_kfifo,