Skip to contentSkip to conversation

CIFS: SMBD: work around gcc -Wmaybe-uninitialized warning

PATCH Applied Arnd Bergmann 3 participants 3 messages Jan 10, 2018 – Jan 14, 2018

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 CIFS: SMBD: work around gcc -Wmaybe-uninitialized warning

GCC versions from 4.9 to 6.3 produce a false-positive warning when dealing with a conditional spin_lock_irqsave():

fs/cifs/smbdirect.c: In function 'smbd_recv_buf':
include/linux/spinlock.h:260:3: warning: 'flags' may be used uninitialized in this function [-Wmaybe-uninitialized]

This function calls some sleeping interfaces, so it is clear that it does not get called with interrupts disabled and there is no need to save the irq state before taking the spinlock. This lets us remove the variable, which makes the function slightly more efficient and avoids the warning.

A further cleanup could do the same change for other functions in this file, but I did not want to take this too far for now.

Fixes ac69f66e54ca ("CIFS: SMBD: Implement function to receive data via RDMA receive")
---
 fs/cifs/smbdirect.c | 15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)
fs/cifs/smbdirect.c +6 -9
index f527e22650f5..f9234ed83a60 100644
@@ -1862,7 +1862,6 @@ int smbd_recv_buf(struct smbd_connection *info, char *buf, unsigned int size)
 	int to_copy, to_read, data_read, offset;
 	u32 data_length, remaining_data_length, data_offset;
 	int rc;
-	unsigned long flags;
 
 again:
 	if (info->transport_status != SMBD_CONNECTED) {
@@ -1935,15 +1934,13 @@ int smbd_recv_buf(struct smbd_connection *info, char *buf, unsigned int size)
 				 * end of the queue
 				 */
 				if (!queue_length)
-					spin_lock_irqsave(
-						&info->reassembly_queue_lock,
-						flags);
+					spin_lock_irq(
+						&info->reassembly_queue_lock);
 				list_del(&response->list);
 				queue_removed++;
 				if (!queue_length)
-					spin_unlock_irqrestore(
-						&info->reassembly_queue_lock,
-						flags);
+					spin_unlock_irq(
+						&info->reassembly_queue_lock);
 
 				info->count_reassembly_queue--;
 				info->count_dequeue_reassembly_queue++;
@@ -1963,10 +1960,10 @@ int smbd_recv_buf(struct smbd_connection *info, char *buf, unsigned int size)
 				to_read, data_read, offset);
 		}
 
-		spin_lock_irqsave(&info->reassembly_queue_lock, flags);
+		spin_lock_irq(&info->reassembly_queue_lock);
 		info->reassembly_data_length -= data_read;
 		info->reassembly_queue_length -= queue_removed;
-		spin_unlock_irqrestore(&info->reassembly_queue_lock, flags);
+		spin_unlock_irq(&info->reassembly_queue_lock);
 
 		info->first_entry_offset = offset;
 		log_read(INFO, "returning to thread data_read=%d "
Signature · 1 line
2.9.0
Reviewed-by on v1 1/1
#1 lore raw
Quoted 12 lines

GCC versions from 4.9 to 6.3 produce a false-positive warning when dealing with a conditional spin_lock_irqsave():

fs/cifs/smbdirect.c: In function 'smbd_recv_buf':
include/linux/spinlock.h:260:3: warning: 'flags' may be used uninitialized in this function [-Wmaybe-uninitialized]

This function calls some sleeping interfaces, so it is clear that it does not get called with interrupts disabled and there is no need to save the irq state before taking the spinlock. This lets us remove the variable, which makes the function slightly more efficient and avoids the warning.

Quoted 6 lines

A further cleanup could do the same change for other functions in this file, but I did not want to take this too far for now.

Fixes ac69f66e54ca ("CIFS: SMBD: Implement function to receive data via

RDMA receive")

Quoted 60 lines
---
 fs/cifs/smbdirect.c | 15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)
fs/cifs/smbdirect.c index renamed from fs/cifs/smbdirect.c +0 -0

f527e22650f5..f9234ed83a60 100644

fs/cifs/smbdirect.c +0 -1
@@ -1862,7 +1862,6 @@ int smbd_recv_buf(struct smbd_connection *info,
 char *buf, unsigned int size)
 	int to_copy, to_read, data_read, offset;
 	u32 data_length, remaining_data_length, data_offset;
 	int rc;
-	unsigned long flags;
 
 again:

if (info->transport_status != SMBD_CONNECTED) { @@ -1935,15
+1934,13 @@ int smbd_recv_buf(struct smbd_connection *info, char *buf, unsigned int size)

fs/cifs/smbdirect.c +0 -2
 				 * end of the queue
 				 */
 				if (!queue_length)
-					spin_lock_irqsave(
-						&info-
Quoted 1 line

reassembly_queue_lock,

fs/cifs/smbdirect.c +2 -1
-						flags);
+					spin_lock_irq(
+						&info-
Quoted 1 line

reassembly_queue_lock);

fs/cifs/smbdirect.c +0 -2
 				list_del(&response->list);
 				queue_removed++;
 				if (!queue_length)
-					spin_unlock_irqrestore(
-						&info-
Quoted 1 line

reassembly_queue_lock,

fs/cifs/smbdirect.c +2 -1
-						flags);
+					spin_unlock_irq(
+						&info-
Quoted 1 line

reassembly_queue_lock);

fs/cifs/smbdirect.c +0 -0
 				info->count_reassembly_queue--;
 				info-
Quoted 1 line

count_dequeue_reassembly_queue++;

fs/cifs/smbdirect.c +2 -2
@@ -1963,10 +1960,10 @@ int smbd_recv_buf(struct smbd_connection
 *info, char *buf, unsigned int size)
 				to_read, data_read, offset);
 		}
 
