char *buf)
 {
        int ret;
-       struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct iio_buffer *buffer = indio_dev->buffer;
+       struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer;
 
        /* Ensure ret is 0 or 1. */
        ret = !!test_bit(to_iio_dev_attr(attr)->address,
        int ret;
        bool state;
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct iio_buffer *buffer = indio_dev->buffer;
        struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
+       struct iio_buffer *buffer = this_attr->buffer;
 
        ret = strtobool(buf, &state);
        if (ret < 0)
                                   struct device_attribute *attr,
                                   char *buf)
 {
-       struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct iio_buffer *buffer = indio_dev->buffer;
+       struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer;
 
        return sprintf(buf, "%d\n", buffer->scan_timestamp);
 }
 {
        int ret;
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct iio_buffer *buffer = indio_dev->buffer;
+       struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer;
        bool state;
 
        ret = strtobool(buf, &state);
                                     IIO_SEPARATE,
                                     &indio_dev->dev,
                                     buffer,
-                                    &buffer->scan_el_dev_attr_list);
+                                    &buffer->buffer_attr_list);
        if (ret)
                return ret;
        attrcount++;
                                     0,
                                     &indio_dev->dev,
                                     buffer,
-                                    &buffer->scan_el_dev_attr_list);
+                                    &buffer->buffer_attr_list);
        if (ret)
                return ret;
        attrcount++;
                                             0,
                                             &indio_dev->dev,
                                             buffer,
-                                            &buffer->scan_el_dev_attr_list);
+                                            &buffer->buffer_attr_list);
        else
                ret = __iio_add_chan_devattr("en",
                                             chan,
                                             0,
                                             &indio_dev->dev,
                                             buffer,
-                                            &buffer->scan_el_dev_attr_list);
+                                            &buffer->buffer_attr_list);
        if (ret)
                return ret;
        attrcount++;
                                      struct device_attribute *attr,
                                      char *buf)
 {
-       struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct iio_buffer *buffer = indio_dev->buffer;
+       struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer;
 
        return sprintf(buf, "%d\n", buffer->length);
 }
                                       const char *buf, size_t len)
 {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct iio_buffer *buffer = indio_dev->buffer;
+       struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer;
        unsigned int val;
        int ret;
 
                                      struct device_attribute *attr,
                                      char *buf)
 {
-       struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct iio_buffer *buffer = indio_dev->buffer;
+       struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer;
 
        return sprintf(buf, "%d\n", iio_buffer_is_active(buffer));
 }
        int ret;
        bool requested_state;
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct iio_buffer *buffer = indio_dev->buffer;
+       struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer;
        bool inlist;
 
        ret = strtobool(buf, &requested_state);
                                         struct device_attribute *attr,
                                         char *buf)
 {
-       struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct iio_buffer *buffer = indio_dev->buffer;
+       struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer;
 
        return sprintf(buf, "%u\n", buffer->watermark);
 }
                                          size_t len)
 {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct iio_buffer *buffer = indio_dev->buffer;
+       struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer;
        unsigned int val;
        int ret;
 
                                                struct device_attribute *attr,
                                                char *buf)
 {
-       struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct iio_buffer *buffer = indio_dev->buffer;
+       struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer;
 
        return sprintf(buf, "%zu\n", iio_buffer_data_available(buffer));
 }
        &dev_attr_data_available.attr,
 };
 
+#define to_dev_attr(_attr) container_of(_attr, struct device_attribute, attr)
+
+static struct attribute *iio_buffer_wrap_attr(struct iio_buffer *buffer,
+                                             struct attribute *attr)
+{
+       struct device_attribute *dattr = to_dev_attr(attr);
+       struct iio_dev_attr *iio_attr;
+
+       iio_attr = kzalloc(sizeof(*iio_attr), GFP_KERNEL);
+       if (!iio_attr)
+               return NULL;
+
+       iio_attr->buffer = buffer;
+       memcpy(&iio_attr->dev_attr, dattr, sizeof(iio_attr->dev_attr));
+       iio_attr->dev_attr.attr.name = kstrdup_const(attr->name, GFP_KERNEL);
+
+       list_add(&iio_attr->l, &buffer->buffer_attr_list);
+
+       return &iio_attr->dev_attr.attr;
+}
+
 static int iio_buffer_register_legacy_sysfs_groups(struct iio_dev *indio_dev,
                                                   struct attribute **buffer_attrs,
                                                   int buffer_attrcount,
        }
 
        scan_el_attrcount = 0;
-       INIT_LIST_HEAD(&buffer->scan_el_dev_attr_list);
+       INIT_LIST_HEAD(&buffer->buffer_attr_list);
        channels = indio_dev->channels;
        if (channels) {
                /* new magic */
 
        buffer_attrcount += ARRAY_SIZE(iio_buffer_attrs);
 
-       attrn = buffer_attrcount;
+       for (i = 0; i < buffer_attrcount; i++) {
+               struct attribute *wrapped;
+
+               wrapped = iio_buffer_wrap_attr(buffer, attr[i]);
+               if (!wrapped) {
+                       ret = -ENOMEM;
+                       goto error_free_scan_mask;
+               }
+               attr[i] = wrapped;
+       }
 
-       list_for_each_entry(p, &buffer->scan_el_dev_attr_list, l)
+       attrn = 0;
+       list_for_each_entry(p, &buffer->buffer_attr_list, l)
                attr[attrn++] = &p->dev_attr.attr;
 
        buffer->buffer_group.name = kasprintf(GFP_KERNEL, "buffer%d", index);
 error_free_scan_mask:
        bitmap_free(buffer->scan_mask);
 error_cleanup_dynamic:
-       iio_free_chan_devattr_list(&buffer->scan_el_dev_attr_list);
+       iio_free_chan_devattr_list(&buffer->buffer_attr_list);
 
        return ret;
 }
        bitmap_free(buffer->scan_mask);
        kfree(buffer->buffer_group.name);
        kfree(buffer->buffer_group.attrs);
-       iio_free_chan_devattr_list(&buffer->scan_el_dev_attr_list);
+       iio_free_chan_devattr_list(&buffer->buffer_attr_list);
 }
 
 void iio_buffer_free_sysfs_and_mask(struct iio_dev *indio_dev)