syscall_exec16: Fix L2 build without locking
authorAlan Cox <alan@linux.intel.com>
Sun, 11 Mar 2018 14:01:21 +0000 (14:01 +0000)
committerAlan Cox <alan@linux.intel.com>
Sun, 11 Mar 2018 14:01:21 +0000 (14:01 +0000)
Kernel/syscall_exec16.c

index 1f0aad6..d76eaf0 100644 (file)
@@ -351,34 +351,37 @@ uint8_t write_core_image(void)
                i_deref(parent);
                return 0;
        }
-       if (parent && i_lock(parent) && (ino = newfile(parent, "core"))) {
-               ino->c_node.i_mode = F_REG | 0400;
-               setftime(ino, A_TIME | M_TIME | C_TIME);
-               wr_inode(ino);
-               f_trunc(ino);
-
-               /* FIXME: need to add some arch specific header bits, and
-                  also pull stuff like the true sp and registers out of
-                  the return stack properly */
-
-               corehdr.ch_base = MAPBASE;
-               corehdr.ch_break = udata.u_break;
-               corehdr.ch_sp = udata.u_syscall_sp;
-               corehdr.ch_top = PROGTOP;
-               udata.u_offset = 0;
-               udata.u_base = (uint8_t *)&corehdr;
-               udata.u_sysio = true;
-               udata.u_count = sizeof(corehdr);
-               writei(ino, 0);
-               udata.u_sysio = false;
-               udata.u_base = MAPBASE;
-               udata.u_count = udata.u_break - MAPBASE;
-               writei(ino, 0);
-               udata.u_base = udata.u_sp;
-               udata.u_count = PROGTOP - (uint16_t)udata.u_sp;
-               writei(ino, 0);
-               i_unlock_deref(ino);
-               return W_COREDUMP;
+       if (parent) {
+               i_lock(parent);
+               if (ino = newfile(parent, "core")) {
+                       ino->c_node.i_mode = F_REG | 0400;
+                       setftime(ino, A_TIME | M_TIME | C_TIME);
+                       wr_inode(ino);
+                       f_trunc(ino);
+
+                       /* FIXME: need to add some arch specific header bits, and
+                          also pull stuff like the true sp and registers out of
+                          the return stack properly */
+
+                       corehdr.ch_base = MAPBASE;
+                       corehdr.ch_break = udata.u_break;
+                       corehdr.ch_sp = udata.u_syscall_sp;
+                       corehdr.ch_top = PROGTOP;
+                       udata.u_offset = 0;
+                       udata.u_base = (uint8_t *)&corehdr;
+                       udata.u_sysio = true;
+                       udata.u_count = sizeof(corehdr);
+                       writei(ino, 0);
+                       udata.u_sysio = false;
+                       udata.u_base = MAPBASE;
+                       udata.u_count = udata.u_break - MAPBASE;
+                       writei(ino, 0);
+                       udata.u_base = udata.u_sp;
+                       udata.u_count = PROGTOP - (uint16_t)udata.u_sp;
+                       writei(ino, 0);
+                       i_unlock_deref(ino);
+                       return W_COREDUMP;
+               }
        }
        return 0;
 }