@@ -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 );
@@ -803,7 +802,6 @@ static void __smb2_lease_break_noti(struct work_struct *wk)
803
802
static int smb2_lease_break_noti (struct oplock_info * opinfo )
804
803
{
805
804
struct ksmbd_conn * conn = opinfo -> conn ;
806
- struct list_head * tmp , * t ;
807
805
struct ksmbd_work * work ;
808
806
struct lease_break_info * br_info ;
809
807
struct lease * lease = opinfo -> o_lease ;
@@ -831,16 +829,6 @@ static int smb2_lease_break_noti(struct oplock_info *opinfo)
831
829
work -> sess = opinfo -> sess ;
832
830
833
831
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
- }
844
832
INIT_WORK (& work -> work , __smb2_lease_break_noti );
845
833
ksmbd_queue_work (work );
846
834
wait_for_break_ack (opinfo );
@@ -871,7 +859,8 @@ static void wait_lease_breaking(struct oplock_info *opinfo)
871
859
}
872
860
}
873
861
874
- static int oplock_break (struct oplock_info * brk_opinfo , int req_op_level )
862
+ static int oplock_break (struct oplock_info * brk_opinfo , int req_op_level ,
863
+ struct ksmbd_work * in_work )
875
864
{
876
865
int err = 0 ;
877
866
@@ -914,9 +903,15 @@ static int oplock_break(struct oplock_info *brk_opinfo, int req_op_level)
914
903
}
915
904
916
905
if (lease -> state & (SMB2_LEASE_WRITE_CACHING_LE |
917
- SMB2_LEASE_HANDLE_CACHING_LE ))
906
+ SMB2_LEASE_HANDLE_CACHING_LE )) {
907
+ if (in_work ) {
908
+ setup_async_work (in_work , NULL , NULL );
909
+ smb2_send_interim_resp (in_work , STATUS_PENDING );
910
+ release_async_work (in_work );
911
+ }
912
+
918
913
brk_opinfo -> op_state = OPLOCK_ACK_WAIT ;
919
- else
914
+ } else
920
915
atomic_dec (& brk_opinfo -> breaking_cnt );
921
916
} else {
922
917
err = oplock_break_pending (brk_opinfo , req_op_level );
@@ -1116,7 +1111,7 @@ void smb_send_parent_lease_break_noti(struct ksmbd_file *fp,
1116
1111
if (ksmbd_conn_releasing (opinfo -> conn ))
1117
1112
continue ;
1118
1113
1119
- oplock_break (opinfo , SMB2_OPLOCK_LEVEL_NONE );
1114
+ oplock_break (opinfo , SMB2_OPLOCK_LEVEL_NONE , NULL );
1120
1115
opinfo_put (opinfo );
1121
1116
}
1122
1117
}
@@ -1152,7 +1147,7 @@ void smb_lazy_parent_lease_break_close(struct ksmbd_file *fp)
1152
1147
1153
1148
if (ksmbd_conn_releasing (opinfo -> conn ))
1154
1149
continue ;
1155
- oplock_break (opinfo , SMB2_OPLOCK_LEVEL_NONE );
1150
+ oplock_break (opinfo , SMB2_OPLOCK_LEVEL_NONE , NULL );
1156
1151
opinfo_put (opinfo );
1157
1152
}
1158
1153
}
@@ -1252,8 +1247,7 @@ int smb_grant_oplock(struct ksmbd_work *work, int req_op_level, u64 pid,
1252
1247
goto op_break_not_needed ;
1253
1248
}
1254
1249
1255
- list_add (& work -> interim_entry , & prev_opinfo -> interim_list );
1256
- err = oplock_break (prev_opinfo , SMB2_OPLOCK_LEVEL_II );
1250
+ err = oplock_break (prev_opinfo , SMB2_OPLOCK_LEVEL_II , work );
1257
1251
opinfo_put (prev_opinfo );
1258
1252
if (err == - ENOENT )
1259
1253
goto set_lev ;
@@ -1322,8 +1316,7 @@ static void smb_break_all_write_oplock(struct ksmbd_work *work,
1322
1316
}
1323
1317
1324
1318
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 );
1319
+ oplock_break (brk_opinfo , SMB2_OPLOCK_LEVEL_II , work );
1327
1320
opinfo_put (brk_opinfo );
1328
1321
}
1329
1322
@@ -1386,7 +1379,7 @@ void smb_break_all_levII_oplock(struct ksmbd_work *work, struct ksmbd_file *fp,
1386
1379
SMB2_LEASE_KEY_SIZE ))
1387
1380
goto next ;
1388
1381
brk_op -> open_trunc = is_trunc ;
1389
- oplock_break (brk_op , SMB2_OPLOCK_LEVEL_NONE );
1382
+ oplock_break (brk_op , SMB2_OPLOCK_LEVEL_NONE , NULL );
1390
1383
next :
1391
1384
opinfo_put (brk_op );
1392
1385
rcu_read_lock ();
0 commit comments