trace.max_entries       = MAX_STACK_TRACE_DEPTH;
        trace.entries           = entries;
        trace.skip              = 0;
-       save_stack_trace_tsk(task, &trace);
  
-       for (i = 0; i < trace.nr_entries; i++) {
-               seq_printf(m, "[<%pK>] %pS\n",
-                          (void *)entries[i], (void *)entries[i]);
+       err = lock_trace(task);
+       if (!err) {
+               save_stack_trace_tsk(task, &trace);
+ 
+               for (i = 0; i < trace.nr_entries; i++) {
 -                      seq_printf(m, "[<%p>] %pS\n",
++                      seq_printf(m, "[<%pK>] %pS\n",
+                                  (void *)entries[i], (void *)entries[i]);
+               }
+               unlock_trace(task);
        }
        kfree(entries);
  
 
                                                return i ? i : -EFAULT;
                                        BUG();
                                }
-                               if (ret & VM_FAULT_MAJOR)
-                                       tsk->maj_flt++;
-                               else
-                                       tsk->min_flt++;
+ 
+                               if (tsk) {
+                                       if (ret & VM_FAULT_MAJOR)
+                                               tsk->maj_flt++;
+                                       else
+                                               tsk->min_flt++;
+                               }
  
                                if (ret & VM_FAULT_RETRY) {
 -                                      *nonblocking = 0;
 +                                      if (nonblocking)
 +                                              *nonblocking = 0;
                                        return i;
                                }