]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
s390/diag: Diag204 add busy return errno
authorMete Durlu <meted@linux.ibm.com>
Thu, 4 Jul 2024 12:10:06 +0000 (14:10 +0200)
committerVasily Gorbik <gor@linux.ibm.com>
Wed, 10 Jul 2024 17:50:45 +0000 (19:50 +0200)
When diag204-busy-indication facility is installed, diag204 can return
'8' which means device is busy and no operation is done. Add check for
return codes of diag204 call. Return error codes according to diag204
return codes.

Acked-by: Heiko Carstens <hca@linux.ibm.com>
Reviewed-by: Tobias Huschle <huschle@linux.ibm.com>
Signed-off-by: Mete Durlu <meted@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/kernel/diag.c

index 9f33dcecbffab5046b8f15c0e1d5abb85db3ceb3..9b65f04c83decd879036c00afe72c8fde3636256 100644 (file)
@@ -185,6 +185,8 @@ int diag14(unsigned long rx, unsigned long ry1, unsigned long subcode)
 }
 EXPORT_SYMBOL(diag14);
 
+#define DIAG204_BUSY_RC 8
+
 static inline int __diag204(unsigned long *subcode, unsigned long size, void *addr)
 {
        union register_pair rp = { .even = *subcode, .odd = size };
@@ -223,7 +225,9 @@ int diag204(unsigned long subcode, unsigned long size, void *addr)
                addr = (void *)pfn_to_phys(vmalloc_to_pfn(addr));
        diag_stat_inc(DIAG_STAT_X204);
        size = __diag204(&subcode, size, addr);
-       if (subcode)
+       if (subcode == DIAG204_BUSY_RC)
+               return -EBUSY;
+       else if (subcode)
                return -EOPNOTSUPP;
        return size;
 }