unsigned long fc;
        int err;
 
-       err = xts_check_key(tfm, in_key, key_len);
+       err = xts_fallback_setkey(tfm, in_key, key_len);
        if (err)
                return err;
 
        /* Check if the function code is available */
        xts_ctx->fc = (fc && cpacf_test_func(&km_functions, fc)) ? fc : 0;
        if (!xts_ctx->fc)
-               return xts_fallback_setkey(tfm, in_key, key_len);
+               return 0;
 
        /* Split the XTS key into the two subkeys */
        key_len = key_len / 2;
        struct s390_xts_ctx *xts_ctx = crypto_blkcipher_ctx(desc->tfm);
        struct blkcipher_walk walk;
 
-       if (unlikely(!xts_ctx->fc))
+       if (unlikely(!xts_ctx->fc || (nbytes % XTS_BLOCKSIZE) != 0))
                return xts_fallback_encrypt(desc, dst, src, nbytes);
 
        blkcipher_walk_init(&walk, dst, src, nbytes);
        struct s390_xts_ctx *xts_ctx = crypto_blkcipher_ctx(desc->tfm);
        struct blkcipher_walk walk;
 
-       if (unlikely(!xts_ctx->fc))
+       if (unlikely(!xts_ctx->fc || (nbytes % XTS_BLOCKSIZE) != 0))
                return xts_fallback_decrypt(desc, dst, src, nbytes);
 
        blkcipher_walk_init(&walk, dst, src, nbytes);