Messages in this thread Patch in this message | | | From | Arnd Bergmann <> | Subject | [PATCH] cris: fix locking in pcf8563.c | Date | Wed, 9 Mar 2011 12:55:28 +0100 |
| |
The ioctl function was incorrectly converted to unlocked_ioctl, this fixes the locking.
Reported-by: Michael Brumlow <mbrumlow@gmail.com> Signed-off-by: Arnd Bergmann <arnd@arndb.de> --- On Wednesday 09 March 2011, Michael Brumlow wrote:
> I was looking through some code and found an issue in the driver you > wrote. The problem can be found in > "arch/cris/arch-v10/drivers/pcf8563.c" function > "pcf8563_unlocked_ioctl". The function locks a mutex and returns, when > it should be locking the locking the mutex, storing the return from > the function called and then unlocking the mutex and finally returning > the stored value of the function called. > > # in its current state. > 343 static long pcf8563_unlocked_ioctl(struct file *filp, unsigned > int cmd, unsigned long arg) > 344 { > 345 int ret; > 346 > 347 mutex_lock(&pcf8563_mutex); > 348 return pcf8563_ioctl(filp, cmd, arg); > 349 mutex_unlock(&pcf8563_mutex); > 350 > 351 return ret; > 352 } > > # what is suggested. > 343 static long pcf8563_unlocked_ioctl(struct file *filp, unsigned > int cmd, unsigned long arg) > 344 { > 345 int ret; > 346 > 347 mutex_lock(&pcf8563_mutex); > 348 ret = pcf8563_ioctl(filp, cmd, arg); > 349 mutex_unlock(&pcf8563_mutex); > 350 > 351 return ret; > 352 }
You are right. This problem exists in both arch/cris/arch-v10/drivers/pcf8563.c and arch/cris/arch-v32/drivers/pcf8563.c, and apparently both are my fault.
Arnd --- diff --git a/arch/cris/arch-v10/drivers/pcf8563.c b/arch/cris/arch-v10/drivers/pcf8563.c index ea69fab..1391b73 100644 --- a/arch/cris/arch-v10/drivers/pcf8563.c +++ b/arch/cris/arch-v10/drivers/pcf8563.c @@ -345,7 +345,7 @@ static long pcf8563_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned int ret; mutex_lock(&pcf8563_mutex); - return pcf8563_ioctl(filp, cmd, arg); + ret = pcf8563_ioctl(filp, cmd, arg); mutex_unlock(&pcf8563_mutex); return ret; diff --git a/arch/cris/arch-v32/drivers/pcf8563.c b/arch/cris/arch-v32/drivers/pcf8563.c index b6e4fc0..208594f 100644 --- a/arch/cris/arch-v32/drivers/pcf8563.c +++ b/arch/cris/arch-v32/drivers/pcf8563.c @@ -341,7 +341,7 @@ static long pcf8563_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned int ret; mutex_lock(&pcf8563_mutex); - return pcf8563_ioctl(filp, cmd, arg); + ret = pcf8563_ioctl(filp, cmd, arg); mutex_unlock(&pcf8563_mutex); return ret;
| |