{
        struct compat_raw1394_req __user *cr = (typeof(cr)) buf;
        struct raw1394_request __user *r;
+
        r = compat_alloc_user_space(sizeof(struct raw1394_request));
 
 #define C(x) __copy_in_user(&r->x, &cr->x, sizeof(r->x))
            C(tag) ||
            C(sendb) ||
            C(recvb))
-               return ERR_PTR(-EFAULT);
+               return (__force const char __user *)ERR_PTR(-EFAULT);
+
        return (const char __user *)r;
 }
 #undef C
 raw1394_compat_read(const char __user *buf, struct raw1394_request *r)
 {
        struct compat_raw1394_req __user *cr = (typeof(cr)) buf;
+
        if (!access_ok(VERIFY_WRITE, cr, sizeof(struct compat_raw1394_req)) ||
            P(type) ||
            P(error) ||
            P(sendb) ||
            P(recvb))
                return -EFAULT;
+
        return sizeof(struct compat_raw1394_req);
 }
 #undef P
            sizeof(struct compat_raw1394_req) !=
                        sizeof(struct raw1394_request)) {
                buffer = raw1394_compat_write(buffer);
-               if (IS_ERR(buffer))
-                       return PTR_ERR(buffer);
+               if (IS_ERR((__force void *)buffer))
+                       return PTR_ERR((__force void *)buffer);
        } else
 #endif
        if (count != sizeof(struct raw1394_request)) {