@@ -51,6 +51,7 @@ static struct oplock_info *alloc_opinfo(struct ksmbd_work *work,
51
51
init_waitqueue_head (& opinfo -> oplock_brk );
52
52
atomic_set (& opinfo -> refcount , 1 );
53
53
atomic_set (& opinfo -> breaking_cnt , 0 );
54
+ atomic_inc (& opinfo -> conn -> refcnt );
54
55
55
56
return opinfo ;
56
57
}
@@ -124,6 +125,8 @@ static void free_opinfo(struct oplock_info *opinfo)
124
125
{
125
126
if (opinfo -> is_lease )
126
127
free_lease (opinfo );
128
+ if (opinfo -> conn && atomic_dec_and_test (& opinfo -> conn -> refcnt ))
129
+ kfree (opinfo -> conn );
127
130
kfree (opinfo );
128
131
}
129
132
@@ -162,9 +165,7 @@ static struct oplock_info *opinfo_get_list(struct ksmbd_inode *ci)
162
165
if (!atomic_inc_not_zero (& opinfo -> refcount ))
163
166
opinfo = NULL ;
164
167
else {
165
- atomic_inc (& opinfo -> conn -> r_count );
166
168
if (ksmbd_conn_releasing (opinfo -> conn )) {
167
- atomic_dec (& opinfo -> conn -> r_count );
168
169
atomic_dec (& opinfo -> refcount );
169
170
opinfo = NULL ;
170
171
}
@@ -176,26 +177,11 @@ static struct oplock_info *opinfo_get_list(struct ksmbd_inode *ci)
176
177
return opinfo ;
177
178
}
178
179
179
- static void opinfo_conn_put (struct oplock_info * opinfo )
180
+ void opinfo_put (struct oplock_info * opinfo )
180
181
{
181
- struct ksmbd_conn * conn ;
182
-
183
182
if (!opinfo )
184
183
return ;
185
184
186
- conn = opinfo -> conn ;
187
- /*
188
- * Checking waitqueue to dropping pending requests on
189
- * disconnection. waitqueue_active is safe because it
190
- * uses atomic operation for condition.
191
- */
192
- if (!atomic_dec_return (& conn -> r_count ) && waitqueue_active (& conn -> r_count_q ))
193
- wake_up (& conn -> r_count_q );
194
- opinfo_put (opinfo );
195
- }
196
-
197
- void opinfo_put (struct oplock_info * opinfo )
198
- {
199
185
if (!atomic_dec_and_test (& opinfo -> refcount ))
200
186
return ;
201
187
@@ -1130,15 +1116,12 @@ void smb_send_parent_lease_break_noti(struct ksmbd_file *fp,
1130
1116
if (!atomic_inc_not_zero (& opinfo -> refcount ))
1131
1117
continue ;
1132
1118
1133
- atomic_inc (& opinfo -> conn -> r_count );
1134
- if (ksmbd_conn_releasing (opinfo -> conn )) {
1135
- atomic_dec (& opinfo -> conn -> r_count );
1119
+ if (ksmbd_conn_releasing (opinfo -> conn ))
1136
1120
continue ;
1137
- }
1138
1121
1139
1122
read_unlock (& p_ci -> m_lock );
1140
1123
oplock_break (opinfo , SMB2_OPLOCK_LEVEL_NONE );
1141
- opinfo_conn_put (opinfo );
1124
+ opinfo_put (opinfo );
1142
1125
read_lock (& p_ci -> m_lock );
1143
1126
}
1144
1127
}
@@ -1172,14 +1155,11 @@ void smb_lazy_parent_lease_break_close(struct ksmbd_file *fp)
1172
1155
if (!atomic_inc_not_zero (& opinfo -> refcount ))
1173
1156
continue ;
1174
1157
1175
- atomic_inc (& opinfo -> conn -> r_count );
1176
- if (ksmbd_conn_releasing (opinfo -> conn )) {
1177
- atomic_dec (& opinfo -> conn -> r_count );
1158
+ if (ksmbd_conn_releasing (opinfo -> conn ))
1178
1159
continue ;
1179
- }
1180
1160
read_unlock (& p_ci -> m_lock );
1181
1161
oplock_break (opinfo , SMB2_OPLOCK_LEVEL_NONE );
1182
- opinfo_conn_put (opinfo );
1162
+ opinfo_put (opinfo );
1183
1163
read_lock (& p_ci -> m_lock );
1184
1164
}
1185
1165
}
@@ -1259,7 +1239,7 @@ int smb_grant_oplock(struct ksmbd_work *work, int req_op_level, u64 pid,
1259
1239
prev_opinfo = opinfo_get_list (ci );
1260
1240
if (!prev_opinfo ||
1261
1241
(prev_opinfo -> level == SMB2_OPLOCK_LEVEL_NONE && lctx )) {
1262
- opinfo_conn_put (prev_opinfo );
1242
+ opinfo_put (prev_opinfo );
1263
1243
goto set_lev ;
1264
1244
}
1265
1245
prev_op_has_lease = prev_opinfo -> is_lease ;
@@ -1269,19 +1249,19 @@ int smb_grant_oplock(struct ksmbd_work *work, int req_op_level, u64 pid,
1269
1249
if (share_ret < 0 &&
1270
1250
prev_opinfo -> level == SMB2_OPLOCK_LEVEL_EXCLUSIVE ) {
1271
1251
err = share_ret ;
1272
- opinfo_conn_put (prev_opinfo );
1252
+ opinfo_put (prev_opinfo );
1273
1253
goto err_out ;
1274
1254
}
1275
1255
1276
1256
if (prev_opinfo -> level != SMB2_OPLOCK_LEVEL_BATCH &&
1277
1257
prev_opinfo -> level != SMB2_OPLOCK_LEVEL_EXCLUSIVE ) {
1278
- opinfo_conn_put (prev_opinfo );
1258
+ opinfo_put (prev_opinfo );
1279
1259
goto op_break_not_needed ;
1280
1260
}
1281
1261
1282
1262
list_add (& work -> interim_entry , & prev_opinfo -> interim_list );
1283
1263
err = oplock_break (prev_opinfo , SMB2_OPLOCK_LEVEL_II );
1284
- opinfo_conn_put (prev_opinfo );
1264
+ opinfo_put (prev_opinfo );
1285
1265
if (err == - ENOENT )
1286
1266
goto set_lev ;
1287
1267
/* Check all oplock was freed by close */
@@ -1344,14 +1324,14 @@ static void smb_break_all_write_oplock(struct ksmbd_work *work,
1344
1324
return ;
1345
1325
if (brk_opinfo -> level != SMB2_OPLOCK_LEVEL_BATCH &&
1346
1326
brk_opinfo -> level != SMB2_OPLOCK_LEVEL_EXCLUSIVE ) {
1347
- opinfo_conn_put (brk_opinfo );
1327
+ opinfo_put (brk_opinfo );
1348
1328
return ;
1349
1329
}
1350
1330
1351
1331
brk_opinfo -> open_trunc = is_trunc ;
1352
1332
list_add (& work -> interim_entry , & brk_opinfo -> interim_list );
1353
1333
oplock_break (brk_opinfo , SMB2_OPLOCK_LEVEL_II );
1354
- opinfo_conn_put (brk_opinfo );
1334
+ opinfo_put (brk_opinfo );
1355
1335
}
1356
1336
1357
1337
/**
@@ -1380,11 +1360,8 @@ void smb_break_all_levII_oplock(struct ksmbd_work *work, struct ksmbd_file *fp,
1380
1360
if (!atomic_inc_not_zero (& brk_op -> refcount ))
1381
1361
continue ;
1382
1362
1383
- atomic_inc (& brk_op -> conn -> r_count );
1384
- if (ksmbd_conn_releasing (brk_op -> conn )) {
1385
- atomic_dec (& brk_op -> conn -> r_count );
1363
+ if (ksmbd_conn_releasing (brk_op -> conn ))
1386
1364
continue ;
1387
- }
1388
1365
1389
1366
rcu_read_unlock ();
1390
1367
if (brk_op -> is_lease && (brk_op -> o_lease -> state &
@@ -1415,7 +1392,7 @@ void smb_break_all_levII_oplock(struct ksmbd_work *work, struct ksmbd_file *fp,
1415
1392
brk_op -> open_trunc = is_trunc ;
1416
1393
oplock_break (brk_op , SMB2_OPLOCK_LEVEL_NONE );
1417
1394
next :
1418
- opinfo_conn_put (brk_op );
1395
+ opinfo_put (brk_op );
1419
1396
rcu_read_lock ();
1420
1397
}
1421
1398
rcu_read_unlock ();
0 commit comments