@@ -46,7 +46,6 @@ static struct oplock_info *alloc_opinfo(struct ksmbd_work *work,
46
46
opinfo -> fid = id ;
47
47
opinfo -> Tid = Tid ;
48
48
INIT_LIST_HEAD (& opinfo -> op_entry );
49
- INIT_LIST_HEAD (& opinfo -> interim_list );
50
49
init_waitqueue_head (& opinfo -> oplock_q );
51
50
init_waitqueue_head (& opinfo -> oplock_brk );
52
51
atomic_set (& opinfo -> refcount , 1 );
@@ -635,6 +634,7 @@ static void __smb2_oplock_break_noti(struct work_struct *wk)
635
634
{
636
635
struct smb2_oplock_break * rsp = NULL ;
637
636
struct ksmbd_work * work = container_of (wk , struct ksmbd_work , work );
637
+ struct ksmbd_conn * conn = work -> conn ;
638
638
struct oplock_break_info * br_info = work -> request_buf ;
639
639
struct smb2_hdr * rsp_hdr ;
640
640
struct ksmbd_file * fp ;
@@ -690,6 +690,7 @@ static void __smb2_oplock_break_noti(struct work_struct *wk)
690
690
691
691
out :
692
692
ksmbd_free_work_struct (work );
693
+ ksmbd_conn_r_count_dec (conn );
693
694
}
694
695
695
696
/**
@@ -724,6 +725,7 @@ static int smb2_oplock_break_noti(struct oplock_info *opinfo)
724
725
work -> sess = opinfo -> sess ;
725
726
726
727
if (opinfo -> op_state == OPLOCK_ACK_WAIT ) {
728
+ ksmbd_conn_r_count_inc (conn );
727
729
INIT_WORK (& work -> work , __smb2_oplock_break_noti );
728
730
ksmbd_queue_work (work );
729
731
@@ -745,6 +747,7 @@ static void __smb2_lease_break_noti(struct work_struct *wk)
745
747
{
746
748
struct smb2_lease_break * rsp = NULL ;
747
749
struct ksmbd_work * work = container_of (wk , struct ksmbd_work , work );
750
+ struct ksmbd_conn * conn = work -> conn ;
748
751
struct lease_break_info * br_info = work -> request_buf ;
749
752
struct smb2_hdr * rsp_hdr ;
750
753
@@ -791,6 +794,7 @@ static void __smb2_lease_break_noti(struct work_struct *wk)
791
794
792
795
out :
793
796
ksmbd_free_work_struct (work );
797
+ ksmbd_conn_r_count_dec (conn );
794
798
}
795
799
796
800
/**
@@ -803,7 +807,6 @@ static void __smb2_lease_break_noti(struct work_struct *wk)
803
807
static int smb2_lease_break_noti (struct oplock_info * opinfo )
804
808
{
805
809
struct ksmbd_conn * conn = opinfo -> conn ;
806
- struct list_head * tmp , * t ;
807
810
struct ksmbd_work * work ;
808
811
struct lease_break_info * br_info ;
809
812
struct lease * lease = opinfo -> o_lease ;
@@ -831,16 +834,7 @@ static int smb2_lease_break_noti(struct oplock_info *opinfo)
831
834
work -> sess = opinfo -> sess ;
832
835
833
836
if (opinfo -> op_state == OPLOCK_ACK_WAIT ) {
834
- list_for_each_safe (tmp , t , & opinfo -> interim_list ) {
835
- struct ksmbd_work * in_work ;
836
-
837
- in_work = list_entry (tmp , struct ksmbd_work ,
838
- interim_entry );
839
- setup_async_work (in_work , NULL , NULL );
840
- smb2_send_interim_resp (in_work , STATUS_PENDING );
841
- list_del_init (& in_work -> interim_entry );
842
- release_async_work (in_work );
843
- }
837
+ ksmbd_conn_r_count_inc (conn );
844
838
INIT_WORK (& work -> work , __smb2_lease_break_noti );
845
839
ksmbd_queue_work (work );
846
840
wait_for_break_ack (opinfo );
@@ -871,7 +865,8 @@ static void wait_lease_breaking(struct oplock_info *opinfo)
871
865
}
872
866
}
873
867
874
- static int oplock_break (struct oplock_info * brk_opinfo , int req_op_level )
868
+ static int oplock_break (struct oplock_info * brk_opinfo , int req_op_level ,
869
+ struct ksmbd_work * in_work )
875
870
{
876
871
int err = 0 ;
877
872
@@ -914,9 +909,15 @@ static int oplock_break(struct oplock_info *brk_opinfo, int req_op_level)
914
909
}
915
910
916
911
if (lease -> state & (SMB2_LEASE_WRITE_CACHING_LE |
917
- SMB2_LEASE_HANDLE_CACHING_LE ))
912
+ SMB2_LEASE_HANDLE_CACHING_LE )) {
913
+ if (in_work ) {
914
+ setup_async_work (in_work , NULL , NULL );
915
+ smb2_send_interim_resp (in_work , STATUS_PENDING );
916
+ release_async_work (in_work );
917
+ }
918
+
918
919
brk_opinfo -> op_state = OPLOCK_ACK_WAIT ;
919
- else
920
+ } else
920
921
atomic_dec (& brk_opinfo -> breaking_cnt );
921
922
} else {
922
923
err = oplock_break_pending (brk_opinfo , req_op_level );
@@ -1116,7 +1117,7 @@ void smb_send_parent_lease_break_noti(struct ksmbd_file *fp,
1116
1117
if (ksmbd_conn_releasing (opinfo -> conn ))
1117
1118
continue ;
1118
1119
1119
- oplock_break (opinfo , SMB2_OPLOCK_LEVEL_NONE );
1120
+ oplock_break (opinfo , SMB2_OPLOCK_LEVEL_NONE , NULL );
1120
1121
opinfo_put (opinfo );
1121
1122
}
1122
1123
}
@@ -1152,7 +1153,7 @@ void smb_lazy_parent_lease_break_close(struct ksmbd_file *fp)
1152
1153
1153
1154
if (ksmbd_conn_releasing (opinfo -> conn ))
1154
1155
continue ;
1155
- oplock_break (opinfo , SMB2_OPLOCK_LEVEL_NONE );
1156
+ oplock_break (opinfo , SMB2_OPLOCK_LEVEL_NONE , NULL );
1156
1157
opinfo_put (opinfo );
1157
1158
}
1158
1159
}
@@ -1252,8 +1253,7 @@ int smb_grant_oplock(struct ksmbd_work *work, int req_op_level, u64 pid,
1252
1253
goto op_break_not_needed ;
1253
1254
}
1254
1255
1255
- list_add (& work -> interim_entry , & prev_opinfo -> interim_list );
1256
- err = oplock_break (prev_opinfo , SMB2_OPLOCK_LEVEL_II );
1256
+ err = oplock_break (prev_opinfo , SMB2_OPLOCK_LEVEL_II , work );
1257
1257
opinfo_put (prev_opinfo );
1258
1258
if (err == - ENOENT )
1259
1259
goto set_lev ;
@@ -1322,8 +1322,7 @@ static void smb_break_all_write_oplock(struct ksmbd_work *work,
1322
1322
}
1323
1323
1324
1324
brk_opinfo -> open_trunc = is_trunc ;
1325
- list_add (& work -> interim_entry , & brk_opinfo -> interim_list );
1326
- oplock_break (brk_opinfo , SMB2_OPLOCK_LEVEL_II );
1325
+ oplock_break (brk_opinfo , SMB2_OPLOCK_LEVEL_II , work );
1327
1326
opinfo_put (brk_opinfo );
1328
1327
}
1329
1328
@@ -1386,7 +1385,7 @@ void smb_break_all_levII_oplock(struct ksmbd_work *work, struct ksmbd_file *fp,
1386
1385
SMB2_LEASE_KEY_SIZE ))
1387
1386
goto next ;
1388
1387
brk_op -> open_trunc = is_trunc ;
1389
- oplock_break (brk_op , SMB2_OPLOCK_LEVEL_NONE );
1388
+ oplock_break (brk_op , SMB2_OPLOCK_LEVEL_NONE , NULL );
1390
1389
next :
1391
1390
opinfo_put (brk_op );
1392
1391
rcu_read_lock ();
0 commit comments