Let's resturcture the code, using switch-case, and checking pfn_is_ram()
only when we are dealing with KCORE_RAM.

Reviewed-by: Mike Rapoport <[email protected]>
Signed-off-by: David Hildenbrand <[email protected]>
---
 fs/proc/kcore.c | 35 +++++++++++++++++++++++++++--------
 1 file changed, 27 insertions(+), 8 deletions(-)

diff --git a/fs/proc/kcore.c b/fs/proc/kcore.c
index 09f77d3c6e15..ed6fbb3bd50c 100644
--- a/fs/proc/kcore.c
+++ b/fs/proc/kcore.c
@@ -483,25 +483,36 @@ read_kcore(struct file *file, char __user *buffer, size_t 
buflen, loff_t *fpos)
                                goto out;
                        }
                        m = NULL;       /* skip the list anchor */
-               } else if (!pfn_is_ram(__pa(start) >> PAGE_SHIFT)) {
-                       if (clear_user(buffer, tsz)) {
-                               ret = -EFAULT;
-                               goto out;
-                       }
-               } else if (m->type == KCORE_VMALLOC) {
+                       goto skip;
+               }
+
+               switch (m->type) {
+               case KCORE_VMALLOC:
                        vread(buf, (char *)start, tsz);
                        /* we have to zero-fill user buffer even if no read */
                        if (copy_to_user(buffer, buf, tsz)) {
                                ret = -EFAULT;
                                goto out;
                        }
-               } else if (m->type == KCORE_USER) {
+                       break;
+               case KCORE_USER:
                        /* User page is handled prior to normal kernel page: */
                        if (copy_to_user(buffer, (char *)start, tsz)) {
                                ret = -EFAULT;
                                goto out;
                        }
-               } else {
+                       break;
+               case KCORE_RAM:
+                       if (!pfn_is_ram(__pa(start) >> PAGE_SHIFT)) {
+                               if (clear_user(buffer, tsz)) {
+                                       ret = -EFAULT;
+                                       goto out;
+                               }
+                               break;
+                       }
+                       fallthrough;
+               case KCORE_VMEMMAP:
+               case KCORE_TEXT:
                        if (kern_addr_valid(start)) {
                                /*
                                 * Using bounce buffer to bypass the
@@ -525,7 +536,15 @@ read_kcore(struct file *file, char __user *buffer, size_t 
buflen, loff_t *fpos)
                                        goto out;
                                }
                        }
+                       break;
+               default:
+                       pr_warn_once("Unhandled KCORE type: %d\n", m->type);
+                       if (clear_user(buffer, tsz)) {
+                               ret = -EFAULT;
+                               goto out;
+                       }
                }
+skip:
                buflen -= tsz;
                *fpos += tsz;
                buffer += tsz;
-- 
2.31.1

_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

Reply via email to