use guard(mutex) for scope based resource management of mutex.
This would make the code simpler and easier to maintain.

More details on lock guards can be found at
https://lore.kernel.org/all/20230612093537.614161...@infradead.org/T/#u

Signed-off-by: Shrikanth Hegde <sshe...@linux.ibm.com>
---
 arch/powerpc/kernel/rtas_flash.c | 64 ++++++++++----------------------
 1 file changed, 20 insertions(+), 44 deletions(-)

diff --git a/arch/powerpc/kernel/rtas_flash.c b/arch/powerpc/kernel/rtas_flash.c
index 5407024881e5..583dc16e9d3c 100644
--- a/arch/powerpc/kernel/rtas_flash.c
+++ b/arch/powerpc/kernel/rtas_flash.c
@@ -312,13 +312,13 @@ static ssize_t rtas_flash_write(struct file *file, const 
char __user *buffer,
 {
        struct rtas_update_flash_t *const uf = &rtas_update_flash_data;
        char *p;
-       int next_free, rc;
+       int next_free;
        struct flash_block_list *fl;
 
-       mutex_lock(&rtas_update_flash_mutex);
+       guard(mutex)(&rtas_update_flash_mutex);
 
        if (uf->status == FLASH_AUTH || count == 0)
-               goto out;       /* discard data */
+               return count;   /* discard data */
 
        /* In the case that the image is not ready for flashing, the memory
         * allocated for the block list will be freed upon the release of the 
@@ -327,7 +327,7 @@ static ssize_t rtas_flash_write(struct file *file, const 
char __user *buffer,
        if (uf->flist == NULL) {
                uf->flist = kmem_cache_zalloc(flash_block_cache, GFP_KERNEL);
                if (!uf->flist)
-                       goto nomem;
+                       return -ENOMEM;
        }
 
        fl = uf->flist;
@@ -338,7 +338,7 @@ static ssize_t rtas_flash_write(struct file *file, const 
char __user *buffer,
                /* Need to allocate another block_list */
                fl->next = kmem_cache_zalloc(flash_block_cache, GFP_KERNEL);
                if (!fl->next)
-                       goto nomem;
+                       return -ENOMEM;
                fl = fl->next;
                next_free = 0;
        }
@@ -347,25 +347,17 @@ static ssize_t rtas_flash_write(struct file *file, const 
char __user *buffer,
                count = RTAS_BLK_SIZE;
        p = kmem_cache_zalloc(flash_block_cache, GFP_KERNEL);
        if (!p)
-               goto nomem;
+               return -ENOMEM;
        
        if(copy_from_user(p, buffer, count)) {
                kmem_cache_free(flash_block_cache, p);
-               rc = -EFAULT;
-               goto error;
+               return -EFAULT;
        }
        fl->blocks[next_free].data = p;
        fl->blocks[next_free].length = count;
        fl->num_blocks++;
-out:
-       mutex_unlock(&rtas_update_flash_mutex);
-       return count;
 
-nomem:
-       rc = -ENOMEM;
-error:
-       mutex_unlock(&rtas_update_flash_mutex);
-       return rc;
+       return count;
 }
 
 /*
@@ -405,19 +397,18 @@ static ssize_t manage_flash_write(struct file *file, 
const char __user *buf,
        static const char reject_str[] = "0";
        static const char commit_str[] = "1";
        char stkbuf[10];
-       int op, rc;
+       int op;
 
-       mutex_lock(&rtas_manage_flash_mutex);
+       guard(mutex)(&rtas_manage_flash_mutex);
 
        if ((args_buf->status == MANAGE_AUTH) || (count == 0))
-               goto out;
+               return count;
                
        op = -1;
        if (buf) {
                if (count > 9) count = 9;
-               rc = -EFAULT;
                if (copy_from_user (stkbuf, buf, count))
-                       goto error;
+                       return -EFAULT;
                if (strncmp(stkbuf, reject_str, strlen(reject_str)) == 0) 
                        op = RTAS_REJECT_TMP_IMG;
                else if (strncmp(stkbuf, commit_str, strlen(commit_str)) == 0) 
@@ -425,18 +416,11 @@ static ssize_t manage_flash_write(struct file *file, 
const char __user *buf,
        }
        
        if (op == -1) {   /* buf is empty, or contains invalid string */
-               rc = -EINVAL;
-               goto error;
+               return -EINVAL;
        }
 
        manage_flash(args_buf, op);
-out:
-       mutex_unlock(&rtas_manage_flash_mutex);
        return count;
-
-error:
-       mutex_unlock(&rtas_manage_flash_mutex);
-       return rc;
 }
 
 /*
@@ -499,16 +483,14 @@ static ssize_t validate_flash_write(struct file *file, 
const char __user *buf,
 {
        struct rtas_validate_flash_t *const args_buf =
                &rtas_validate_flash_data;
-       int rc;
 
-       mutex_lock(&rtas_validate_flash_mutex);
+       guard(mutex)(&rtas_validate_flash_mutex);
 
        /* We are only interested in the first 4K of the
         * candidate image */
        if ((*off >= VALIDATE_BUF_SIZE) || 
                (args_buf->status == VALIDATE_AUTH)) {
                *off += count;
-               mutex_unlock(&rtas_validate_flash_mutex);
                return count;
        }
 
@@ -519,20 +501,14 @@ static ssize_t validate_flash_write(struct file *file, 
const char __user *buf,
                args_buf->status = VALIDATE_INCOMPLETE;
        }
 
-       if (!access_ok(buf, count)) {
-               rc = -EFAULT;
-               goto done;
-       }
-       if (copy_from_user(args_buf->buf + *off, buf, count)) {
-               rc = -EFAULT;
-               goto done;
-       }
+       if (!access_ok(buf, count))
+               return -EFAULT;
+
+       if (copy_from_user(args_buf->buf + *off, buf, count))
+               return -EFAULT;
 
        *off += count;
-       rc = count;
-done:
-       mutex_unlock(&rtas_validate_flash_mutex);
-       return rc;
+       return count;
 }
 
 static int validate_flash_release(struct inode *inode, struct file *file)
-- 
2.39.3


Reply via email to