X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fw1%2Fslaves%2Fw1_therm.c;h=536d16d78de75ce313fa7f4f2b394e2617f4033e;hb=9464c7cf61b9433057924c36e6e02f303a00e768;hp=5372cfcbd0543aa1e8e5622f824682af9b87d530;hpb=41689045f6a3cbe0550e1d34e9cc20d2e8c432ba;p=linux-2.6.git diff --git a/drivers/w1/slaves/w1_therm.c b/drivers/w1/slaves/w1_therm.c index 5372cfcbd..536d16d78 100644 --- a/drivers/w1/slaves/w1_therm.c +++ b/drivers/w1/slaves/w1_therm.c @@ -29,6 +29,7 @@ #include #include "../w1.h" +#include "../w1_io.h" #include "../w1_int.h" #include "../w1_family.h" @@ -165,7 +166,12 @@ static ssize_t w1_therm_read_bin(struct kobject *kobj, char *buf, loff_t off, si u8 rom[9], crc, verdict; int i, max_trying = 10; - mutex_lock(&sl->master->mutex); + atomic_inc(&sl->refcnt); + smp_mb__after_atomic_inc(); + if (down_interruptible(&sl->master->mutex)) { + count = 0; + goto out_dec; + } if (off > W1_SLAVE_DATA_SIZE) { count = 0; @@ -228,7 +234,10 @@ static ssize_t w1_therm_read_bin(struct kobject *kobj, char *buf, loff_t off, si count += sprintf(buf + count, "t=%d\n", w1_convert_temp(rom, sl->family->fid)); out: - mutex_unlock(&dev->mutex); + up(&dev->mutex); +out_dec: + smp_mb__before_atomic_inc(); + atomic_dec(&sl->refcnt); return count; }