mutex_lock(&data->lock);
 
+       err = iio_triggered_buffer_postenable(indio_dev);
+       if (err < 0) {
+               mutex_unlock(&data->lock);
+               return err;
+       }
+
        /*
         * Enable triggers according to the scan_mask. Enabling either
         * LIGHT_CLEAR or LIGHT_IR scan mode results in enabling ALS
                goto error_unlock;
 
        data->buffer = kmalloc(indio_dev->scan_bytes, GFP_KERNEL);
-       if (!data->buffer) {
+       if (!data->buffer)
                err = -ENOMEM;
-               goto error_unlock;
-       }
-
-       err = iio_triggered_buffer_postenable(indio_dev);
 
 error_unlock:
+       if (err < 0)
+               iio_triggered_buffer_predisable(indio_dev);
        mutex_unlock(&data->lock);
 
        return err;
 static int gp2ap020a00f_buffer_predisable(struct iio_dev *indio_dev)
 {
        struct gp2ap020a00f_data *data = iio_priv(indio_dev);
-       int i, err;
+       int i, err = 0;
 
        mutex_lock(&data->lock);
 
-       err = iio_triggered_buffer_predisable(indio_dev);
-       if (err < 0)
-               goto error_unlock;
-
        for_each_set_bit(i, indio_dev->active_scan_mask,
                indio_dev->masklength) {
                switch (i) {
        if (err == 0)
                kfree(data->buffer);
 
-error_unlock:
+       iio_triggered_buffer_predisable(indio_dev);
+
        mutex_unlock(&data->lock);
 
        return err;