kfree(submit);
 }
 
-static inline unsigned long __must_check
-copy_from_user_inatomic(void *to, const void __user *from, unsigned long n)
-{
-       if (access_ok(from, n))
-               return __copy_from_user_inatomic(to, from, n);
-       return -EFAULT;
-}
-
 static int submit_lookup_objects(struct msm_gem_submit *submit,
                struct drm_msm_gem_submit *args, struct drm_file *file)
 {
        unsigned i;
        int ret = 0;
 
-       spin_lock(&file->table_lock);
-       pagefault_disable();
-
        for (i = 0; i < args->nr_bos; i++) {
                struct drm_msm_gem_submit_bo submit_bo;
-               struct drm_gem_object *obj;
-               struct msm_gem_object *msm_obj;
                void __user *userptr =
                        u64_to_user_ptr(args->bos + (i * sizeof(submit_bo)));
 
                 */
                submit->bos[i].flags = 0;
 
-               if (copy_from_user_inatomic(&submit_bo, userptr, sizeof(submit_bo))) {
-                       pagefault_enable();
-                       spin_unlock(&file->table_lock);
-                       if (copy_from_user(&submit_bo, userptr, sizeof(submit_bo))) {
-                               ret = -EFAULT;
-                               goto out;
-                       }
-                       spin_lock(&file->table_lock);
-                       pagefault_disable();
+               if (copy_from_user(&submit_bo, userptr, sizeof(submit_bo))) {
+                       ret = -EFAULT;
+                       i = 0;
+                       goto out;
                }
 
 /* at least one of READ and/or WRITE flags should be set: */
                        !(submit_bo.flags & MANDATORY_FLAGS)) {
                        DRM_ERROR("invalid flags: %x\n", submit_bo.flags);
                        ret = -EINVAL;
-                       goto out_unlock;
+                       i = 0;
+                       goto out;
                }
 
+               submit->bos[i].handle = submit_bo.handle;
                submit->bos[i].flags = submit_bo.flags;
                /* in validate_objects() we figure out if this is true: */
                submit->bos[i].iova  = submit_bo.presumed;
+       }
+
+       spin_lock(&file->table_lock);
+
+       for (i = 0; i < args->nr_bos; i++) {
+               struct drm_gem_object *obj;
+               struct msm_gem_object *msm_obj;
 
                /* normally use drm_gem_object_lookup(), but for bulk lookup
                 * all under single table_lock just hit object_idr directly:
                 */
-               obj = idr_find(&file->object_idr, submit_bo.handle);
+               obj = idr_find(&file->object_idr, submit->bos[i].handle);
                if (!obj) {
-                       DRM_ERROR("invalid handle %u at index %u\n", submit_bo.handle, i);
+                       DRM_ERROR("invalid handle %u at index %u\n", submit->bos[i].handle, i);
                        ret = -EINVAL;
                        goto out_unlock;
                }
 
                if (!list_empty(&msm_obj->submit_entry)) {
                        DRM_ERROR("handle %u at index %u already on submit list\n",
-                                       submit_bo.handle, i);
+                                       submit->bos[i].handle, i);
                        ret = -EINVAL;
                        goto out_unlock;
                }
        }
 
 out_unlock:
-       pagefault_enable();
        spin_unlock(&file->table_lock);
 
 out: