@@ -6626,7 +6626,7 @@ int smb2_cancel(struct ksmbd_work *work)
6626
6626
struct ksmbd_conn * conn = work -> conn ;
6627
6627
struct smb2_hdr * hdr = smb2_get_msg (work -> request_buf );
6628
6628
struct smb2_hdr * chdr ;
6629
- struct ksmbd_work * cancel_work = NULL , * iter ;
6629
+ struct ksmbd_work * iter ;
6630
6630
struct list_head * command_list ;
6631
6631
6632
6632
ksmbd_debug (SMB , "smb2 cancel called on mid %llu, async flags 0x%x\n" ,
@@ -6648,7 +6648,9 @@ int smb2_cancel(struct ksmbd_work *work)
6648
6648
"smb2 with AsyncId %llu cancelled command = 0x%x\n" ,
6649
6649
le64_to_cpu (hdr -> Id .AsyncId ),
6650
6650
le16_to_cpu (chdr -> Command ));
6651
- cancel_work = iter ;
6651
+ iter -> state = KSMBD_WORK_CANCELLED ;
6652
+ if (iter -> cancel_fn )
6653
+ iter -> cancel_fn (iter -> cancel_argv );
6652
6654
break ;
6653
6655
}
6654
6656
spin_unlock (& conn -> request_lock );
@@ -6667,18 +6669,12 @@ int smb2_cancel(struct ksmbd_work *work)
6667
6669
"smb2 with mid %llu cancelled command = 0x%x\n" ,
6668
6670
le64_to_cpu (hdr -> MessageId ),
6669
6671
le16_to_cpu (chdr -> Command ));
6670
- cancel_work = iter ;
6672
+ iter -> state = KSMBD_WORK_CANCELLED ;
6671
6673
break ;
6672
6674
}
6673
6675
spin_unlock (& conn -> request_lock );
6674
6676
}
6675
6677
6676
- if (cancel_work ) {
6677
- cancel_work -> state = KSMBD_WORK_CANCELLED ;
6678
- if (cancel_work -> cancel_fn )
6679
- cancel_work -> cancel_fn (cancel_work -> cancel_argv );
6680
- }
6681
-
6682
6678
/* For SMB2_CANCEL command itself send no response*/
6683
6679
work -> send_no_response = 1 ;
6684
6680
return 0 ;
@@ -7043,6 +7039,14 @@ int smb2_lock(struct ksmbd_work *work)
7043
7039
7044
7040
ksmbd_vfs_posix_lock_wait (flock );
7045
7041
7042
+ spin_lock (& work -> conn -> request_lock );
7043
+ spin_lock (& fp -> f_lock );
7044
+ list_del (& work -> fp_entry );
7045
+ work -> cancel_fn = NULL ;
7046
+ kfree (argv );
7047
+ spin_unlock (& fp -> f_lock );
7048
+ spin_unlock (& work -> conn -> request_lock );
7049
+
7046
7050
if (work -> state != KSMBD_WORK_ACTIVE ) {
7047
7051
list_del (& smb_lock -> llist );
7048
7052
spin_lock (& work -> conn -> llist_lock );
@@ -7051,9 +7055,6 @@ int smb2_lock(struct ksmbd_work *work)
7051
7055
locks_free_lock (flock );
7052
7056
7053
7057
if (work -> state == KSMBD_WORK_CANCELLED ) {
7054
- spin_lock (& fp -> f_lock );
7055
- list_del (& work -> fp_entry );
7056
- spin_unlock (& fp -> f_lock );
7057
7058
rsp -> hdr .Status =
7058
7059
STATUS_CANCELLED ;
7059
7060
kfree (smb_lock );
@@ -7075,9 +7076,6 @@ int smb2_lock(struct ksmbd_work *work)
7075
7076
list_del (& smb_lock -> clist );
7076
7077
spin_unlock (& work -> conn -> llist_lock );
7077
7078
7078
- spin_lock (& fp -> f_lock );
7079
- list_del (& work -> fp_entry );
7080
- spin_unlock (& fp -> f_lock );
7081
7079
goto retry ;
7082
7080
} else if (!rc ) {
7083
7081
spin_lock (& work -> conn -> llist_lock );
0 commit comments