diff mbox

[1/1,Yakkety/Zesty] UBUNTU: SAUCE: hio: Fix incorrect use of enum req_opf values

Message ID 20170711121256.27631-2-seth.forshee@canonical.com
State New
Headers show

Commit Message

Seth Forshee July 11, 2017, 12:12 p.m. UTC
BugLink: http://bugs.launchpad.net/bugs/1701316

Patch from Huawei to fix incorrect use of enumerated values for
bio operations as bitmasks. A reordering of the enum in 4.10
caused a change in behavior which has been leading to data
corruption.

Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
---
 ubuntu/hio/hio.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Colin Ian King July 11, 2017, 12:17 p.m. UTC | #1
On 11/07/17 13:12, Seth Forshee wrote:
> BugLink: http://bugs.launchpad.net/bugs/1701316
> 
> Patch from Huawei to fix incorrect use of enumerated values for
> bio operations as bitmasks. A reordering of the enum in 4.10
> caused a change in behavior which has been leading to data
> corruption.
> 
> Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
> ---
>  ubuntu/hio/hio.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/ubuntu/hio/hio.c b/ubuntu/hio/hio.c
> index 4320262a76ba..7f40497e5ea7 100644
> --- a/ubuntu/hio/hio.c
> +++ b/ubuntu/hio/hio.c
> @@ -2098,7 +2098,7 @@ static inline int ssd_bio_has_discard(struct bio *bio)
>  #ifndef SSD_TRIM
>  	return 0;
>  #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(4,8,0))
> -	return bio_op(bio) & REQ_OP_DISCARD;
> +	return bio_op(bio) == REQ_OP_DISCARD;
>  #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36))
>  	return bio->bi_rw & REQ_DISCARD;
>  #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32))
> @@ -2111,7 +2111,7 @@ static inline int ssd_bio_has_discard(struct bio *bio)
>  static inline int ssd_bio_has_flush(struct bio *bio)
>  {
>  #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,8,0))
> -	return bio_op(bio) & REQ_OP_FLUSH;
> +	return bio_op(bio) == REQ_OP_FLUSH;
>  #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))
>  	return bio->bi_rw & REQ_FLUSH;
>  #else
> 

Limited to one specific driver so small regression impact.  Positive
test results.  Thanks Seth.

Acked-by: Colin Ian King <colin.king@canonical.com>
Stefan Bader July 12, 2017, 8:38 a.m. UTC | #2
On 11.07.2017 14:12, Seth Forshee wrote:
> BugLink: http://bugs.launchpad.net/bugs/1701316
> 
> Patch from Huawei to fix incorrect use of enumerated values for
> bio operations as bitmasks. A reordering of the enum in 4.10
> caused a change in behavior which has been leading to data
> corruption.
> 
> Signed-off-by: Seth Forshee <seth.forshee@canonical.com>

Acked-by: Stefan Bader <stefan.bader@canonical.com>

> ---
>  ubuntu/hio/hio.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/ubuntu/hio/hio.c b/ubuntu/hio/hio.c
> index 4320262a76ba..7f40497e5ea7 100644
> --- a/ubuntu/hio/hio.c
> +++ b/ubuntu/hio/hio.c
> @@ -2098,7 +2098,7 @@ static inline int ssd_bio_has_discard(struct bio *bio)
>  #ifndef SSD_TRIM
>  	return 0;
>  #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(4,8,0))
> -	return bio_op(bio) & REQ_OP_DISCARD;
> +	return bio_op(bio) == REQ_OP_DISCARD;
>  #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36))
>  	return bio->bi_rw & REQ_DISCARD;
>  #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32))
> @@ -2111,7 +2111,7 @@ static inline int ssd_bio_has_discard(struct bio *bio)
>  static inline int ssd_bio_has_flush(struct bio *bio)
>  {
>  #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,8,0))
> -	return bio_op(bio) & REQ_OP_FLUSH;
> +	return bio_op(bio) == REQ_OP_FLUSH;
>  #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))
>  	return bio->bi_rw & REQ_FLUSH;
>  #else
>
diff mbox

Patch

diff --git a/ubuntu/hio/hio.c b/ubuntu/hio/hio.c
index 4320262a76ba..7f40497e5ea7 100644
--- a/ubuntu/hio/hio.c
+++ b/ubuntu/hio/hio.c
@@ -2098,7 +2098,7 @@  static inline int ssd_bio_has_discard(struct bio *bio)
 #ifndef SSD_TRIM
 	return 0;
 #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(4,8,0))
-	return bio_op(bio) & REQ_OP_DISCARD;
+	return bio_op(bio) == REQ_OP_DISCARD;
 #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36))
 	return bio->bi_rw & REQ_DISCARD;
 #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32))
@@ -2111,7 +2111,7 @@  static inline int ssd_bio_has_discard(struct bio *bio)
 static inline int ssd_bio_has_flush(struct bio *bio)
 {
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,8,0))
-	return bio_op(bio) & REQ_OP_FLUSH;
+	return bio_op(bio) == REQ_OP_FLUSH;
 #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))
 	return bio->bi_rw & REQ_FLUSH;
 #else