size_t tot_len;
        ssize_t ret = 0;
 
+       if (!(file->f_mode & FMODE_READ))
+               return -EBADF;
+       if (!(file->f_mode & FMODE_CAN_READ))
+               return -EINVAL;
+
        tot_len = iov_iter_count(iter);
        if (!tot_len)
                goto out;
        size_t tot_len;
        ssize_t ret = 0;
 
+       if (!(file->f_mode & FMODE_WRITE))
+               return -EBADF;
+       if (!(file->f_mode & FMODE_CAN_WRITE))
+               return -EINVAL;
+
        tot_len = iov_iter_count(iter);
        if (!tot_len)
                return 0;
        struct iov_iter iter;
        ssize_t ret;
 
-       if (!(file->f_mode & FMODE_READ))
-               return -EBADF;
-       if (!(file->f_mode & FMODE_CAN_READ))
-               return -EINVAL;
-
        ret = import_iovec(READ, vec, vlen, ARRAY_SIZE(iovstack), &iov, &iter);
-       if (ret < 0)
-               return ret;
+       if (ret >= 0) {
+               ret = do_iter_read(file, &iter, pos, flags);
+               kfree(iov);
+       }
 
-       ret = do_iter_read(file, &iter, pos, flags);
-       kfree(iov);
        return ret;
 }
 EXPORT_SYMBOL(vfs_readv);
        struct iov_iter iter;
        ssize_t ret;
 
-       if (!(file->f_mode & FMODE_WRITE))
-               return -EBADF;
-       if (!(file->f_mode & FMODE_CAN_WRITE))
-               return -EINVAL;
-
        ret = import_iovec(WRITE, vec, vlen, ARRAY_SIZE(iovstack), &iov, &iter);
-       if (ret < 0)
-               return ret;
-
-       ret = do_iter_write(file, &iter, pos, flags);
-       kfree(iov);
+       if (ret >= 0) {
+               ret = do_iter_write(file, &iter, pos, flags);
+               kfree(iov);
+       }
        return ret;
 }
 EXPORT_SYMBOL(vfs_writev);
        struct iovec iovstack[UIO_FASTIOV];
        struct iovec *iov = iovstack;
        struct iov_iter iter;
-       ssize_t ret = -EBADF;
-
-       if (!(file->f_mode & FMODE_READ))
-               goto out;
-
-       ret = -EINVAL;
-       if (!(file->f_mode & FMODE_CAN_READ))
-               goto out;
+       ssize_t ret;
 
        ret = compat_import_iovec(READ, vec, vlen, UIO_FASTIOV, &iov, &iter);
-       if (ret < 0)
-               goto out;
-       ret = do_iter_read(file, &iter, pos, flags);
-       kfree(iov);
-out:
+       if (ret >= 0) {
+               ret = do_iter_read(file, &iter, pos, flags);
+               kfree(iov);
+       }
        if (ret > 0)
                add_rchar(current, ret);
        inc_syscr(current);
        struct iovec iovstack[UIO_FASTIOV];
        struct iovec *iov = iovstack;
        struct iov_iter iter;
-       ssize_t ret = -EBADF;
-
-       if (!(file->f_mode & FMODE_WRITE))
-               goto out;
-
-       ret = -EINVAL;
-       if (!(file->f_mode & FMODE_CAN_WRITE))
-               goto out;
+       ssize_t ret;
 
        ret = compat_import_iovec(WRITE, vec, vlen, UIO_FASTIOV, &iov, &iter);
-       if (ret < 0)
-               goto out;
-       ret = do_iter_write(file, &iter, pos, flags);
-       kfree(iov);
-out:
+       if (ret >= 0) {
+               ret = do_iter_write(file, &iter, pos, flags);
+               kfree(iov);
+       }
        if (ret > 0)
                add_wchar(current, ret);
        inc_syscw(current);