int ret, max_trying = 10;
        u8 *family_data = sl->family_data;
 
-       ret = mutex_lock_interruptible(&dev->bus_mutex);
-       if (ret != 0)
-               goto post_unlock;
-
        if (!sl->family_data) {
                ret = -ENODEV;
-               goto pre_unlock;
+               goto error;
        }
 
        /* prevent the slave from going away in sleep */
        atomic_inc(THERM_REFCNT(family_data));
+
+       ret = mutex_lock_interruptible(&dev->bus_mutex);
+       if (ret != 0)
+               goto dec_refcnt;
+
        memset(rom, 0, sizeof(rom));
 
        while (max_trying--) {
                                sleep_rem = msleep_interruptible(tm);
                                if (sleep_rem != 0) {
                                        ret = -EINTR;
-                                       goto post_unlock;
+                                       goto dec_refcnt;
                                }
 
                                ret = mutex_lock_interruptible(&dev->bus_mutex);
                                if (ret != 0)
-                                       goto post_unlock;
+                                       goto dec_refcnt;
                        } else if (!w1_strong_pullup) {
                                sleep_rem = msleep_interruptible(tm);
                                if (sleep_rem != 0) {
                                        ret = -EINTR;
-                                       goto pre_unlock;
+                                       goto mt_unlock;
                                }
                        }
 
                }
        }
 
-pre_unlock:
+mt_unlock:
        mutex_unlock(&dev->bus_mutex);
-
-post_unlock:
+dec_refcnt:
        atomic_dec(THERM_REFCNT(family_data));
+error:
        return ret;
 }
 
 
        if (val > 12 || val < 9) {
                pr_warn("Unsupported precision\n");
-               return -1;
+               ret = -EINVAL;
+               goto error;
        }
 
-       ret = mutex_lock_interruptible(&dev->bus_mutex);
-       if (ret != 0)
-               goto post_unlock;
-
        if (!sl->family_data) {
                ret = -ENODEV;
-               goto pre_unlock;
+               goto error;
        }
 
        /* prevent the slave from going away in sleep */
        atomic_inc(THERM_REFCNT(family_data));
+
+       ret = mutex_lock_interruptible(&dev->bus_mutex);
+       if (ret != 0)
+               goto dec_refcnt;
+
        memset(rom, 0, sizeof(rom));
 
        /* translate precision to bitmask (see datasheet page 9) */
                }
        }
 
-pre_unlock:
        mutex_unlock(&dev->bus_mutex);
-
-post_unlock:
+dec_refcnt:
        atomic_dec(THERM_REFCNT(family_data));
+error:
        return ret;
 }
 
        int ret, max_trying = 10;
        u8 *family_data = sl->family_data;
 
-       ret = mutex_lock_interruptible(&dev->bus_mutex);
-       if (ret != 0)
-               goto error;
-
        if (!family_data) {
                ret = -ENODEV;
-               goto mt_unlock;
+               goto error;
        }
 
        /* prevent the slave from going away in sleep */
        atomic_inc(THERM_REFCNT(family_data));
+
+       ret = mutex_lock_interruptible(&dev->bus_mutex);
+       if (ret != 0)
+               goto dec_refcnt;
+
        memset(info->rom, 0, sizeof(info->rom));
 
        while (max_trying--) {
                                sleep_rem = msleep_interruptible(tm);
                                if (sleep_rem != 0) {
                                        ret = -EINTR;
-                                       goto dec_refcnt;
+                                       goto mt_unlock;
                                }
                        }
 
                        break;
        }
 
-dec_refcnt:
-       atomic_dec(THERM_REFCNT(family_data));
 mt_unlock:
        mutex_unlock(&dev->bus_mutex);
+dec_refcnt:
+       atomic_dec(THERM_REFCNT(family_data));
 error:
        return ret;
 }