-		spin_lock_irqsave(&info->reassembly_queue_lock, flags);
+		spin_lock_irq(&info->reassembly_queue_lock);
 		info->reassembly_data_length -= data_read;
 		info->reassembly_queue_length -= queue_removed;
-		spin_unlock_irqrestore(&info->reassembly_queue_lock,
 flags);
+		spin_unlock_irq(&info->reassembly_queue_lock);
 
fs/cifs/smbdirect.c +0 -1
 		info->first_entry_offset = offset;
 		log_read(INFO, "returning to thread data_read=%d "
--

2.9.0

Applied
#2 lore raw
In reply to Arnd Bergmann

merged into cifs-2.6.git for-next

Also noticed a few sparse warnings in the same file that need to be cleaned up

Quoted 73 lines · Arnd Bergmann

GCC versions from 4.9 to 6.3 produce a false-positive warning when dealing with a conditional spin_lock_irqsave():

fs/cifs/smbdirect.c: In function 'smbd_recv_buf':
include/linux/spinlock.h:260:3: warning: 'flags' may be used uninitialized in this function [-Wmaybe-uninitialized]

This function calls some sleeping interfaces, so it is clear that it does not get called with interrupts disabled and there is no need to save the irq state before taking the spinlock. This lets us remove the variable, which makes the function slightly more efficient and avoids the warning.

A further cleanup could do the same change for other functions in this file, but I did not want to take this too far for now.

Fixes ac69f66e54ca ("CIFS: SMBD: Implement function to receive data via RDMA receive")
---
 fs/cifs/smbdirect.c | 15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)
fs/cifs/smbdirect.c +6 -10
index f527e22650f5..f9234ed83a60 100644
@@ -1862,7 +1862,6 @@ int smbd_recv_buf(struct smbd_connection *info, char *buf, unsigned int size)
        int to_copy, to_read, data_read, offset;
        u32 data_length, remaining_data_length, data_offset;
        int rc;
-       unsigned long flags;
 
 again:
        if (info->transport_status != SMBD_CONNECTED) {
@@ -1935,15 +1934,13 @@ int smbd_recv_buf(struct smbd_connection *info, char *buf, unsigned int size)
                                 * end of the queue
                                 */
                                if (!queue_length)
-                                       spin_lock_irqsave(
-                                               &info->reassembly_queue_lock,
-                                               flags);
+                                       spin_lock_irq(
+                                               &info->reassembly_queue_lock);
                                list_del(&response->list);
                                queue_removed++;
                                if (!queue_length)
-                                       spin_unlock_irqrestore(
-                                               &info->reassembly_queue_lock,
-                                               flags);
+                                       spin_unlock_irq(
+                                               &info->reassembly_queue_lock);
 
                                info->count_reassembly_queue--;
                                info->count_dequeue_reassembly_queue++;
@@ -1963,10 +1960,10 @@ int smbd_recv_buf(struct smbd_connection *info, char *buf, unsigned int size)
                                to_read, data_read, offset);
                }
 
-               spin_lock_irqsave(&info->reassembly_queue_lock, flags);
+               spin_lock_irq(&info->reassembly_queue_lock);
                info->reassembly_data_length -= data_read;
                info->reassembly_queue_length -= queue_removed;
-               spin_unlock_irqrestore(&info->reassembly_queue_lock, flags);
+               spin_unlock_irq(&info->reassembly_queue_lock);
 
                info->first_entry_offset = offset;
                log_read(INFO, "returning to thread data_read=%d "
--

2.9.0

--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html

Signature · 3 lines
Thanks,

Steve