return (ret < 0) ? ret : len;
 }
 
+static nokprobe_inline void set_data_loc(int ret, void *dest, void *__dest, void *base)
+{
+       if (ret < 0)
+               ret = 0;
+       *(u32 *)dest = make_data_loc(ret, __dest - base);
+}
+
 /*
  * Fetch a null-terminated string from user. Caller MUST set *(u32 *)buf
  * with max length and relative data location.
        __dest = get_loc_data(dest, base);
 
        ret = strncpy_from_user_nofault(__dest, uaddr, maxlen);
-       if (ret >= 0)
-               *(u32 *)dest = make_data_loc(ret, __dest - base);
+       set_data_loc(ret, dest, __dest, base);
 
        return ret;
 }
         * probing.
         */
        ret = strncpy_from_kernel_nofault(__dest, (void *)addr, maxlen);
-       if (ret >= 0)
-               *(u32 *)dest = make_data_loc(ret, __dest - base);
+       set_data_loc(ret, dest, __dest, base);
 
        return ret;
 }
 
                if (unlikely(arg->dynamic))
                        *dl = make_data_loc(maxlen, dyndata - base);
                ret = process_fetch_insn(arg->code, rec, dl, base);
-               if (arg->dynamic) {
-                       if (unlikely(ret < 0)) {
-                               *dl = make_data_loc(0, dyndata - base);
-                       } else {
-                               dyndata += ret;
-                               maxlen -= ret;
-                       }
+               if (arg->dynamic && likely(ret > 0)) {
+                       dyndata += ret;
+                       maxlen -= ret;
                }
        }
 }