]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
s390/debug: Split private data alloc/free out of file operations
authorNiklas Schnelle <schnelle@linux.ibm.com>
Fri, 13 Dec 2024 13:47:30 +0000 (14:47 +0100)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Mon, 16 Dec 2024 15:14:26 +0000 (16:14 +0100)
Split the allocation respectively freeing of file_private_info_t out
of open() respectively close(). This will be used in a follow on change
to access to debug views without going through the s390dbf filesystem.

Reviewed-by: Halil Pasic <pasic@linux.ibm.com>
Signed-off-by: Niklas Schnelle <schnelle@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
arch/s390/kernel/debug.c

index e3598dbccd245318afdd3025c7b5c0ea29626733..463c9a19a3b59388283ff47a99965ad04ba76115 100644 (file)
@@ -535,6 +535,42 @@ static ssize_t debug_input(struct file *file, const char __user *user_buf,
        return rc; /* number of input characters */
 }
 
+static file_private_info_t *debug_file_private_alloc(debug_info_t *debug_info,
+                                                    struct debug_view *view)
+{
+       debug_info_t *debug_info_snapshot;
+       file_private_info_t *p_info;
+
+       /*
+        * Make snapshot of current debug areas to get it consistent.
+        * To copy all the areas is only needed, if we have a view which
+        * formats the debug areas.
+        */
+       if (!view->format_proc && !view->header_proc)
+               debug_info_snapshot = debug_info_copy(debug_info, NO_AREAS);
+       else
+               debug_info_snapshot = debug_info_copy(debug_info, ALL_AREAS);
+
+       if (!debug_info_snapshot)
+               return NULL;
+       p_info = kmalloc(sizeof(file_private_info_t), GFP_KERNEL);
+       if (!p_info) {
+               debug_info_free(debug_info_snapshot);
+               return NULL;
+       }
+       p_info->offset = 0;
+       p_info->debug_info_snap = debug_info_snapshot;
+       p_info->debug_info_org  = debug_info;
+       p_info->view = view;
+       p_info->act_area = 0;
+       p_info->act_page = 0;
+       p_info->act_entry = DEBUG_PROLOG_ENTRY;
+       p_info->act_entry_offset = 0;
+       debug_info_get(debug_info);
+
+       return p_info;
+}
+
 /*
  * debug_open:
  * - called for user open()
@@ -543,7 +579,7 @@ static ssize_t debug_input(struct file *file, const char __user *user_buf,
  */
 static int debug_open(struct inode *inode, struct file *file)
 {
-       debug_info_t *debug_info, *debug_info_snapshot;
+       debug_info_t *debug_info;
        file_private_info_t *p_info;
        int i, rc = 0;
 
@@ -561,42 +597,26 @@ static int debug_open(struct inode *inode, struct file *file)
        goto out;
 
 found:
-
-       /* Make snapshot of current debug areas to get it consistent.     */
-       /* To copy all the areas is only needed, if we have a view which  */
-       /* formats the debug areas. */
-
-       if (!debug_info->views[i]->format_proc && !debug_info->views[i]->header_proc)
-               debug_info_snapshot = debug_info_copy(debug_info, NO_AREAS);
-       else
-               debug_info_snapshot = debug_info_copy(debug_info, ALL_AREAS);
-
-       if (!debug_info_snapshot) {
-               rc = -ENOMEM;
-               goto out;
-       }
-       p_info = kmalloc(sizeof(file_private_info_t), GFP_KERNEL);
+       p_info = debug_file_private_alloc(debug_info, debug_info->views[i]);
        if (!p_info) {
-               debug_info_free(debug_info_snapshot);
                rc = -ENOMEM;
                goto out;
        }
-       p_info->offset = 0;
-       p_info->debug_info_snap = debug_info_snapshot;
-       p_info->debug_info_org  = debug_info;
-       p_info->view = debug_info->views[i];
-       p_info->act_area = 0;
-       p_info->act_page = 0;
-       p_info->act_entry = DEBUG_PROLOG_ENTRY;
-       p_info->act_entry_offset = 0;
        file->private_data = p_info;
-       debug_info_get(debug_info);
        nonseekable_open(inode, file);
 out:
        mutex_unlock(&debug_mutex);
        return rc;
 }
 
+static void debug_file_private_free(file_private_info_t *p_info)
+{
+       if (p_info->debug_info_snap)
+               debug_info_free(p_info->debug_info_snap);
+       debug_info_put(p_info->debug_info_org);
+       kfree(p_info);
+}
+
 /*
  * debug_close:
  * - called for user close()
@@ -607,10 +627,8 @@ static int debug_close(struct inode *inode, struct file *file)
        file_private_info_t *p_info;
 
        p_info = (file_private_info_t *) file->private_data;
-       if (p_info->debug_info_snap)
-               debug_info_free(p_info->debug_info_snap);
-       debug_info_put(p_info->debug_info_org);
-       kfree(file->private_data);
+       debug_file_private_free(p_info);
+       file->private_data = NULL;
        return 0; /* success */
 }