xref: /linux/fs/smb/server/oplock.c (revision b49024d79fb7304f646003fcd8846ef26dea7e92)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *   Copyright (C) 2016 Namjae Jeon <linkinjeon@kernel.org>
4  *   Copyright (C) 2018 Samsung Electronics Co., Ltd.
5  */
6 
7 #include <linux/moduleparam.h>
8 #include <linux/err.h>
9 
10 #include "glob.h"
11 #include "oplock.h"
12 
13 #include "smb_common.h"
14 #include "../common/smb2status.h"
15 #include "connection.h"
16 #include "mgmt/user_session.h"
17 #include "mgmt/share_config.h"
18 #include "mgmt/tree_connect.h"
19 #include "server.h"
20 
21 static LIST_HEAD(lease_table_list);
22 static DEFINE_RWLOCK(lease_list_lock);
23 
24 #define SMB2_LEASE_STATE_MASK_LE	(SMB2_LEASE_READ_CACHING_LE | \
25 					 SMB2_LEASE_HANDLE_CACHING_LE | \
26 					 SMB2_LEASE_WRITE_CACHING_LE)
27 
lease_state_valid(__le32 state)28 static bool lease_state_valid(__le32 state)
29 {
30 	return !(state & ~SMB2_LEASE_STATE_MASK_LE);
31 }
32 
lease_state_grantable(__le32 state)33 static __le32 lease_state_grantable(__le32 state)
34 {
35 	if (state == SMB2_LEASE_READ_CACHING_LE ||
36 	    state == (SMB2_LEASE_READ_CACHING_LE | SMB2_LEASE_HANDLE_CACHING_LE) ||
37 	    state == (SMB2_LEASE_READ_CACHING_LE | SMB2_LEASE_WRITE_CACHING_LE) ||
38 	    state == SMB2_LEASE_STATE_MASK_LE)
39 		return state;
40 
41 	return 0;
42 }
43 
lease_v2_flags_valid(__le32 flags)44 static bool lease_v2_flags_valid(__le32 flags)
45 {
46 	return !(flags & ~SMB2_LEASE_FLAG_PARENT_LEASE_KEY_SET_LE);
47 }
48 
lease_has_parent_key(struct lease * lease)49 static bool lease_has_parent_key(struct lease *lease)
50 {
51 	return lease->flags & SMB2_LEASE_FLAG_PARENT_LEASE_KEY_SET_LE;
52 }
53 
lease_break_in_progress(struct lease * lease)54 static bool lease_break_in_progress(struct lease *lease)
55 {
56 	struct oplock_info *opinfo;
57 	bool ret = false;
58 
59 	spin_lock(&lease->lock);
60 	list_for_each_entry(opinfo, &lease->open_list, lease_entry) {
61 		if (opinfo->op_state == OPLOCK_ACK_WAIT) {
62 			ret = true;
63 			break;
64 		}
65 	}
66 	spin_unlock(&lease->lock);
67 
68 	return ret;
69 }
70 
71 /**
72  * alloc_opinfo() - allocate a new opinfo object for oplock info
73  * @work:	smb work
74  * @id:		fid of open file
75  * @Tid:	tree id of connection
76  *
77  * Return:      allocated opinfo object on success, otherwise NULL
78  */
alloc_opinfo(struct ksmbd_work * work,u64 id,__u16 Tid)79 static struct oplock_info *alloc_opinfo(struct ksmbd_work *work,
80 					u64 id, __u16 Tid)
81 {
82 	struct ksmbd_session *sess = work->sess;
83 	struct oplock_info *opinfo;
84 
85 	opinfo = kzalloc_obj(struct oplock_info, KSMBD_DEFAULT_GFP);
86 	if (!opinfo)
87 		return NULL;
88 
89 	opinfo->sess = sess;
90 	opinfo->conn = ksmbd_conn_get(work->conn);
91 	opinfo->level = SMB2_OPLOCK_LEVEL_NONE;
92 	opinfo->op_state = OPLOCK_STATE_NONE;
93 	spin_lock_init(&opinfo->state_lock);
94 	opinfo->pending_break = 0;
95 	opinfo->fid = id;
96 	opinfo->Tid = Tid;
97 	INIT_LIST_HEAD(&opinfo->op_entry);
98 	INIT_LIST_HEAD(&opinfo->lease_entry);
99 	init_waitqueue_head(&opinfo->oplock_q);
100 	init_waitqueue_head(&opinfo->oplock_brk);
101 	atomic_set(&opinfo->refcount, 1);
102 	atomic_set(&opinfo->breaking_cnt, 0);
103 
104 	return opinfo;
105 }
106 
lease_get(struct lease * lease)107 static void lease_get(struct lease *lease)
108 {
109 	atomic_inc(&lease->refcount);
110 }
111 
lease_put(struct lease * lease)112 static void lease_put(struct lease *lease)
113 {
114 	if (lease && atomic_dec_and_test(&lease->refcount))
115 		kfree(lease);
116 }
117 
lease_add_table(struct lease * lease,struct lease_table * lb)118 static void lease_add_table(struct lease *lease, struct lease_table *lb)
119 {
120 	lease_get(lease);
121 	lease->l_lb = lb;
122 	spin_lock(&lb->lb_lock);
123 	list_add_rcu(&lease->l_entry, &lb->lease_list);
124 	spin_unlock(&lb->lb_lock);
125 }
126 
lease_del_table(struct lease * lease)127 static void lease_del_table(struct lease *lease)
128 {
129 	struct lease_table *lb = lease->l_lb;
130 
131 	if (!lb)
132 		return;
133 
134 	spin_lock(&lb->lb_lock);
135 	if (list_empty(&lease->l_entry)) {
136 		spin_unlock(&lb->lb_lock);
137 		return;
138 	}
139 
140 	list_del_init(&lease->l_entry);
141 	lease->l_lb = NULL;
142 	spin_unlock(&lb->lb_lock);
143 
144 	lease_put(lease);
145 }
146 
alloc_lease_table(struct oplock_info * opinfo)147 static struct lease_table *alloc_lease_table(struct oplock_info *opinfo)
148 {
149 	struct lease_table *lb;
150 
151 	lb = kmalloc_obj(struct lease_table, KSMBD_DEFAULT_GFP);
152 	if (!lb)
153 		return NULL;
154 
155 	memcpy(lb->client_guid, opinfo->conn->ClientGUID,
156 	       SMB2_CLIENT_GUID_SIZE);
157 	lb->conn = ksmbd_conn_get(opinfo->conn);
158 	INIT_LIST_HEAD(&lb->lease_list);
159 	spin_lock_init(&lb->lb_lock);
160 	return lb;
161 }
162 
free_lease_table(struct lease_table * lb)163 static void free_lease_table(struct lease_table *lb)
164 {
165 	if (!lb)
166 		return;
167 
168 	ksmbd_conn_put(lb->conn);
169 	kfree(lb);
170 }
171 
alloc_lease(struct lease_ctx_info * lctx,struct ksmbd_inode * ci)172 static struct lease *alloc_lease(struct lease_ctx_info *lctx,
173 				 struct ksmbd_inode *ci)
174 {
175 	struct lease *lease;
176 
177 	lease = kmalloc_obj(struct lease, KSMBD_DEFAULT_GFP);
178 	if (!lease)
179 		return NULL;
180 
181 	memcpy(lease->lease_key, lctx->lease_key, SMB2_LEASE_KEY_SIZE);
182 	lease->state = lctx->req_state;
183 	lease->new_state = 0;
184 	lease->flags = lctx->flags;
185 	lease->duration = lctx->duration;
186 	lease->is_dir = lctx->is_dir;
187 	memcpy(lease->parent_lease_key, lctx->parent_lease_key, SMB2_LEASE_KEY_SIZE);
188 	lease->version = lctx->version;
189 	lease->epoch = lctx->version == 2 ? le16_to_cpu(lctx->epoch) + 1 : 0;
190 	lease->ci = ci;
191 	lease->reuse_epoch = false;
192 	lease->l_lb = NULL;
193 	INIT_LIST_HEAD(&lease->l_entry);
194 	INIT_LIST_HEAD(&lease->open_list);
195 	spin_lock_init(&lease->lock);
196 	atomic_set(&lease->refcount, 1);
197 
198 	return lease;
199 }
200 
lease_add_open(struct lease * lease,struct oplock_info * opinfo)201 static void lease_add_open(struct lease *lease, struct oplock_info *opinfo)
202 {
203 	spin_lock(&lease->lock);
204 	list_add(&opinfo->lease_entry, &lease->open_list);
205 	spin_unlock(&lease->lock);
206 }
207 
lease_del_open(struct oplock_info * opinfo)208 static void lease_del_open(struct oplock_info *opinfo)
209 {
210 	struct lease *lease = opinfo->o_lease;
211 	bool remove_table = false;
212 
213 	if (!lease)
214 		return;
215 
216 	spin_lock(&lease->lock);
217 	if (!list_empty(&opinfo->lease_entry)) {
218 		list_del_init(&opinfo->lease_entry);
219 		remove_table = list_empty(&lease->open_list);
220 	}
221 	spin_unlock(&lease->lock);
222 
223 	if (remove_table) {
224 		write_lock(&lease_list_lock);
225 		lease_del_table(lease);
226 		write_unlock(&lease_list_lock);
227 	}
228 }
229 
free_lease(struct oplock_info * opinfo)230 static void free_lease(struct oplock_info *opinfo)
231 {
232 	lease_put(opinfo->o_lease);
233 }
234 
__free_opinfo(struct oplock_info * opinfo)235 static void __free_opinfo(struct oplock_info *opinfo)
236 {
237 	if (opinfo->is_lease)
238 		free_lease(opinfo);
239 	ksmbd_conn_put(opinfo->conn);
240 	kfree(opinfo);
241 }
242 
free_opinfo_rcu(struct rcu_head * rcu)243 static void free_opinfo_rcu(struct rcu_head *rcu)
244 {
245 	struct oplock_info *opinfo = container_of(rcu, struct oplock_info, rcu);
246 
247 	__free_opinfo(opinfo);
248 }
249 
free_opinfo(struct oplock_info * opinfo)250 static void free_opinfo(struct oplock_info *opinfo)
251 {
252 	call_rcu(&opinfo->rcu, free_opinfo_rcu);
253 }
254 
lease_update_oplock_levels(struct lease * lease)255 void lease_update_oplock_levels(struct lease *lease)
256 {
257 	struct oplock_info *opinfo;
258 	__u8 level;
259 
260 	if (!lease)
261 		return;
262 
263 	level = smb2_map_lease_to_oplock(lease->state);
264 	spin_lock(&lease->lock);
265 	list_for_each_entry(opinfo, &lease->open_list, lease_entry)
266 		opinfo->level = level;
267 	spin_unlock(&lease->lock);
268 }
269 
opinfo_get(struct ksmbd_file * fp)270 struct oplock_info *opinfo_get(struct ksmbd_file *fp)
271 {
272 	struct oplock_info *opinfo;
273 
274 	rcu_read_lock();
275 	opinfo = rcu_dereference(fp->f_opinfo);
276 	if (opinfo && !atomic_inc_not_zero(&opinfo->refcount))
277 		opinfo = NULL;
278 	rcu_read_unlock();
279 
280 	return opinfo;
281 }
282 
283 struct oplock_snapshot {
284 	bool durable_open;
285 	bool durable_detached;
286 	unsigned long long fid;
287 };
288 
opinfo_get_list(struct ksmbd_inode * ci,struct ksmbd_file * skip_fp,struct oplock_snapshot * snapshot)289 static struct oplock_info *opinfo_get_list(struct ksmbd_inode *ci,
290 					   struct ksmbd_file *skip_fp,
291 					   struct oplock_snapshot *snapshot)
292 {
293 	struct oplock_info *opinfo;
294 
295 	if (snapshot) {
296 		snapshot->durable_open = false;
297 		snapshot->durable_detached = false;
298 		snapshot->fid = KSMBD_NO_FID;
299 	}
300 
301 	down_read(&ci->m_lock);
302 	opinfo = list_first_entry_or_null(&ci->m_op_list, struct oplock_info,
303 					  op_entry);
304 	if (opinfo) {
305 		if (opinfo->conn == NULL ||
306 		    !atomic_inc_not_zero(&opinfo->refcount))
307 			opinfo = NULL;
308 		else {
309 			if (ksmbd_conn_releasing(opinfo->conn)) {
310 				atomic_dec(&opinfo->refcount);
311 				opinfo = NULL;
312 			}
313 		}
314 
315 		if (opinfo && snapshot && opinfo->o_fp &&
316 		    opinfo->o_fp != skip_fp &&
317 		    READ_ONCE(opinfo->o_fp->is_durable)) {
318 			snapshot->durable_open = true;
319 			snapshot->durable_detached =
320 				!READ_ONCE(opinfo->o_fp->conn) ||
321 				!READ_ONCE(opinfo->o_fp->tcon);
322 			snapshot->fid = opinfo->fid;
323 		}
324 	}
325 	up_read(&ci->m_lock);
326 
327 	return opinfo;
328 }
329 
opinfo_put(struct oplock_info * opinfo)330 void opinfo_put(struct oplock_info *opinfo)
331 {
332 	if (!opinfo)
333 		return;
334 
335 	if (!atomic_dec_and_test(&opinfo->refcount))
336 		return;
337 
338 	free_opinfo(opinfo);
339 }
340 
ksmbd_inode_has_lease(struct ksmbd_inode * ci)341 static bool ksmbd_inode_has_lease(struct ksmbd_inode *ci)
342 {
343 	struct oplock_info *opinfo = opinfo_get_list(ci, NULL, NULL);
344 	bool is_lease;
345 
346 	if (!opinfo)
347 		return false;
348 	is_lease = opinfo->is_lease;
349 	opinfo_put(opinfo);
350 	return is_lease;
351 }
352 
opinfo_add(struct oplock_info * opinfo,struct ksmbd_file * fp)353 static void opinfo_add(struct oplock_info *opinfo, struct ksmbd_file *fp)
354 {
355 	struct ksmbd_inode *ci = fp->f_ci;
356 
357 	down_write(&ci->m_lock);
358 	list_add(&opinfo->op_entry, &ci->m_op_list);
359 	up_write(&ci->m_lock);
360 }
361 
opinfo_del(struct oplock_info * opinfo)362 static void opinfo_del(struct oplock_info *opinfo)
363 {
364 	struct ksmbd_inode *ci = opinfo->o_fp->f_ci;
365 
366 	if (opinfo->is_lease)
367 		lease_del_open(opinfo);
368 
369 	down_write(&ci->m_lock);
370 	list_del(&opinfo->op_entry);
371 	up_write(&ci->m_lock);
372 }
373 
opinfo_count(struct ksmbd_file * fp)374 static unsigned long opinfo_count(struct ksmbd_file *fp)
375 {
376 	if (ksmbd_stream_fd(fp))
377 		return atomic_read(&fp->f_ci->sop_count);
378 	else
379 		return atomic_read(&fp->f_ci->op_count);
380 }
381 
opinfo_count_inc(struct ksmbd_file * fp)382 static void opinfo_count_inc(struct ksmbd_file *fp)
383 {
384 	if (ksmbd_stream_fd(fp))
385 		return atomic_inc(&fp->f_ci->sop_count);
386 	else
387 		return atomic_inc(&fp->f_ci->op_count);
388 }
389 
opinfo_count_dec(struct ksmbd_file * fp)390 static void opinfo_count_dec(struct ksmbd_file *fp)
391 {
392 	if (ksmbd_stream_fd(fp))
393 		return atomic_dec(&fp->f_ci->sop_count);
394 	else
395 		return atomic_dec(&fp->f_ci->op_count);
396 }
397 
398 /**
399  * opinfo_write_to_read() - convert a write oplock to read oplock
400  * @opinfo:		current oplock info
401  *
402  * Return:      0 on success, otherwise -EINVAL
403  */
opinfo_write_to_read(struct oplock_info * opinfo)404 int opinfo_write_to_read(struct oplock_info *opinfo)
405 {
406 	struct lease *lease = opinfo->o_lease;
407 
408 	if (!(opinfo->level == SMB2_OPLOCK_LEVEL_BATCH ||
409 	      opinfo->level == SMB2_OPLOCK_LEVEL_EXCLUSIVE)) {
410 		pr_err("bad oplock(0x%x)\n", opinfo->level);
411 		if (opinfo->is_lease)
412 			pr_err("lease state(0x%x)\n", lease->state);
413 		return -EINVAL;
414 	}
415 	opinfo->level = SMB2_OPLOCK_LEVEL_II;
416 
417 	if (opinfo->is_lease) {
418 		lease->state = lease->new_state;
419 		lease_update_oplock_levels(lease);
420 	}
421 	return 0;
422 }
423 
424 /**
425  * opinfo_read_handle_to_read() - convert a read/handle oplock to read oplock
426  * @opinfo:		current oplock info
427  *
428  * Return:      0 on success, otherwise -EINVAL
429  */
opinfo_read_handle_to_read(struct oplock_info * opinfo)430 int opinfo_read_handle_to_read(struct oplock_info *opinfo)
431 {
432 	struct lease *lease = opinfo->o_lease;
433 
434 	lease->state = lease->new_state;
435 	lease_update_oplock_levels(lease);
436 	return 0;
437 }
438 
439 /**
440  * opinfo_write_to_none() - convert a write oplock to none
441  * @opinfo:	current oplock info
442  *
443  * Return:      0 on success, otherwise -EINVAL
444  */
opinfo_write_to_none(struct oplock_info * opinfo)445 int opinfo_write_to_none(struct oplock_info *opinfo)
446 {
447 	struct lease *lease = opinfo->o_lease;
448 
449 	if (!(opinfo->level == SMB2_OPLOCK_LEVEL_BATCH ||
450 	      opinfo->level == SMB2_OPLOCK_LEVEL_EXCLUSIVE)) {
451 		pr_err("bad oplock(0x%x)\n", opinfo->level);
452 		if (opinfo->is_lease)
453 			pr_err("lease state(0x%x)\n", lease->state);
454 		return -EINVAL;
455 	}
456 	opinfo->level = SMB2_OPLOCK_LEVEL_NONE;
457 	if (opinfo->is_lease) {
458 		lease->state = lease->new_state;
459 		lease_update_oplock_levels(lease);
460 	}
461 	return 0;
462 }
463 
464 /**
465  * opinfo_read_to_none() - convert a write read to none
466  * @opinfo:	current oplock info
467  *
468  * Return:      0 on success, otherwise -EINVAL
469  */
opinfo_read_to_none(struct oplock_info * opinfo)470 int opinfo_read_to_none(struct oplock_info *opinfo)
471 {
472 	struct lease *lease = opinfo->o_lease;
473 
474 	if (opinfo->level != SMB2_OPLOCK_LEVEL_II) {
475 		pr_err("bad oplock(0x%x)\n", opinfo->level);
476 		if (opinfo->is_lease)
477 			pr_err("lease state(0x%x)\n", lease->state);
478 		return -EINVAL;
479 	}
480 	opinfo->level = SMB2_OPLOCK_LEVEL_NONE;
481 	if (opinfo->is_lease) {
482 		lease->state = lease->new_state;
483 		lease_update_oplock_levels(lease);
484 	}
485 	return 0;
486 }
487 
488 /**
489  * lease_read_to_write() - upgrade lease state from read to write
490  * @opinfo:	current lease info
491  *
492  * Return:      0 on success, otherwise -EINVAL
493  */
lease_read_to_write(struct oplock_info * opinfo)494 int lease_read_to_write(struct oplock_info *opinfo)
495 {
496 	struct lease *lease = opinfo->o_lease;
497 
498 	if (!(lease->state & SMB2_LEASE_READ_CACHING_LE)) {
499 		ksmbd_debug(OPLOCK, "bad lease state(0x%x)\n", lease->state);
500 		return -EINVAL;
501 	}
502 
503 	lease->new_state = SMB2_LEASE_NONE_LE;
504 	lease->state |= SMB2_LEASE_WRITE_CACHING_LE;
505 	lease_update_oplock_levels(lease);
506 	return 0;
507 }
508 
509 /**
510  * lease_none_upgrade() - upgrade lease state from none
511  * @opinfo:	current lease info
512  * @new_state:	new lease state
513  *
514  * Return:	0 on success, otherwise -EINVAL
515  */
lease_none_upgrade(struct oplock_info * opinfo,__le32 new_state)516 static int lease_none_upgrade(struct oplock_info *opinfo, __le32 new_state)
517 {
518 	struct lease *lease = opinfo->o_lease;
519 
520 	if (!(lease->state == SMB2_LEASE_NONE_LE)) {
521 		ksmbd_debug(OPLOCK, "bad lease state(0x%x)\n", lease->state);
522 		return -EINVAL;
523 	}
524 
525 	lease->new_state = SMB2_LEASE_NONE_LE;
526 	lease->state = new_state;
527 	lease_update_oplock_levels(lease);
528 
529 	return 0;
530 }
531 
532 /**
533  * close_id_del_oplock() - release oplock object at file close time
534  * @fp:		ksmbd file pointer
535  */
close_id_del_oplock(struct ksmbd_file * fp)536 void close_id_del_oplock(struct ksmbd_file *fp)
537 {
538 	struct oplock_info *opinfo;
539 
540 	if (fp->reserve_lease_break)
541 		smb_lazy_parent_lease_break_close(fp);
542 
543 	opinfo = opinfo_get(fp);
544 	if (!opinfo)
545 		return;
546 
547 	opinfo_del(opinfo);
548 
549 	rcu_assign_pointer(fp->f_opinfo, NULL);
550 	spin_lock(&opinfo->state_lock);
551 	if (opinfo->op_state == OPLOCK_ACK_WAIT && opinfo->is_lease)
552 		atomic_set(&opinfo->breaking_cnt, 0);
553 	/*
554 	 * An opinfo that has been removed from the inode list is terminal. Keep
555 	 * this transition and releasing pending_break under state_lock. a breaker
556 	 * takes the same lock before it acquires pending_break or sets ACK_WAIT.
557 	 */
558 	opinfo->op_state = OPLOCK_CLOSING;
559 	clear_bit_unlock(0, &opinfo->pending_break);
560 	spin_unlock(&opinfo->state_lock);
561 	wake_up_interruptible_all(&opinfo->oplock_q);
562 	if (opinfo->is_lease)
563 		wake_up_interruptible_all(&opinfo->oplock_brk);
564 	/* memory barrier is needed for wake_up_bit() */
565 	smp_mb__after_atomic();
566 	wake_up_bit(&opinfo->pending_break, 0);
567 
568 	opinfo_count_dec(fp);
569 	atomic_dec(&opinfo->refcount);
570 	opinfo_put(opinfo);
571 }
572 
573 /**
574  * grant_write_oplock() - grant exclusive/batch oplock or write lease
575  * @opinfo_new:	new oplock info object
576  * @req_oplock: request oplock
577  * @lctx:	lease context information
578  *
579  * Return:      0
580  */
grant_write_oplock(struct oplock_info * opinfo_new,int req_oplock,struct lease_ctx_info * lctx)581 static void grant_write_oplock(struct oplock_info *opinfo_new, int req_oplock,
582 			       struct lease_ctx_info *lctx)
583 {
584 	struct lease *lease = opinfo_new->o_lease;
585 
586 	if (req_oplock == SMB2_OPLOCK_LEVEL_BATCH)
587 		opinfo_new->level = SMB2_OPLOCK_LEVEL_BATCH;
588 	else
589 		opinfo_new->level = SMB2_OPLOCK_LEVEL_EXCLUSIVE;
590 
591 	if (lctx) {
592 		lease->state = lctx->req_state;
593 		memcpy(lease->lease_key, lctx->lease_key, SMB2_LEASE_KEY_SIZE);
594 	}
595 }
596 
597 /**
598  * grant_read_oplock() - grant level2 oplock or read lease
599  * @opinfo_new:	new oplock info object
600  * @lctx:	lease context information
601  *
602  * Return:      0
603  */
grant_read_oplock(struct oplock_info * opinfo_new,struct lease_ctx_info * lctx)604 static void grant_read_oplock(struct oplock_info *opinfo_new,
605 			      struct lease_ctx_info *lctx)
606 {
607 	struct lease *lease = opinfo_new->o_lease;
608 
609 	opinfo_new->level = SMB2_OPLOCK_LEVEL_II;
610 
611 	if (lctx) {
612 		lease->state = SMB2_LEASE_READ_CACHING_LE;
613 		if (lctx->req_state & SMB2_LEASE_HANDLE_CACHING_LE)
614 			lease->state |= SMB2_LEASE_HANDLE_CACHING_LE;
615 		memcpy(lease->lease_key, lctx->lease_key, SMB2_LEASE_KEY_SIZE);
616 	}
617 }
618 
619 /**
620  * grant_none_oplock() - grant none oplock or none lease
621  * @opinfo_new:	new oplock info object
622  * @lctx:	lease context information
623  *
624  * Return:      0
625  */
grant_none_oplock(struct oplock_info * opinfo_new,struct lease_ctx_info * lctx)626 static void grant_none_oplock(struct oplock_info *opinfo_new,
627 			      struct lease_ctx_info *lctx)
628 {
629 	struct lease *lease = opinfo_new->o_lease;
630 
631 	opinfo_new->level = SMB2_OPLOCK_LEVEL_NONE;
632 
633 	if (lctx) {
634 		lease->state = 0;
635 		memcpy(lease->lease_key, lctx->lease_key, SMB2_LEASE_KEY_SIZE);
636 	}
637 }
638 
compare_guid_key(struct oplock_info * opinfo,const char * guid1,const char * key1)639 static inline int compare_guid_key(struct oplock_info *opinfo,
640 				   const char *guid1, const char *key1)
641 {
642 	const char *guid2, *key2;
643 	struct ksmbd_conn *conn;
644 
645 	conn = READ_ONCE(opinfo->conn);
646 	if (!conn)
647 		return 0;
648 	guid2 = conn->ClientGUID;
649 	key2 = opinfo->o_lease->lease_key;
650 	if (!memcmp(guid1, guid2, SMB2_CLIENT_GUID_SIZE) &&
651 	    !memcmp(key1, key2, SMB2_LEASE_KEY_SIZE))
652 		return 1;
653 
654 	return 0;
655 }
656 
657 /**
658  * same_client_has_lease() - check whether current lease request is
659  *		from lease owner of file
660  * @ci:		master file pointer
661  * @client_guid:	Client GUID
662  * @lctx:		lease context information
663  *
664  * Return:      oplock(lease) object on success, otherwise NULL
665  */
same_client_has_lease(struct ksmbd_inode * ci,const char * client_guid,struct lease_ctx_info * lctx)666 static struct oplock_info *same_client_has_lease(struct ksmbd_inode *ci,
667 						 const char *client_guid,
668 						 struct lease_ctx_info *lctx)
669 {
670 	int ret;
671 	struct lease *lease;
672 	struct oplock_info *opinfo;
673 	struct oplock_info *m_opinfo = NULL;
674 
675 	if (!lctx)
676 		return NULL;
677 
678 	/*
679 	 * Compare lease key and client_guid to know request from same owner
680 	 * of same client
681 	 */
682 	down_read(&ci->m_lock);
683 	list_for_each_entry(opinfo, &ci->m_op_list, op_entry) {
684 		if (!opinfo->is_lease || !opinfo->conn)
685 			continue;
686 		lease = opinfo->o_lease;
687 
688 		ret = compare_guid_key(opinfo, client_guid, lctx->lease_key);
689 		if (ret) {
690 			if (!atomic_inc_not_zero(&opinfo->refcount))
691 				continue;
692 			if (m_opinfo)
693 				opinfo_put(m_opinfo);
694 			m_opinfo = opinfo;
695 
696 			/* skip upgrading lease about breaking lease */
697 			if (atomic_read(&opinfo->breaking_cnt))
698 				continue;
699 
700 			/* upgrading lease */
701 			if ((atomic_read(&ci->op_count) +
702 			     atomic_read(&ci->sop_count)) == 1) {
703 				if (lease->state != SMB2_LEASE_NONE_LE &&
704 				    lease->state == (lctx->req_state & lease->state)) {
705 					lease->epoch++;
706 					lease->state |= lctx->req_state;
707 					if (lctx->req_state &
708 						SMB2_LEASE_WRITE_CACHING_LE)
709 						lease_read_to_write(opinfo);
710 
711 				}
712 			} else if ((atomic_read(&ci->op_count) +
713 				    atomic_read(&ci->sop_count)) > 1) {
714 				if (lctx->req_state ==
715 				    (SMB2_LEASE_READ_CACHING_LE |
716 				     SMB2_LEASE_HANDLE_CACHING_LE)) {
717 					if (lease->state != lctx->req_state) {
718 						lease->epoch++;
719 						lease->state = lctx->req_state;
720 						lease_update_oplock_levels(lease);
721 					}
722 				}
723 			}
724 
725 			if (lctx->req_state && lease->state ==
726 			    SMB2_LEASE_NONE_LE) {
727 				lease->epoch++;
728 				lease_none_upgrade(opinfo, lctx->req_state);
729 			}
730 		}
731 	}
732 	up_read(&ci->m_lock);
733 
734 	return m_opinfo;
735 }
736 
wait_for_break_ack(struct oplock_info * opinfo)737 static bool wait_for_break_ack(struct oplock_info *opinfo)
738 {
739 	int rc = 0;
740 
741 	rc = wait_event_interruptible_timeout(opinfo->oplock_q,
742 					      opinfo->op_state == OPLOCK_STATE_NONE ||
743 					      opinfo->op_state == OPLOCK_CLOSING,
744 					      OPLOCK_WAIT_TIME);
745 
746 	/* is this a timeout ? */
747 	if (!rc) {
748 		spin_lock(&opinfo->state_lock);
749 		if (opinfo->op_state == OPLOCK_CLOSING) {
750 			spin_unlock(&opinfo->state_lock);
751 			return false;
752 		}
753 		if (opinfo->is_lease) {
754 			opinfo->o_lease->state = SMB2_LEASE_NONE_LE;
755 			lease_update_oplock_levels(opinfo->o_lease);
756 		}
757 		opinfo->level = SMB2_OPLOCK_LEVEL_NONE;
758 		opinfo->op_state = OPLOCK_STATE_NONE;
759 		spin_unlock(&opinfo->state_lock);
760 		return true;
761 	}
762 
763 	return false;
764 }
765 
wake_up_oplock_break(struct oplock_info * opinfo)766 static void wake_up_oplock_break(struct oplock_info *opinfo)
767 {
768 	clear_bit_unlock(0, &opinfo->pending_break);
769 	/* memory barrier is needed for wake_up_bit() */
770 	smp_mb__after_atomic();
771 	wake_up_bit(&opinfo->pending_break, 0);
772 }
773 
oplock_break_set_ack_wait(struct oplock_info * opinfo)774 static bool oplock_break_set_ack_wait(struct oplock_info *opinfo)
775 {
776 	bool ret = false;
777 
778 	spin_lock(&opinfo->state_lock);
779 	if (opinfo->op_state != OPLOCK_CLOSING) {
780 		opinfo->op_state = OPLOCK_ACK_WAIT;
781 		ret = true;
782 	}
783 	spin_unlock(&opinfo->state_lock);
784 
785 	return ret;
786 }
787 
oplock_break_pending(struct oplock_info * opinfo,int req_op_level)788 static int oplock_break_pending(struct oplock_info *opinfo, int req_op_level)
789 {
790 	for (;;) {
791 		bool closing;
792 
793 		spin_lock(&opinfo->state_lock);
794 		closing = opinfo->op_state == OPLOCK_CLOSING;
795 		if (!closing && !test_and_set_bit(0, &opinfo->pending_break)) {
796 			spin_unlock(&opinfo->state_lock);
797 			break;
798 		}
799 		spin_unlock(&opinfo->state_lock);
800 		if (closing)
801 			return -ENOENT;
802 
803 		if (opinfo->is_lease)
804 			opinfo->o_lease->reuse_epoch = true;
805 
806 		wait_on_bit(&opinfo->pending_break, 0, TASK_UNINTERRUPTIBLE);
807 
808 		/* Not immediately break to none. */
809 		opinfo->open_trunc = 0;
810 
811 		spin_lock(&opinfo->state_lock);
812 		closing = opinfo->op_state == OPLOCK_CLOSING;
813 		spin_unlock(&opinfo->state_lock);
814 		if (closing)
815 			return -ENOENT;
816 		if (opinfo->level <= req_op_level) {
817 			if (opinfo->is_lease == false)
818 				return 1;
819 
820 			if (opinfo->o_lease->state !=
821 			    (SMB2_LEASE_HANDLE_CACHING_LE |
822 			     SMB2_LEASE_READ_CACHING_LE))
823 				return 1;
824 		}
825 	}
826 
827 	if (opinfo->level <= req_op_level) {
828 		if (opinfo->is_lease == false) {
829 			wake_up_oplock_break(opinfo);
830 			return 1;
831 		}
832 		if (opinfo->o_lease->state !=
833 		    (SMB2_LEASE_HANDLE_CACHING_LE |
834 		     SMB2_LEASE_READ_CACHING_LE)) {
835 			wake_up_oplock_break(opinfo);
836 			return 1;
837 		}
838 	}
839 	return 0;
840 }
841 
lease_break_needed(struct oplock_info * opinfo,int req_op_level,bool open_trunc)842 static bool lease_break_needed(struct oplock_info *opinfo, int req_op_level,
843 			       bool open_trunc)
844 {
845 	struct lease *lease = opinfo->o_lease;
846 
847 	if (open_trunc)
848 		return lease->state != SMB2_LEASE_NONE_LE;
849 
850 	return opinfo->level > req_op_level;
851 }
852 
853 /**
854  * __smb2_oplock_break_noti() - send smb2 oplock break cmd from conn
855  * to client
856  * @wk:     smb work object
857  *
858  * There are two ways this function can be called. 1- while file open we break
859  * from exclusive/batch lock to levelII oplock and 2- while file write/truncate
860  * we break from levelII oplock no oplock.
861  * work->request_buf contains oplock_info.
862  */
__smb2_oplock_break_noti(struct work_struct * wk)863 static void __smb2_oplock_break_noti(struct work_struct *wk)
864 {
865 	struct smb2_oplock_break *rsp = NULL;
866 	struct ksmbd_work *work = container_of(wk, struct ksmbd_work, work);
867 	struct ksmbd_conn *conn = work->conn;
868 	struct oplock_break_info *br_info = work->request_buf;
869 	struct smb2_hdr *rsp_hdr;
870 	struct ksmbd_file *fp;
871 
872 	fp = ksmbd_lookup_global_fd(br_info->fid);
873 	if (!fp)
874 		goto out;
875 
876 	if (allocate_interim_rsp_buf(work)) {
877 		pr_err("smb2_allocate_rsp_buf failed! ");
878 		ksmbd_fd_put(work, fp);
879 		goto out;
880 	}
881 
882 	rsp_hdr = smb_get_msg(work->response_buf);
883 	memset(rsp_hdr, 0, sizeof(struct smb2_hdr) + 2);
884 	rsp_hdr->ProtocolId = SMB2_PROTO_NUMBER;
885 	rsp_hdr->StructureSize = SMB2_HEADER_STRUCTURE_SIZE;
886 	rsp_hdr->CreditRequest = cpu_to_le16(0);
887 	rsp_hdr->Command = SMB2_OPLOCK_BREAK;
888 	rsp_hdr->Flags = (SMB2_FLAGS_SERVER_TO_REDIR);
889 	rsp_hdr->NextCommand = 0;
890 	rsp_hdr->MessageId = cpu_to_le64(-1);
891 	rsp_hdr->Id.SyncId.ProcessId = 0;
892 	rsp_hdr->Id.SyncId.TreeId = 0;
893 	rsp_hdr->SessionId = 0;
894 	memset(rsp_hdr->Signature, 0, 16);
895 
896 	rsp = smb_get_msg(work->response_buf);
897 
898 	rsp->StructureSize = cpu_to_le16(24);
899 	if (!br_info->open_trunc &&
900 	    (br_info->level == SMB2_OPLOCK_LEVEL_BATCH ||
901 	     br_info->level == SMB2_OPLOCK_LEVEL_EXCLUSIVE))
902 		rsp->OplockLevel = SMB2_OPLOCK_LEVEL_II;
903 	else
904 		rsp->OplockLevel = SMB2_OPLOCK_LEVEL_NONE;
905 	rsp->Reserved = 0;
906 	rsp->Reserved2 = 0;
907 	rsp->PersistentFid = fp->persistent_id;
908 	rsp->VolatileFid = fp->volatile_id;
909 
910 	ksmbd_fd_put(work, fp);
911 	if (ksmbd_iov_pin_rsp(work, (void *)rsp,
912 			      sizeof(struct smb2_oplock_break)))
913 		goto out;
914 
915 	ksmbd_debug(OPLOCK,
916 		    "sending oplock break v_id %llu p_id = %llu lock level = %d\n",
917 		    rsp->VolatileFid, rsp->PersistentFid, rsp->OplockLevel);
918 
919 	ksmbd_conn_write(work);
920 
921 out:
922 	ksmbd_free_work_struct(work);
923 	ksmbd_conn_r_count_dec(conn);
924 	ksmbd_conn_put(conn);
925 }
926 
927 /**
928  * smb2_oplock_break_noti() - send smb2 exclusive/batch to level2 oplock
929  *		break command from server to client
930  * @opinfo:		oplock info object
931  *
932  * Return:      0 on success, otherwise error
933  */
smb2_oplock_break_noti(struct oplock_info * opinfo)934 static int smb2_oplock_break_noti(struct oplock_info *opinfo)
935 {
936 	struct ksmbd_conn *conn;
937 	struct oplock_break_info *br_info;
938 	int ret = 0;
939 	struct ksmbd_work *work;
940 
941 	conn = READ_ONCE(opinfo->conn);
942 	if (!conn)
943 		return ksmbd_invalidate_durable_fd(opinfo->fid);
944 
945 	work = ksmbd_alloc_work_struct();
946 	if (!work)
947 		return -ENOMEM;
948 
949 	br_info = kmalloc_obj(struct oplock_break_info, KSMBD_DEFAULT_GFP);
950 	if (!br_info) {
951 		ksmbd_free_work_struct(work);
952 		return -ENOMEM;
953 	}
954 
955 	br_info->level = opinfo->level;
956 	br_info->fid = opinfo->fid;
957 	br_info->open_trunc = opinfo->open_trunc;
958 
959 	work->request_buf = (char *)br_info;
960 	work->conn = ksmbd_conn_get(conn);
961 	work->sess = opinfo->sess;
962 
963 	ksmbd_conn_r_count_inc(conn);
964 	if (opinfo->op_state == OPLOCK_ACK_WAIT) {
965 		INIT_WORK(&work->work, __smb2_oplock_break_noti);
966 		ksmbd_queue_work(work);
967 
968 		if (wait_for_break_ack(opinfo))
969 			ret = ksmbd_invalidate_durable_fd(opinfo->fid);
970 	} else {
971 		__smb2_oplock_break_noti(&work->work);
972 		if (opinfo->level == SMB2_OPLOCK_LEVEL_II)
973 			opinfo->level = SMB2_OPLOCK_LEVEL_NONE;
974 	}
975 	return ret;
976 }
977 
978 /**
979  * __smb2_lease_break_noti() - send lease break command from server
980  * to client
981  * @wk:     smb work object
982  */
__smb2_lease_break_noti(struct work_struct * wk)983 static void __smb2_lease_break_noti(struct work_struct *wk)
984 {
985 	struct smb2_lease_break *rsp = NULL;
986 	struct ksmbd_work *work = container_of(wk, struct ksmbd_work, work);
987 	struct ksmbd_conn *conn = work->conn;
988 	struct lease_break_info *br_info = work->request_buf;
989 	struct smb2_hdr *rsp_hdr;
990 
991 	if (allocate_interim_rsp_buf(work)) {
992 		ksmbd_debug(OPLOCK, "smb2_allocate_rsp_buf failed! ");
993 		goto out;
994 	}
995 
996 	rsp_hdr = smb_get_msg(work->response_buf);
997 	memset(rsp_hdr, 0, sizeof(struct smb2_hdr) + 2);
998 	rsp_hdr->ProtocolId = SMB2_PROTO_NUMBER;
999 	rsp_hdr->StructureSize = SMB2_HEADER_STRUCTURE_SIZE;
1000 	rsp_hdr->CreditRequest = cpu_to_le16(0);
1001 	rsp_hdr->Command = SMB2_OPLOCK_BREAK;
1002 	rsp_hdr->Flags = (SMB2_FLAGS_SERVER_TO_REDIR);
1003 	rsp_hdr->NextCommand = 0;
1004 	rsp_hdr->MessageId = cpu_to_le64(-1);
1005 	rsp_hdr->Id.SyncId.ProcessId = 0;
1006 	rsp_hdr->Id.SyncId.TreeId = 0;
1007 	rsp_hdr->SessionId = 0;
1008 	memset(rsp_hdr->Signature, 0, 16);
1009 
1010 	rsp = smb_get_msg(work->response_buf);
1011 	rsp->StructureSize = cpu_to_le16(44);
1012 	rsp->Epoch = br_info->epoch;
1013 	rsp->Flags = 0;
1014 
1015 	if (br_info->curr_state & (SMB2_LEASE_WRITE_CACHING_LE |
1016 			SMB2_LEASE_HANDLE_CACHING_LE))
1017 		rsp->Flags = SMB2_NOTIFY_BREAK_LEASE_FLAG_ACK_REQUIRED;
1018 
1019 	memcpy(rsp->LeaseKey, br_info->lease_key, SMB2_LEASE_KEY_SIZE);
1020 	rsp->CurrentLeaseState = br_info->curr_state;
1021 	rsp->NewLeaseState = br_info->new_state;
1022 	rsp->BreakReason = 0;
1023 	rsp->AccessMaskHint = 0;
1024 	rsp->ShareMaskHint = 0;
1025 
1026 	if (ksmbd_iov_pin_rsp(work, (void *)rsp,
1027 			      sizeof(struct smb2_lease_break)))
1028 		goto out;
1029 
1030 	ksmbd_conn_write(work);
1031 
1032 out:
1033 	ksmbd_free_work_struct(work);
1034 	ksmbd_conn_r_count_dec(conn);
1035 	ksmbd_conn_put(conn);
1036 }
1037 
1038 /*
1039  * Select and pin the connection used for a lease break before doing any
1040  * allocations which may sleep. opinfo->conn is cleared under ci->m_lock,
1041  * while lease->l_lb and the lease table lifetime are protected by
1042  * lease_list_lock.
1043  */
smb2_lease_break_conn_get(struct oplock_info * opinfo)1044 static struct ksmbd_conn *smb2_lease_break_conn_get(struct oplock_info *opinfo)
1045 {
1046 	struct lease *lease = opinfo->o_lease;
1047 	struct lease_table *lb;
1048 	struct ksmbd_conn *conn;
1049 
1050 	/* Keep the connection which owns the open, when it is still active. */
1051 	down_read(&lease->ci->m_lock);
1052 	conn = READ_ONCE(opinfo->conn);
1053 	if (conn && !ksmbd_conn_releasing(conn))
1054 		conn = ksmbd_conn_get(conn);
1055 	else
1056 		conn = NULL;
1057 	up_read(&lease->ci->m_lock);
1058 
1059 	if (conn || lease->version != 2)
1060 		return conn;
1061 
1062 	/* Otherwise route v2 lease breaks through the shared lease channel. */
1063 	read_lock(&lease_list_lock);
1064 	lb = lease->l_lb;
1065 	if (lb && lb->conn && !ksmbd_conn_releasing(lb->conn))
1066 		conn = ksmbd_conn_get(lb->conn);
1067 	read_unlock(&lease_list_lock);
1068 
1069 	return conn;
1070 }
1071 
1072 /**
1073  * smb2_lease_break_noti() - break lease when a new client request
1074  *			write lease
1075  * @opinfo:		contains lease state information
1076  * @sync:		send the lease break notification synchronously
1077  * @inc_epoch:		increment the lease epoch before sending the break
1078  *
1079  * Return:	0 on success, otherwise error
1080  */
smb2_lease_break_noti(struct oplock_info * opinfo,bool sync,bool inc_epoch)1081 static int smb2_lease_break_noti(struct oplock_info *opinfo, bool sync,
1082 				 bool inc_epoch)
1083 {
1084 	struct ksmbd_conn *conn;
1085 	struct ksmbd_work *work;
1086 	struct lease_break_info *br_info;
1087 	struct lease *lease = opinfo->o_lease;
1088 
1089 	conn = smb2_lease_break_conn_get(opinfo);
1090 	if (!conn)
1091 		return ksmbd_invalidate_durable_fd(opinfo->fid);
1092 
1093 	work = ksmbd_alloc_work_struct();
1094 	if (!work) {
1095 		ksmbd_conn_put(conn);
1096 		return -ENOMEM;
1097 	}
1098 
1099 	br_info = kmalloc_obj(struct lease_break_info, KSMBD_DEFAULT_GFP);
1100 	if (!br_info) {
1101 		ksmbd_free_work_struct(work);
1102 		ksmbd_conn_put(conn);
1103 		return -ENOMEM;
1104 	}
1105 
1106 	br_info->curr_state = lease->state;
1107 	br_info->new_state = lease->new_state;
1108 	if (lease->version == 2) {
1109 		if (inc_epoch)
1110 			lease->epoch++;
1111 		br_info->epoch = cpu_to_le16(lease->epoch);
1112 	} else {
1113 		br_info->epoch = 0;
1114 	}
1115 	memcpy(br_info->lease_key, lease->lease_key, SMB2_LEASE_KEY_SIZE);
1116 
1117 	work->request_buf = (char *)br_info;
1118 	/* Transfer the reference acquired by smb2_lease_break_conn_get(). */
1119 	work->conn = conn;
1120 	work->sess = opinfo->sess;
1121 
1122 	ksmbd_conn_r_count_inc(conn);
1123 	if (opinfo->op_state == OPLOCK_ACK_WAIT) {
1124 		if (sync) {
1125 			__smb2_lease_break_noti(&work->work);
1126 		} else {
1127 			INIT_WORK(&work->work, __smb2_lease_break_noti);
1128 			ksmbd_queue_work(work);
1129 		}
1130 	} else {
1131 		__smb2_lease_break_noti(&work->work);
1132 		if (opinfo->o_lease->new_state == SMB2_LEASE_NONE_LE) {
1133 			opinfo->o_lease->state = SMB2_LEASE_NONE_LE;
1134 			lease_update_oplock_levels(opinfo->o_lease);
1135 		}
1136 	}
1137 	return 0;
1138 }
1139 
wait_lease_breaking(struct oplock_info * opinfo)1140 static void wait_lease_breaking(struct oplock_info *opinfo)
1141 {
1142 	if (!opinfo->is_lease)
1143 		return;
1144 
1145 	wake_up_interruptible_all(&opinfo->oplock_brk);
1146 	if (atomic_read(&opinfo->breaking_cnt)) {
1147 		int ret = 0;
1148 
1149 		ret = wait_event_interruptible_timeout(opinfo->oplock_brk,
1150 						       atomic_read(&opinfo->breaking_cnt) == 0,
1151 						       HZ);
1152 		if (!ret)
1153 			atomic_set(&opinfo->breaking_cnt, 0);
1154 	}
1155 }
1156 
oplock_break(struct oplock_info * brk_opinfo,int req_op_level,struct ksmbd_work * in_work,bool share_break,bool sync_lease_break)1157 static int oplock_break(struct oplock_info *brk_opinfo, int req_op_level,
1158 			struct ksmbd_work *in_work, bool share_break,
1159 			bool sync_lease_break)
1160 {
1161 	int err = 0;
1162 	bool sent_interim = false;
1163 
1164 	/* Need to break exclusive/batch oplock, write lease or overwrite_if */
1165 	ksmbd_debug(OPLOCK,
1166 		    "request to send oplock(level : 0x%x) break notification\n",
1167 		    brk_opinfo->level);
1168 
1169 	if (brk_opinfo->is_lease) {
1170 		struct lease *lease = brk_opinfo->o_lease;
1171 		bool open_trunc = brk_opinfo->open_trunc;
1172 		bool was_pending = test_bit(0, &brk_opinfo->pending_break);
1173 		bool wait_ack;
1174 		bool inc_epoch = true;
1175 
1176 		if (in_work && was_pending) {
1177 			setup_async_work(in_work, NULL, NULL);
1178 			smb2_send_interim_resp(in_work, STATUS_PENDING);
1179 			release_async_work(in_work);
1180 			sent_interim = true;
1181 		}
1182 
1183 		err = oplock_break_pending(brk_opinfo, req_op_level);
1184 		if (err)
1185 			return err < 0 ? err : 0;
1186 		if (was_pending)
1187 			open_trunc = brk_opinfo->open_trunc;
1188 
1189 again:
1190 		atomic_inc(&brk_opinfo->breaking_cnt);
1191 		if (open_trunc) {
1192 			/*
1193 			 * Create overwrite break trigger the lease break to
1194 			 * none.
1195 			 */
1196 			lease->new_state = SMB2_LEASE_NONE_LE;
1197 		} else if (share_break &&
1198 			   lease->state & SMB2_LEASE_HANDLE_CACHING_LE) {
1199 			lease->new_state =
1200 				lease->state & ~SMB2_LEASE_HANDLE_CACHING_LE;
1201 		} else {
1202 			if (lease->state & SMB2_LEASE_WRITE_CACHING_LE) {
1203 				if (lease->state & SMB2_LEASE_HANDLE_CACHING_LE)
1204 					lease->new_state =
1205 						SMB2_LEASE_READ_CACHING_LE |
1206 						SMB2_LEASE_HANDLE_CACHING_LE;
1207 				else
1208 					lease->new_state =
1209 						SMB2_LEASE_READ_CACHING_LE;
1210 			} else {
1211 				if (lease->state & SMB2_LEASE_HANDLE_CACHING_LE &&
1212 						!lease->is_dir)
1213 					lease->new_state =
1214 						SMB2_LEASE_READ_CACHING_LE;
1215 				else
1216 					lease->new_state = SMB2_LEASE_NONE_LE;
1217 			}
1218 		}
1219 
1220 		if (lease->state & (SMB2_LEASE_WRITE_CACHING_LE |
1221 				SMB2_LEASE_HANDLE_CACHING_LE)) {
1222 			if (!oplock_break_set_ack_wait(brk_opinfo)) {
1223 				atomic_dec_if_positive(&brk_opinfo->breaking_cnt);
1224 				wake_up_oplock_break(brk_opinfo);
1225 				return -ENOENT;
1226 			}
1227 		} else
1228 			atomic_dec(&brk_opinfo->breaking_cnt);
1229 
1230 		wait_ack = !(open_trunc &&
1231 			     lease->state == (SMB2_LEASE_READ_CACHING_LE |
1232 					      SMB2_LEASE_HANDLE_CACHING_LE));
1233 		if (lease->reuse_epoch) {
1234 			inc_epoch = false;
1235 			lease->reuse_epoch = false;
1236 		}
1237 		err = smb2_lease_break_noti(brk_opinfo, sync_lease_break, inc_epoch);
1238 		inc_epoch = false;
1239 		if (in_work && !sent_interim) {
1240 			setup_async_work(in_work, NULL, NULL);
1241 			smb2_send_interim_resp(in_work, STATUS_PENDING);
1242 			release_async_work(in_work);
1243 			sent_interim = true;
1244 		}
1245 		if (wait_ack && !err && wait_for_break_ack(brk_opinfo))
1246 			err = ksmbd_invalidate_durable_fd(brk_opinfo->fid);
1247 
1248 		ksmbd_debug(OPLOCK, "oplock granted = %d\n", brk_opinfo->level);
1249 		if (brk_opinfo->op_state == OPLOCK_CLOSING)
1250 			err = -ENOENT;
1251 
1252 		if (wait_ack)
1253 			wait_lease_breaking(brk_opinfo);
1254 		/*
1255 		 * A share-mode conflict break only drops the conflicting
1256 		 * caching bit; the triggering open fails with a sharing
1257 		 * violation, so keep it to a single break.
1258 		 *
1259 		 * Otherwise chain another break while the lease is still
1260 		 * incompatible with this open (req_op_level), or while a
1261 		 * truncating waiter that arrived during the break still needs
1262 		 * the lease dropped to none.  open_trunc snapshotted for this
1263 		 * break stays cleared, so the next state is computed from the
1264 		 * lease state and the cascade steps down (e.g. RH->R->none)
1265 		 * instead of collapsing straight to none.
1266 		 */
1267 		if (wait_ack && !err && !share_break &&
1268 		    (lease_break_needed(brk_opinfo, req_op_level, open_trunc) ||
1269 		     (brk_opinfo->open_trunc &&
1270 		      lease->state != SMB2_LEASE_NONE_LE)))
1271 			goto again;
1272 
1273 		wake_up_oplock_break(brk_opinfo);
1274 		return err;
1275 	} else {
1276 		err = oplock_break_pending(brk_opinfo, req_op_level);
1277 		if (err)
1278 			return err < 0 ? err : 0;
1279 
1280 		if (brk_opinfo->level == SMB2_OPLOCK_LEVEL_BATCH ||
1281 		    brk_opinfo->level == SMB2_OPLOCK_LEVEL_EXCLUSIVE) {
1282 			if (!oplock_break_set_ack_wait(brk_opinfo)) {
1283 				wake_up_oplock_break(brk_opinfo);
1284 				return -ENOENT;
1285 			}
1286 		}
1287 
1288 		/*
1289 		 * Keep a conflicting CREATE asynchronous while waiting for an
1290 		 * oplock-break acknowledgement.  Besides avoiding a blocked client
1291 		 * request, this lets a replay arrive while the original CREATE is
1292 		 * still pending and be rejected with FILE_NOT_AVAILABLE.
1293 		 */
1294 		if (in_work) {
1295 			setup_async_work(in_work, NULL, NULL);
1296 			smb2_send_interim_resp(in_work, STATUS_PENDING);
1297 			release_async_work(in_work);
1298 		}
1299 	}
1300 
1301 	err = smb2_oplock_break_noti(brk_opinfo);
1302 
1303 	ksmbd_debug(OPLOCK, "oplock granted = %d\n", brk_opinfo->level);
1304 	if (brk_opinfo->op_state == OPLOCK_CLOSING)
1305 		err = -EAGAIN;
1306 	wake_up_oplock_break(brk_opinfo);
1307 
1308 	return err;
1309 }
1310 
1311 struct oplock_break_entry {
1312 	struct list_head	list;
1313 	struct oplock_info	*opinfo;
1314 };
1315 
oplock_break_add(struct list_head * head,struct oplock_info * opinfo)1316 static int oplock_break_add(struct list_head *head, struct oplock_info *opinfo)
1317 {
1318 	struct oplock_break_entry *ent;
1319 
1320 	ent = kmalloc_obj(struct oplock_break_entry, KSMBD_DEFAULT_GFP);
1321 	if (!ent)
1322 		return -ENOMEM;
1323 
1324 	ent->opinfo = opinfo;
1325 	list_add_tail(&ent->list, head);
1326 	return 0;
1327 }
1328 
oplock_break_drain_none(struct list_head * head)1329 static void oplock_break_drain_none(struct list_head *head)
1330 {
1331 	struct oplock_break_entry *ent, *tmp;
1332 
1333 	list_for_each_entry_safe(ent, tmp, head, list) {
1334 		oplock_break(ent->opinfo, SMB2_OPLOCK_LEVEL_NONE, NULL, false,
1335 			     false);
1336 		list_del(&ent->list);
1337 		opinfo_put(ent->opinfo);
1338 		kfree(ent);
1339 	}
1340 }
1341 
destroy_lease_table(struct ksmbd_conn * conn)1342 void destroy_lease_table(struct ksmbd_conn *conn)
1343 {
1344 	struct lease_table *lb, *lbtmp;
1345 	struct lease *lease, *ltmp;
1346 
1347 	write_lock(&lease_list_lock);
1348 	if (list_empty(&lease_table_list)) {
1349 		write_unlock(&lease_list_lock);
1350 		return;
1351 	}
1352 
1353 	list_for_each_entry_safe(lb, lbtmp, &lease_table_list, l_entry) {
1354 		if (conn && memcmp(lb->client_guid, conn->ClientGUID,
1355 				   SMB2_CLIENT_GUID_SIZE))
1356 			continue;
1357 		list_for_each_entry_safe(lease, ltmp, &lb->lease_list, l_entry)
1358 			lease_del_table(lease);
1359 		list_del(&lb->l_entry);
1360 		free_lease_table(lb);
1361 	}
1362 	write_unlock(&lease_list_lock);
1363 }
1364 
find_same_lease_key(struct ksmbd_conn * conn,struct ksmbd_inode * ci,struct lease_ctx_info * lctx)1365 int find_same_lease_key(struct ksmbd_conn *conn, struct ksmbd_inode *ci,
1366 			struct lease_ctx_info *lctx)
1367 {
1368 	struct lease *lease;
1369 	int err = 0;
1370 	struct lease_table *lb;
1371 
1372 	if (!lctx)
1373 		return err;
1374 
1375 	read_lock(&lease_list_lock);
1376 	if (list_empty(&lease_table_list)) {
1377 		read_unlock(&lease_list_lock);
1378 		return 0;
1379 	}
1380 
1381 	list_for_each_entry(lb, &lease_table_list, l_entry) {
1382 		if (!memcmp(lb->client_guid, conn->ClientGUID,
1383 			    SMB2_CLIENT_GUID_SIZE))
1384 			goto found;
1385 	}
1386 	read_unlock(&lease_list_lock);
1387 
1388 	return 0;
1389 
1390 found:
1391 	list_for_each_entry(lease, &lb->lease_list, l_entry) {
1392 		if (lease->ci == ci)
1393 			continue;
1394 		if (!memcmp(lease->lease_key, lctx->lease_key,
1395 			    SMB2_LEASE_KEY_SIZE)) {
1396 			err = -EINVAL;
1397 			ksmbd_debug(OPLOCK,
1398 				    "found same lease key is already used in other files\n");
1399 			goto out;
1400 		}
1401 	}
1402 
1403 out:
1404 	read_unlock(&lease_list_lock);
1405 	return err;
1406 }
1407 
add_lease_global_list(struct lease * lease,struct ksmbd_conn * conn,struct lease_table * new_lb)1408 static void add_lease_global_list(struct lease *lease, struct ksmbd_conn *conn,
1409 				  struct lease_table *new_lb)
1410 {
1411 	struct lease_table *lb;
1412 
1413 	write_lock(&lease_list_lock);
1414 	list_for_each_entry(lb, &lease_table_list, l_entry) {
1415 		if (!memcmp(lb->client_guid, conn->ClientGUID,
1416 			    SMB2_CLIENT_GUID_SIZE)) {
1417 			lease_add_table(lease, lb);
1418 			write_unlock(&lease_list_lock);
1419 			free_lease_table(new_lb);
1420 			return;
1421 		}
1422 	}
1423 
1424 	lease_add_table(lease, new_lb);
1425 	list_add(&new_lb->l_entry, &lease_table_list);
1426 	write_unlock(&lease_list_lock);
1427 }
1428 
set_oplock_level(struct oplock_info * opinfo,int level,struct lease_ctx_info * lctx)1429 static void set_oplock_level(struct oplock_info *opinfo, int level,
1430 			     struct lease_ctx_info *lctx)
1431 {
1432 	switch (level) {
1433 	case SMB2_OPLOCK_LEVEL_BATCH:
1434 	case SMB2_OPLOCK_LEVEL_EXCLUSIVE:
1435 		grant_write_oplock(opinfo, level, lctx);
1436 		break;
1437 	case SMB2_OPLOCK_LEVEL_II:
1438 		grant_read_oplock(opinfo, lctx);
1439 		break;
1440 	default:
1441 		grant_none_oplock(opinfo, lctx);
1442 		break;
1443 	}
1444 }
1445 
smb_send_parent_lease_break_noti(struct ksmbd_file * fp,struct lease_ctx_info * lctx)1446 void smb_send_parent_lease_break_noti(struct ksmbd_file *fp,
1447 				      struct lease_ctx_info *lctx)
1448 {
1449 	struct oplock_info *opinfo;
1450 	struct ksmbd_inode *p_ci = NULL;
1451 	LIST_HEAD(brk_list);
1452 
1453 	if (lctx && lctx->version != 2)
1454 		return;
1455 
1456 	p_ci = ksmbd_inode_lookup_lock(fp->filp->f_path.dentry->d_parent);
1457 	if (!p_ci)
1458 		return;
1459 
1460 	down_read(&p_ci->m_lock);
1461 	list_for_each_entry(opinfo, &p_ci->m_op_list, op_entry) {
1462 		if (opinfo->conn == NULL || !opinfo->is_lease)
1463 			continue;
1464 
1465 		if (opinfo->o_lease->state != SMB2_OPLOCK_LEVEL_NONE &&
1466 		    (!lctx ||
1467 		     (!(lctx->flags & SMB2_LEASE_FLAG_PARENT_LEASE_KEY_SET_LE) ||
1468 		      !compare_guid_key(opinfo, fp->conn->ClientGUID,
1469 			       lctx->parent_lease_key)))) {
1470 			if (!atomic_inc_not_zero(&opinfo->refcount))
1471 				continue;
1472 
1473 			if (ksmbd_conn_releasing(opinfo->conn)) {
1474 				opinfo_put(opinfo);
1475 				continue;
1476 			}
1477 
1478 			if (oplock_break_add(&brk_list, opinfo))
1479 				opinfo_put(opinfo);
1480 		}
1481 	}
1482 	up_read(&p_ci->m_lock);
1483 
1484 	oplock_break_drain_none(&brk_list);
1485 
1486 	ksmbd_inode_put(p_ci);
1487 }
1488 
smb_lazy_parent_lease_break_close(struct ksmbd_file * fp)1489 void smb_lazy_parent_lease_break_close(struct ksmbd_file *fp)
1490 {
1491 	struct oplock_info *opinfo;
1492 	struct ksmbd_inode *p_ci = NULL;
1493 	LIST_HEAD(brk_list);
1494 
1495 	rcu_read_lock();
1496 	opinfo = rcu_dereference(fp->f_opinfo);
1497 
1498 	if (!opinfo || !opinfo->is_lease || opinfo->o_lease->version != 2) {
1499 		rcu_read_unlock();
1500 		return;
1501 	}
1502 	rcu_read_unlock();
1503 
1504 	p_ci = ksmbd_inode_lookup_lock(fp->filp->f_path.dentry->d_parent);
1505 	if (!p_ci)
1506 		return;
1507 
1508 	down_read(&p_ci->m_lock);
1509 	list_for_each_entry(opinfo, &p_ci->m_op_list, op_entry) {
1510 		if (opinfo->conn == NULL || !opinfo->is_lease)
1511 			continue;
1512 
1513 		if (opinfo->o_lease->state != SMB2_OPLOCK_LEVEL_NONE) {
1514 			if (!atomic_inc_not_zero(&opinfo->refcount))
1515 				continue;
1516 
1517 			if (ksmbd_conn_releasing(opinfo->conn)) {
1518 				opinfo_put(opinfo);
1519 				continue;
1520 			}
1521 
1522 			if (oplock_break_add(&brk_list, opinfo))
1523 				opinfo_put(opinfo);
1524 		}
1525 	}
1526 	up_read(&p_ci->m_lock);
1527 
1528 	oplock_break_drain_none(&brk_list);
1529 
1530 	ksmbd_inode_put(p_ci);
1531 }
1532 
1533 /**
1534  * smb_grant_oplock() - handle oplock/lease request on file open
1535  * @work:		smb work
1536  * @req_op_level:	oplock level
1537  * @pid:		id of open file
1538  * @fp:			ksmbd file pointer
1539  * @tid:		Tree id of connection
1540  * @lctx:		lease context information on file open
1541  * @share_ret:		share mode
1542  * @replay:		whether this is a replayed CREATE request
1543  *
1544  * Return:      0 on success, otherwise error
1545  */
smb_grant_oplock(struct ksmbd_work * work,int req_op_level,u64 pid,struct ksmbd_file * fp,__u16 tid,struct lease_ctx_info * lctx,int share_ret,bool replay)1546 int smb_grant_oplock(struct ksmbd_work *work, int req_op_level, u64 pid,
1547 		     struct ksmbd_file *fp, __u16 tid,
1548 		     struct lease_ctx_info *lctx, int share_ret, bool replay)
1549 {
1550 	int err = 0;
1551 	int break_level = SMB2_OPLOCK_LEVEL_II;
1552 	struct oplock_info *opinfo = NULL, *prev_opinfo = NULL;
1553 	struct ksmbd_inode *ci = fp->f_ci;
1554 	struct lease_table *new_lb = NULL;
1555 	struct oplock_snapshot prev_op_snapshot;
1556 	bool prev_op_has_lease;
1557 	bool prev_durable_open = false;
1558 	bool prev_durable_detached = false;
1559 	unsigned long long prev_fid = KSMBD_NO_FID;
1560 	bool new_lease = false;
1561 	bool break_needed;
1562 	__le32 prev_op_state = 0;
1563 
1564 	/* Only v2 leases handle the directory */
1565 	if (S_ISDIR(file_inode(fp->filp)->i_mode)) {
1566 		if (!lctx || lctx->version != 2)
1567 			return 0;
1568 	}
1569 
1570 	opinfo = alloc_opinfo(work, pid, tid);
1571 	if (!opinfo)
1572 		return -ENOMEM;
1573 
1574 	if (lctx) {
1575 		opinfo->o_lease = alloc_lease(lctx, ci);
1576 		if (!opinfo->o_lease) {
1577 			err = -ENOMEM;
1578 			goto err_out;
1579 		}
1580 		opinfo->is_lease = 1;
1581 		new_lease = true;
1582 	}
1583 
1584 	/* ci does not have any oplock */
1585 	if (!opinfo_count(fp))
1586 		goto set_lev;
1587 
1588 	/*
1589 	 * A stat open that only requests metadata access must not break the
1590 	 * existing caching state. READ_CONTROL (reading the security
1591 	 * descriptor) does not conflict with a lease, but it does conflict
1592 	 * with an oplock, so only treat a read-control-only open as a stat
1593 	 * open when the existing holder is a lease.
1594 	 */
1595 	if (fp->cdoption != FILE_OVERWRITE_IF_LE &&
1596 	    fp->cdoption != FILE_OVERWRITE_LE &&
1597 	    fp->cdoption != FILE_SUPERSEDE_LE &&
1598 	    (fp->attrib_only ||
1599 	     (!(fp->daccess & ~(FILE_READ_ATTRIBUTES_LE |
1600 				FILE_WRITE_ATTRIBUTES_LE |
1601 				FILE_SYNCHRONIZE_LE |
1602 				FILE_READ_CONTROL_LE)) &&
1603 	      ksmbd_inode_has_lease(ci)))) {
1604 		req_op_level = SMB2_OPLOCK_LEVEL_NONE;
1605 		goto set_lev;
1606 	}
1607 
1608 	if (lctx) {
1609 		struct oplock_info *m_opinfo;
1610 
1611 		/* is lease already granted ? */
1612 		m_opinfo = same_client_has_lease(ci, work->conn->ClientGUID,
1613 						 lctx);
1614 		if (m_opinfo) {
1615 			lease_put(opinfo->o_lease);
1616 			lease_get(m_opinfo->o_lease);
1617 			opinfo->o_lease = m_opinfo->o_lease;
1618 			opinfo->level = m_opinfo->level;
1619 			new_lease = false;
1620 			opinfo_put(m_opinfo);
1621 			goto out;
1622 		}
1623 	}
1624 	prev_opinfo = opinfo_get_list(ci, fp, &prev_op_snapshot);
1625 	if (!prev_opinfo ||
1626 	    (prev_opinfo->level == SMB2_OPLOCK_LEVEL_NONE && lctx)) {
1627 		opinfo_put(prev_opinfo);
1628 		goto set_lev;
1629 	}
1630 	prev_op_has_lease = prev_opinfo->is_lease;
1631 	if (prev_op_has_lease)
1632 		prev_op_state = prev_opinfo->o_lease->state;
1633 	/*
1634 	 * A replay received while this open is waiting for an oplock or lease
1635 	 * break must not observe an intermediate level and proceed as a new
1636 	 * open. This check has to precede break_needed. an oplock may already
1637 	 * have been downgraded from Batch to II while its acknowledgement is
1638 	 * still pending.
1639 	 */
1640 	if (replay &&
1641 	    (test_bit(0, &prev_opinfo->pending_break) ||
1642 	     prev_opinfo->op_state == OPLOCK_ACK_WAIT)) {
1643 		err = -EINPROGRESS;
1644 		opinfo_put(prev_opinfo);
1645 		goto err_out;
1646 	}
1647 
1648 	if (share_ret < 0 &&
1649 	    prev_opinfo->level == SMB2_OPLOCK_LEVEL_EXCLUSIVE) {
1650 		err = share_ret;
1651 		opinfo_put(prev_opinfo);
1652 		goto err_out;
1653 	}
1654 
1655 	break_needed = prev_opinfo->level == SMB2_OPLOCK_LEVEL_BATCH ||
1656 		prev_opinfo->level == SMB2_OPLOCK_LEVEL_EXCLUSIVE ||
1657 		(share_ret < 0 && prev_op_has_lease &&
1658 		 (prev_op_state & SMB2_LEASE_HANDLE_CACHING_LE));
1659 	if (!break_needed) {
1660 		opinfo_put(prev_opinfo);
1661 		goto op_break_not_needed;
1662 	}
1663 
1664 	prev_durable_open = prev_op_snapshot.durable_open;
1665 	prev_durable_detached = prev_op_snapshot.durable_detached;
1666 	prev_fid = prev_op_snapshot.fid;
1667 
1668 	err = oplock_break(prev_opinfo, break_level, work,
1669 			   share_ret < 0 && prev_opinfo->is_lease, false);
1670 	if (prev_durable_detached || (prev_durable_open && err == -ENOENT))
1671 		ksmbd_invalidate_durable_fd(prev_fid);
1672 	opinfo_put(prev_opinfo);
1673 	if (err == -EAGAIN) {
1674 		share_ret = ksmbd_smb_check_shared_mode(fp->filp, fp);
1675 		if (share_ret < 0) {
1676 			err = share_ret;
1677 			goto err_out;
1678 		}
1679 		goto set_lev;
1680 	}
1681 	if (err == -ENOENT) {
1682 		/*
1683 		 * A pending durable CREATE can lose the previous oplock when
1684 		 * its holder closes the file. In that case grant the original
1685 		 * request its full caching state. Other opens still need the
1686 		 * normal shared-open downgrade below.
1687 		 */
1688 		if (!prev_durable_open &&
1689 		    req_op_level != SMB2_OPLOCK_LEVEL_NONE)
1690 			req_op_level = SMB2_OPLOCK_LEVEL_II;
1691 		goto set_lev;
1692 	}
1693 	/* Check all oplock was freed by close */
1694 	else if (err < 0)
1695 		goto err_out;
1696 
1697 op_break_not_needed:
1698 	if (share_ret < 0) {
1699 		err = share_ret;
1700 		goto err_out;
1701 	}
1702 
1703 	if (req_op_level != SMB2_OPLOCK_LEVEL_NONE)
1704 		req_op_level = SMB2_OPLOCK_LEVEL_II;
1705 
1706 	/* grant fixed oplock on stacked locking between lease and oplock */
1707 	if (prev_op_has_lease && !lctx)
1708 		if (prev_op_state & SMB2_LEASE_HANDLE_CACHING_LE)
1709 			req_op_level = SMB2_OPLOCK_LEVEL_NONE;
1710 
1711 	if (!prev_op_has_lease && lctx) {
1712 		req_op_level = SMB2_OPLOCK_LEVEL_II;
1713 		lctx->req_state = SMB2_LEASE_READ_CACHING_LE;
1714 	}
1715 
1716 set_lev:
1717 	set_oplock_level(opinfo, req_op_level, lctx);
1718 
1719 out:
1720 	/*
1721 	 * Keep the original publication order so concurrent opens can
1722 	 * still observe the in-flight grant via ci->m_op_list, but make
1723 	 * everything after opinfo_add() no-fail by preallocating any new
1724 	 * lease_table first.
1725 	 */
1726 	opinfo->o_fp = fp;
1727 	if (new_lease) {
1728 		new_lb = alloc_lease_table(opinfo);
1729 		if (!new_lb) {
1730 			err = -ENOMEM;
1731 			goto err_out;
1732 		}
1733 	}
1734 
1735 	opinfo_count_inc(fp);
1736 	opinfo_add(opinfo, fp);
1737 
1738 	if (new_lease)
1739 		add_lease_global_list(opinfo->o_lease, opinfo->conn, new_lb);
1740 	if (opinfo->is_lease)
1741 		lease_add_open(opinfo->o_lease, opinfo);
1742 
1743 	rcu_assign_pointer(fp->f_opinfo, opinfo);
1744 
1745 	return 0;
1746 err_out:
1747 	kfree(new_lb);
1748 	opinfo_put(opinfo);
1749 	return err;
1750 }
1751 
1752 /**
1753  * smb_break_all_write_oplock() - break batch/exclusive oplock to level2
1754  * @work:	smb work
1755  * @fp:		ksmbd file pointer
1756  * @is_trunc:	truncate on open
1757  */
smb_break_all_write_oplock(struct ksmbd_work * work,struct ksmbd_file * fp,int is_trunc)1758 static bool smb_break_all_write_oplock(struct ksmbd_work *work,
1759 				       struct ksmbd_file *fp, int is_trunc)
1760 {
1761 	struct oplock_info *brk_opinfo;
1762 	bool sent_break = false;
1763 
1764 	brk_opinfo = opinfo_get_list(fp->f_ci, NULL, NULL);
1765 	if (!brk_opinfo)
1766 		return false;
1767 	if (brk_opinfo->level != SMB2_OPLOCK_LEVEL_BATCH &&
1768 	    brk_opinfo->level != SMB2_OPLOCK_LEVEL_EXCLUSIVE) {
1769 		opinfo_put(brk_opinfo);
1770 		return false;
1771 	}
1772 
1773 	brk_opinfo->open_trunc = is_trunc;
1774 	oplock_break(brk_opinfo, SMB2_OPLOCK_LEVEL_II, work, false, false);
1775 	sent_break = true;
1776 	opinfo_put(brk_opinfo);
1777 
1778 	return sent_break;
1779 }
1780 
1781 /**
1782  * __smb_break_all_levII_oplock() - send level2 oplock or read lease break command
1783  *	from server to client
1784  * @work:		smb work
1785  * @fp:			ksmbd file pointer
1786  * @is_trunc:		truncate on open
1787  * @send_interim:	send interim response to the client
1788  * @send_oplock_break:	send oplock break notification to the client
1789  * @sync_lease_break:	send the lease break notification synchronously
1790  */
__smb_break_all_levII_oplock(struct ksmbd_work * work,struct ksmbd_file * fp,int is_trunc,bool send_interim,bool send_oplock_break,bool sync_lease_break)1791 static void __smb_break_all_levII_oplock(struct ksmbd_work *work,
1792 					 struct ksmbd_file *fp, int is_trunc,
1793 					 bool send_interim, bool send_oplock_break,
1794 					 bool sync_lease_break)
1795 {
1796 	struct oplock_info *op, *brk_op;
1797 	struct oplock_break_entry *ent, *tmp;
1798 	struct ksmbd_inode *ci;
1799 	struct ksmbd_conn *conn = work->conn;
1800 	bool sent_interim = false;
1801 	LIST_HEAD(brk_list);
1802 
1803 	if (!test_share_config_flag(work->tcon->share_conf,
1804 				    KSMBD_SHARE_FLAG_OPLOCKS))
1805 		return;
1806 
1807 	ci = fp->f_ci;
1808 	op = opinfo_get(fp);
1809 
1810 	down_read(&ci->m_lock);
1811 	list_for_each_entry(brk_op, &ci->m_op_list, op_entry) {
1812 		if (brk_op->conn == NULL)
1813 			continue;
1814 
1815 		if (!atomic_inc_not_zero(&brk_op->refcount))
1816 			continue;
1817 
1818 		if (ksmbd_conn_releasing(brk_op->conn)) {
1819 			opinfo_put(brk_op);
1820 			continue;
1821 		}
1822 
1823 		if (!brk_op->is_lease &&
1824 		    brk_op->level != SMB2_OPLOCK_LEVEL_II) {
1825 			ksmbd_debug(OPLOCK, "unexpected oplock(0x%x)\n",
1826 				    brk_op->level);
1827 			goto next;
1828 		}
1829 
1830 		/* Skip oplock being break to none */
1831 		if (brk_op->is_lease &&
1832 		    brk_op->o_lease->new_state == SMB2_LEASE_NONE_LE &&
1833 		    atomic_read(&brk_op->breaking_cnt))
1834 			goto next;
1835 
1836 		if (op && op->is_lease && brk_op->is_lease &&
1837 		    !memcmp(conn->ClientGUID, brk_op->conn->ClientGUID,
1838 			    SMB2_CLIENT_GUID_SIZE) &&
1839 		    !memcmp(op->o_lease->lease_key, brk_op->o_lease->lease_key,
1840 			    SMB2_LEASE_KEY_SIZE))
1841 			goto next;
1842 		brk_op->open_trunc = is_trunc;
1843 
1844 		/*
1845 		 * Defer the break until ci->m_lock is released: oplock_break()
1846 		 * may block waiting for the lease break acknowledgment, and the
1847 		 * close that wakes that wait needs ci->m_lock for write.
1848 		 */
1849 		if (!oplock_break_add(&brk_list, brk_op))
1850 			continue;
1851 next:
1852 		opinfo_put(brk_op);
1853 	}
1854 	up_read(&ci->m_lock);
1855 
1856 	list_for_each_entry_safe(ent, tmp, &brk_list, list) {
1857 		brk_op = ent->opinfo;
1858 
1859 		if (!brk_op->is_lease && !send_oplock_break) {
1860 			brk_op->level = SMB2_OPLOCK_LEVEL_NONE;
1861 			spin_lock(&brk_op->state_lock);
1862 			if (brk_op->op_state != OPLOCK_CLOSING)
1863 				brk_op->op_state = OPLOCK_STATE_NONE;
1864 			spin_unlock(&brk_op->state_lock);
1865 		} else {
1866 			oplock_break(brk_op,
1867 				     brk_op->is_lease && !is_trunc ?
1868 				     SMB2_OPLOCK_LEVEL_II : SMB2_OPLOCK_LEVEL_NONE,
1869 				     send_interim && !sent_interim ? work : NULL,
1870 				     false, sync_lease_break);
1871 		}
1872 		sent_interim = true;
1873 		list_del(&ent->list);
1874 		opinfo_put(brk_op);
1875 		kfree(ent);
1876 	}
1877 
1878 	if (op)
1879 		opinfo_put(op);
1880 }
1881 
smb_break_all_levII_oplock(struct ksmbd_work * work,struct ksmbd_file * fp,int is_trunc)1882 void smb_break_all_levII_oplock(struct ksmbd_work *work, struct ksmbd_file *fp,
1883 				int is_trunc)
1884 {
1885 	__smb_break_all_levII_oplock(work, fp, is_trunc, true, true, false);
1886 }
1887 
smb_break_all_levII_oplock_rename(struct ksmbd_work * work,struct ksmbd_file * fp)1888 void smb_break_all_levII_oplock_rename(struct ksmbd_work *work, struct ksmbd_file *fp)
1889 {
1890 	__smb_break_all_levII_oplock(work, fp, 0, true, true, true);
1891 }
1892 
smb_break_all_levII_oplock_no_interim(struct ksmbd_work * work,struct ksmbd_file * fp,int is_trunc)1893 void smb_break_all_levII_oplock_no_interim(struct ksmbd_work *work,
1894 					   struct ksmbd_file *fp, int is_trunc)
1895 {
1896 	__smb_break_all_levII_oplock(work, fp, is_trunc, false, true, false);
1897 }
1898 
smb_break_all_levII_oplock_for_delete(struct ksmbd_work * work,struct ksmbd_file * fp)1899 void smb_break_all_levII_oplock_for_delete(struct ksmbd_work *work,
1900 					   struct ksmbd_file *fp)
1901 {
1902 	__smb_break_all_levII_oplock(work, fp, 0, false, false, false);
1903 }
1904 
1905 /**
1906  * smb_break_all_oplock() - break both batch/exclusive and level2 oplock
1907  * @work:	smb work
1908  * @fp:		ksmbd file pointer
1909  */
smb_break_all_oplock(struct ksmbd_work * work,struct ksmbd_file * fp)1910 void smb_break_all_oplock(struct ksmbd_work *work, struct ksmbd_file *fp)
1911 {
1912 	bool sent_break;
1913 
1914 	if (!test_share_config_flag(work->tcon->share_conf,
1915 				    KSMBD_SHARE_FLAG_OPLOCKS))
1916 		return;
1917 
1918 	sent_break = smb_break_all_write_oplock(work, fp, 1);
1919 	__smb_break_all_levII_oplock(work, fp, 1, !sent_break, true, false);
1920 }
1921 
1922 /**
1923  * smb2_map_lease_to_oplock() - map lease state to corresponding oplock type
1924  * @lease_state:     lease type
1925  *
1926  * Return:      0 if no mapping, otherwise corresponding oplock type
1927  */
smb2_map_lease_to_oplock(__le32 lease_state)1928 __u8 smb2_map_lease_to_oplock(__le32 lease_state)
1929 {
1930 	if ((lease_state & SMB2_LEASE_WRITE_CACHING_LE) &&
1931 	    (lease_state & SMB2_LEASE_HANDLE_CACHING_LE)) {
1932 		return SMB2_OPLOCK_LEVEL_BATCH;
1933 	} else if (lease_state & SMB2_LEASE_WRITE_CACHING_LE) {
1934 		return SMB2_OPLOCK_LEVEL_EXCLUSIVE;
1935 	} else if (lease_state & (SMB2_LEASE_READ_CACHING_LE |
1936 				  SMB2_LEASE_HANDLE_CACHING_LE)) {
1937 		return SMB2_OPLOCK_LEVEL_II;
1938 	}
1939 	return 0;
1940 }
1941 
1942 /**
1943  * create_lease_buf() - create lease context for open cmd response
1944  * @rbuf:	buffer to create lease context response
1945  * @lease:	buffer to stored parsed lease state information
1946  */
create_lease_buf(u8 * rbuf,struct lease * lease)1947 void create_lease_buf(u8 *rbuf, struct lease *lease)
1948 {
1949 	if (lease->version == 2) {
1950 		struct create_lease_v2 *buf = (struct create_lease_v2 *)rbuf;
1951 		__le32 flags = 0;
1952 
1953 		memset(buf, 0, sizeof(struct create_lease_v2));
1954 		memcpy(buf->lcontext.LeaseKey, lease->lease_key,
1955 		       SMB2_LEASE_KEY_SIZE);
1956 		if (lease_has_parent_key(lease))
1957 			flags |= SMB2_LEASE_FLAG_PARENT_LEASE_KEY_SET_LE;
1958 		if (lease_break_in_progress(lease))
1959 			flags |= SMB2_LEASE_FLAG_BREAK_IN_PROGRESS_LE;
1960 		buf->lcontext.LeaseFlags = flags;
1961 		buf->lcontext.Epoch = cpu_to_le16(lease->epoch);
1962 		buf->lcontext.LeaseState = lease->state;
1963 		if (lease_has_parent_key(lease))
1964 			memcpy(buf->lcontext.ParentLeaseKey, lease->parent_lease_key,
1965 			       SMB2_LEASE_KEY_SIZE);
1966 		buf->ccontext.DataOffset = cpu_to_le16(offsetof
1967 				(struct create_lease_v2, lcontext));
1968 		buf->ccontext.DataLength = cpu_to_le32(sizeof(struct lease_context_v2));
1969 		buf->ccontext.NameOffset = cpu_to_le16(offsetof
1970 				(struct create_lease_v2, Name));
1971 		buf->ccontext.NameLength = cpu_to_le16(4);
1972 		buf->Name[0] = 'R';
1973 		buf->Name[1] = 'q';
1974 		buf->Name[2] = 'L';
1975 		buf->Name[3] = 's';
1976 	} else {
1977 		struct create_lease *buf = (struct create_lease *)rbuf;
1978 
1979 		memset(buf, 0, sizeof(struct create_lease));
1980 		memcpy(buf->lcontext.LeaseKey, lease->lease_key, SMB2_LEASE_KEY_SIZE);
1981 		if (lease_break_in_progress(lease))
1982 			buf->lcontext.LeaseFlags =
1983 				SMB2_LEASE_FLAG_BREAK_IN_PROGRESS_LE;
1984 		buf->lcontext.LeaseState = lease->state;
1985 		buf->ccontext.DataOffset = cpu_to_le16(offsetof
1986 				(struct create_lease, lcontext));
1987 		buf->ccontext.DataLength = cpu_to_le32(sizeof(struct lease_context));
1988 		buf->ccontext.NameOffset = cpu_to_le16(offsetof
1989 				(struct create_lease, Name));
1990 		buf->ccontext.NameLength = cpu_to_le16(4);
1991 		buf->Name[0] = 'R';
1992 		buf->Name[1] = 'q';
1993 		buf->Name[2] = 'L';
1994 		buf->Name[3] = 's';
1995 	}
1996 }
1997 
1998 /**
1999  * parse_lease_state() - parse lease context contained in file open request
2000  * @open_req:	buffer containing smb2 file open(create) request
2001  *
2002  * Return: allocated lease context object on success, otherwise NULL
2003  */
parse_lease_state(void * open_req)2004 struct lease_ctx_info *parse_lease_state(void *open_req)
2005 {
2006 	struct create_context *cc;
2007 	struct smb2_create_req *req = (struct smb2_create_req *)open_req;
2008 	struct lease_ctx_info *lreq;
2009 
2010 	cc = smb2_find_context_vals(req, SMB2_CREATE_REQUEST_LEASE, 4);
2011 	if (IS_ERR(cc))
2012 		return ERR_CAST(cc);
2013 	if (!cc)
2014 		return NULL;
2015 
2016 	lreq = kzalloc_obj(struct lease_ctx_info, KSMBD_DEFAULT_GFP);
2017 	if (!lreq)
2018 		return ERR_PTR(-ENOMEM);
2019 
2020 	if (sizeof(struct lease_context_v2) == le32_to_cpu(cc->DataLength)) {
2021 		struct create_lease_v2 *lc = (struct create_lease_v2 *)cc;
2022 
2023 		if (le16_to_cpu(cc->DataOffset) + le32_to_cpu(cc->DataLength) <
2024 		    sizeof(struct create_lease_v2) - 4)
2025 			goto err_out;
2026 
2027 		memcpy(lreq->lease_key, lc->lcontext.LeaseKey, SMB2_LEASE_KEY_SIZE);
2028 		lreq->req_state = lc->lcontext.LeaseState;
2029 		lreq->flags = lc->lcontext.LeaseFlags;
2030 		lreq->epoch = lc->lcontext.Epoch;
2031 		lreq->duration = lc->lcontext.LeaseDuration;
2032 		if (!lease_state_valid(lreq->req_state) ||
2033 		    !lease_v2_flags_valid(lreq->flags))
2034 			goto err_out;
2035 		lreq->req_state = lease_state_grantable(lreq->req_state);
2036 		if (lreq->flags == SMB2_LEASE_FLAG_PARENT_LEASE_KEY_SET_LE)
2037 			memcpy(lreq->parent_lease_key, lc->lcontext.ParentLeaseKey,
2038 			       SMB2_LEASE_KEY_SIZE);
2039 		lreq->version = 2;
2040 	} else if (sizeof(struct lease_context) == le32_to_cpu(cc->DataLength)) {
2041 		struct create_lease *lc = (struct create_lease *)cc;
2042 
2043 		if (le16_to_cpu(cc->DataOffset) + le32_to_cpu(cc->DataLength) <
2044 		    sizeof(struct create_lease))
2045 			goto err_out;
2046 
2047 		memcpy(lreq->lease_key, lc->lcontext.LeaseKey, SMB2_LEASE_KEY_SIZE);
2048 		lreq->req_state = lc->lcontext.LeaseState;
2049 		lreq->flags = 0;
2050 		lreq->duration = lc->lcontext.LeaseDuration;
2051 		if (!lease_state_valid(lreq->req_state))
2052 			goto err_out;
2053 		lreq->req_state = lease_state_grantable(lreq->req_state);
2054 		lreq->version = 1;
2055 	} else
2056 		goto err_out;
2057 	return lreq;
2058 err_out:
2059 	kfree(lreq);
2060 	return ERR_PTR(-EINVAL);
2061 }
2062 
2063 /**
2064  * smb2_find_context_vals() - find a particular context info in open request
2065  * @open_req:	buffer containing smb2 file open(create) request
2066  * @tag:	context name to search for
2067  * @tag_len:	the length of tag
2068  *
2069  * Return:	pointer to requested context, NULL if @str context not found
2070  *		or error pointer if name length is invalid.
2071  */
smb2_find_context_vals(void * open_req,const char * tag,int tag_len)2072 struct create_context *smb2_find_context_vals(void *open_req, const char *tag, int tag_len)
2073 {
2074 	struct create_context *cc;
2075 	unsigned int next = 0;
2076 	char *name;
2077 	struct smb2_create_req *req = (struct smb2_create_req *)open_req;
2078 	unsigned int remain_len, name_off, name_len, value_off, value_len,
2079 		     cc_len;
2080 
2081 	/*
2082 	 * CreateContextsOffset and CreateContextsLength are guaranteed to
2083 	 * be valid because of ksmbd_smb2_check_message().
2084 	 */
2085 	if (!req->CreateContextsOffset || !req->CreateContextsLength)
2086 		return NULL;
2087 
2088 	cc = (struct create_context *)((char *)req +
2089 				       le32_to_cpu(req->CreateContextsOffset));
2090 	remain_len = le32_to_cpu(req->CreateContextsLength);
2091 	do {
2092 		cc = (struct create_context *)((char *)cc + next);
2093 		if (remain_len < offsetof(struct create_context, Buffer))
2094 			return ERR_PTR(-EINVAL);
2095 
2096 		next = le32_to_cpu(cc->Next);
2097 		name_off = le16_to_cpu(cc->NameOffset);
2098 		name_len = le16_to_cpu(cc->NameLength);
2099 		value_off = le16_to_cpu(cc->DataOffset);
2100 		value_len = le32_to_cpu(cc->DataLength);
2101 		cc_len = next ? next : remain_len;
2102 
2103 		if ((next & 0x7) != 0 ||
2104 		    next > remain_len ||
2105 		    name_off != offsetof(struct create_context, Buffer) ||
2106 		    name_len < 4 ||
2107 		    name_off + name_len > cc_len ||
2108 		    (value_off & 0x7) != 0 ||
2109 		    (value_len && value_off < name_off + (name_len < 8 ? 8 : name_len)) ||
2110 		    ((u64)value_off + value_len > cc_len))
2111 			return ERR_PTR(-EINVAL);
2112 
2113 		name = (char *)cc + name_off;
2114 		if (name_len == tag_len && !memcmp(name, tag, name_len))
2115 			return cc;
2116 
2117 		remain_len -= next;
2118 	} while (next != 0);
2119 
2120 	return NULL;
2121 }
2122 
2123 /**
2124  * create_durable_rsp_buf() - create durable handle context
2125  * @cc:	buffer to create durable context response
2126  */
create_durable_rsp_buf(char * cc)2127 void create_durable_rsp_buf(char *cc)
2128 {
2129 	struct create_durable_rsp *buf;
2130 
2131 	buf = (struct create_durable_rsp *)cc;
2132 	memset(buf, 0, sizeof(struct create_durable_rsp));
2133 	buf->ccontext.DataOffset = cpu_to_le16(offsetof
2134 			(struct create_durable_rsp, Data));
2135 	buf->ccontext.DataLength = cpu_to_le32(8);
2136 	buf->ccontext.NameOffset = cpu_to_le16(offsetof
2137 			(struct create_durable_rsp, Name));
2138 	buf->ccontext.NameLength = cpu_to_le16(4);
2139 	/* SMB2_CREATE_DURABLE_HANDLE_RESPONSE is "DHnQ" */
2140 	buf->Name[0] = 'D';
2141 	buf->Name[1] = 'H';
2142 	buf->Name[2] = 'n';
2143 	buf->Name[3] = 'Q';
2144 }
2145 
2146 /**
2147  * create_durable_v2_rsp_buf() - create durable handle v2 context
2148  * @cc:	buffer to create durable context response
2149  * @fp: ksmbd file pointer
2150  */
create_durable_v2_rsp_buf(char * cc,struct ksmbd_file * fp)2151 void create_durable_v2_rsp_buf(char *cc, struct ksmbd_file *fp)
2152 {
2153 	struct create_durable_rsp_v2 *buf;
2154 
2155 	buf = (struct create_durable_rsp_v2 *)cc;
2156 	memset(buf, 0, sizeof(*buf));
2157 	buf->ccontext.DataOffset = cpu_to_le16(offsetof
2158 			(struct create_durable_rsp_v2, dcontext));
2159 	buf->ccontext.DataLength = cpu_to_le32(8);
2160 	buf->ccontext.NameOffset = cpu_to_le16(offsetof
2161 			(struct create_durable_rsp_v2, Name));
2162 	buf->ccontext.NameLength = cpu_to_le16(4);
2163 	/* SMB2_CREATE_DURABLE_HANDLE_RESPONSE_V2 is "DH2Q" */
2164 	buf->Name[0] = 'D';
2165 	buf->Name[1] = 'H';
2166 	buf->Name[2] = '2';
2167 	buf->Name[3] = 'Q';
2168 
2169 	buf->dcontext.Timeout = cpu_to_le32(fp->durable_timeout);
2170 	if (fp->is_persistent)
2171 		buf->dcontext.Flags = cpu_to_le32(SMB2_DHANDLE_FLAG_PERSISTENT);
2172 }
2173 
2174 /**
2175  * create_mxac_rsp_buf() - create query maximal access context
2176  * @cc:			buffer to create maximal access context response
2177  * @maximal_access:	maximal access
2178  */
create_mxac_rsp_buf(char * cc,int maximal_access)2179 void create_mxac_rsp_buf(char *cc, int maximal_access)
2180 {
2181 	struct create_mxac_rsp *buf;
2182 
2183 	buf = (struct create_mxac_rsp *)cc;
2184 	memset(buf, 0, sizeof(struct create_mxac_rsp));
2185 	buf->ccontext.DataOffset = cpu_to_le16(offsetof
2186 			(struct create_mxac_rsp, QueryStatus));
2187 	buf->ccontext.DataLength = cpu_to_le32(8);
2188 	buf->ccontext.NameOffset = cpu_to_le16(offsetof
2189 			(struct create_mxac_rsp, Name));
2190 	buf->ccontext.NameLength = cpu_to_le16(4);
2191 	/* SMB2_CREATE_QUERY_MAXIMAL_ACCESS_RESPONSE is "MxAc" */
2192 	buf->Name[0] = 'M';
2193 	buf->Name[1] = 'x';
2194 	buf->Name[2] = 'A';
2195 	buf->Name[3] = 'c';
2196 
2197 	buf->QueryStatus = STATUS_SUCCESS;
2198 	buf->MaximalAccess = cpu_to_le32(maximal_access);
2199 }
2200 
create_disk_id_rsp_buf(char * cc,__u64 file_id,__u64 vol_id)2201 void create_disk_id_rsp_buf(char *cc, __u64 file_id, __u64 vol_id)
2202 {
2203 	struct create_disk_id_rsp *buf;
2204 
2205 	buf = (struct create_disk_id_rsp *)cc;
2206 	memset(buf, 0, sizeof(struct create_disk_id_rsp));
2207 	buf->ccontext.DataOffset = cpu_to_le16(offsetof
2208 			(struct create_disk_id_rsp, DiskFileId));
2209 	buf->ccontext.DataLength = cpu_to_le32(32);
2210 	buf->ccontext.NameOffset = cpu_to_le16(offsetof
2211 			(struct create_mxac_rsp, Name));
2212 	buf->ccontext.NameLength = cpu_to_le16(4);
2213 	/* SMB2_CREATE_QUERY_ON_DISK_ID_RESPONSE is "QFid" */
2214 	buf->Name[0] = 'Q';
2215 	buf->Name[1] = 'F';
2216 	buf->Name[2] = 'i';
2217 	buf->Name[3] = 'd';
2218 
2219 	buf->DiskFileId = cpu_to_le64(file_id);
2220 	buf->VolumeId = cpu_to_le64(vol_id);
2221 }
2222 
2223 /**
2224  * create_posix_rsp_buf() - create posix extension context
2225  * @cc:	buffer to create posix on posix response
2226  * @fp: ksmbd file pointer
2227  */
create_posix_rsp_buf(char * cc,struct ksmbd_file * fp)2228 void create_posix_rsp_buf(char *cc, struct ksmbd_file *fp)
2229 {
2230 	struct create_posix_rsp *buf;
2231 	struct inode *inode = file_inode(fp->filp);
2232 	struct mnt_idmap *idmap = file_mnt_idmap(fp->filp);
2233 	vfsuid_t vfsuid = i_uid_into_vfsuid(idmap, inode);
2234 	vfsgid_t vfsgid = i_gid_into_vfsgid(idmap, inode);
2235 
2236 	buf = (struct create_posix_rsp *)cc;
2237 	memset(buf, 0, sizeof(struct create_posix_rsp));
2238 	buf->ccontext.DataOffset = cpu_to_le16(offsetof
2239 			(struct create_posix_rsp, nlink));
2240 	/*
2241 	 * DataLength = nlink(4) + reparse_tag(4) + mode(4) +
2242 	 * domain sid(28) + unix group sid(16).
2243 	 */
2244 	buf->ccontext.DataLength = cpu_to_le32(56);
2245 	buf->ccontext.NameOffset = cpu_to_le16(offsetof
2246 			(struct create_posix_rsp, Name));
2247 	buf->ccontext.NameLength = cpu_to_le16(POSIX_CTXT_DATA_LEN);
2248 	/* SMB2_CREATE_TAG_POSIX is "0x93AD25509CB411E7B42383DE968BCD7C" */
2249 	buf->Name[0] = 0x93;
2250 	buf->Name[1] = 0xAD;
2251 	buf->Name[2] = 0x25;
2252 	buf->Name[3] = 0x50;
2253 	buf->Name[4] = 0x9C;
2254 	buf->Name[5] = 0xB4;
2255 	buf->Name[6] = 0x11;
2256 	buf->Name[7] = 0xE7;
2257 	buf->Name[8] = 0xB4;
2258 	buf->Name[9] = 0x23;
2259 	buf->Name[10] = 0x83;
2260 	buf->Name[11] = 0xDE;
2261 	buf->Name[12] = 0x96;
2262 	buf->Name[13] = 0x8B;
2263 	buf->Name[14] = 0xCD;
2264 	buf->Name[15] = 0x7C;
2265 
2266 	buf->nlink = cpu_to_le32(inode->i_nlink);
2267 	buf->reparse_tag = cpu_to_le32(fp->volatile_id);
2268 	buf->mode = cpu_to_le32(inode->i_mode & 0777);
2269 	/*
2270 	 * SidBuffer(44) contain two sids(Domain sid(28), UNIX group sid(16)).
2271 	 * Domain sid(28) = revision(1) + num_subauth(1) + authority(6) +
2272 	 *		    sub_auth(4 * 4(num_subauth)) + RID(4).
2273 	 * UNIX group id(16) = revision(1) + num_subauth(1) + authority(6) +
2274 	 *		       sub_auth(4 * 1(num_subauth)) + RID(4).
2275 	 */
2276 	id_to_sid(from_kuid_munged(&init_user_ns, vfsuid_into_kuid(vfsuid)),
2277 		  SIDOWNER, (struct smb_sid *)&buf->SidBuffer[0]);
2278 	id_to_sid(from_kgid_munged(&init_user_ns, vfsgid_into_kgid(vfsgid)),
2279 		  SIDUNIX_GROUP, (struct smb_sid *)&buf->SidBuffer[28]);
2280 }
2281 
2282 /**
2283  * create_aapl_rsp_buf() - build AAPL kAAPL_SERVER_QUERY response
2284  * @cc:         buffer to write the create context into (AAPL_RSP_MAX_SIZE bytes)
2285  * @vol_caps:   volume capability flags (SMB2_CRTCTX_AAPL_* volume bits)
2286  * @req_bitmap: the client's request bitmap, echoed back in reply_bitmap
2287  *
2288  * Response format follows the layout observed from macOS's own smbd, and
2289  * matches the client-side parsing in AAPL's published public client kernel
2290  * source (public client behavior reference, kAAPL_SERVER_QUERY
2291  * case): reply_bitmap, then server_caps/vol_caps/model-info fields present
2292  * only when their reply_bitmap bit is set:
2293  *   reply_bitmap = req_bitmap masked to the fields we support
2294  *   server_caps  = AAPL_SERVER_CAPS_KSMBD when requested
2295  *   vol_caps     = caller-supplied
2296  *   model string = server_conf.aapl_model (default "Xserve") in UTF-16LE,
2297  *                  when SMB2_CRTCTX_AAPL_MODEL_INFO requested
2298  *
2299  * Sending reply_bitmap with MODEL_INFO set but no model string causes
2300  * smbfs.kext to enter a broken disconnect path requiring a macOS reboot.
2301  * @readdir_attr_v2: advertise SMB2_CRTCTX_AAPL_SUPPORTS_READ_DIR_ATTR_V2
2302  *                    instead of the V1 bit
2303  */
create_aapl_rsp_buf(char * cc,__u64 vol_caps,__u64 req_bitmap,bool readdir_attr_v2)2304 void create_aapl_rsp_buf(char *cc, __u64 vol_caps, __u64 req_bitmap,
2305 			 bool readdir_attr_v2)
2306 {
2307 	struct create_aapl_rsp *buf;
2308 	u64 reply_bitmap;
2309 	u64 server_caps;
2310 	u32 data_len;
2311 
2312 	buf = (struct create_aapl_rsp *)cc;
2313 	memset(buf, 0, AAPL_RSP_MAX_SIZE);
2314 
2315 	reply_bitmap = req_bitmap & (SMB2_CRTCTX_AAPL_SERVER_CAPS |
2316 				     SMB2_CRTCTX_AAPL_VOLUME_CAPS |
2317 				     SMB2_CRTCTX_AAPL_MODEL_INFO);
2318 
2319 	/* base data: cmd(4)+reserved(4)+reply_bitmap(8)+server_caps(8)+vol_caps(8) */
2320 	data_len = 32;
2321 	if (reply_bitmap & SMB2_CRTCTX_AAPL_MODEL_INFO)
2322 		data_len += 4 + 4 + AAPL_MODEL_UTF16_BYTES; /* pad2+model_bytes+string */
2323 
2324 	buf->ccontext.DataOffset = cpu_to_le16(offsetof(struct create_aapl_rsp, cmd));
2325 	buf->ccontext.DataLength = cpu_to_le32(data_len);
2326 	buf->ccontext.NameOffset = cpu_to_le16(offsetof(struct create_aapl_rsp, Name));
2327 	buf->ccontext.NameLength = cpu_to_le16(SMB2_CREATE_AAPL_LEN);
2328 	buf->Name[0] = 'A';
2329 	buf->Name[1] = 'A';
2330 	buf->Name[2] = 'P';
2331 	buf->Name[3] = 'L';
2332 
2333 	buf->cmd = cpu_to_le32(SMB2_CRTCTX_AAPL_SERVER_QUERY);
2334 	buf->reply_bitmap = cpu_to_le64(reply_bitmap);
2335 	server_caps = AAPL_SERVER_CAPS_KSMBD;
2336 	if (readdir_attr_v2)
2337 		server_caps = (server_caps & ~SMB2_CRTCTX_AAPL_SUPPORTS_READ_DIR_ATTR) |
2338 			      SMB2_CRTCTX_AAPL_SUPPORTS_READ_DIR_ATTR_V2;
2339 	buf->server_caps = (reply_bitmap & SMB2_CRTCTX_AAPL_SERVER_CAPS) ?
2340 			   cpu_to_le64(server_caps) : 0;
2341 	buf->vol_caps = (reply_bitmap & SMB2_CRTCTX_AAPL_VOLUME_CAPS) ?
2342 			cpu_to_le64(vol_caps) : 0;
2343 
2344 	if (reply_bitmap & SMB2_CRTCTX_AAPL_MODEL_INFO) {
2345 		__le32 *p = (__le32 *)((u8 *)buf + sizeof(*buf));
2346 		__le16 *model_str = (__le16 *)(p + 2);
2347 		const char *src = server_conf.aapl_model[0] ?
2348 				  server_conf.aapl_model : "Xserve";
2349 		int i, model_bytes = 0;
2350 
2351 		/* Convert ASCII model string to UTF-16LE in-place */
2352 		for (i = 0; src[i] && i < AAPL_MODEL_MAX_CHARS; i++) {
2353 			model_str[i] = cpu_to_le16((unsigned char)src[i]);
2354 			model_bytes += 2;
2355 		}
2356 
2357 		p[0] = 0; /* pad2 */
2358 		p[1] = cpu_to_le32(model_bytes);
2359 
2360 		/* Update DataLength to reflect actual model string size */
2361 		buf->ccontext.DataLength =
2362 			cpu_to_le32(data_len - AAPL_MODEL_UTF16_BYTES + model_bytes);
2363 	}
2364 }
2365 
2366 /*
2367  * Find lease object(opinfo) for given lease key/fid from lease
2368  * break/file close path.
2369  */
2370 /**
2371  * lookup_lease_in_table() - find a matching lease info object
2372  * @conn:	connection instance
2373  * @lease_key:	lease key to be searched for
2374  *
2375  * Return:      opinfo if found matching opinfo, otherwise NULL
2376  */
lookup_lease_in_table(struct ksmbd_conn * conn,char * lease_key)2377 struct oplock_info *lookup_lease_in_table(struct ksmbd_conn *conn,
2378 					  char *lease_key)
2379 {
2380 	struct oplock_info *opinfo = NULL, *ret_op = NULL;
2381 	struct lease *lease;
2382 	struct lease_table *lt;
2383 
2384 	read_lock(&lease_list_lock);
2385 	list_for_each_entry(lt, &lease_table_list, l_entry) {
2386 		if (!memcmp(lt->client_guid, conn->ClientGUID,
2387 			    SMB2_CLIENT_GUID_SIZE))
2388 			goto found;
2389 	}
2390 
2391 	read_unlock(&lease_list_lock);
2392 	return NULL;
2393 
2394 found:
2395 	list_for_each_entry(lease, &lt->lease_list, l_entry) {
2396 		if (memcmp(lease->lease_key, lease_key, SMB2_LEASE_KEY_SIZE))
2397 			continue;
2398 		if (!(lease->state & (SMB2_LEASE_HANDLE_CACHING_LE |
2399 				      SMB2_LEASE_WRITE_CACHING_LE)))
2400 			break;
2401 
2402 		spin_lock(&lease->lock);
2403 		list_for_each_entry(opinfo, &lease->open_list, lease_entry) {
2404 			if (!opinfo->op_state ||
2405 			    opinfo->op_state == OPLOCK_CLOSING)
2406 				continue;
2407 			if (!atomic_inc_not_zero(&opinfo->refcount))
2408 				continue;
2409 			ret_op = opinfo;
2410 		}
2411 		spin_unlock(&lease->lock);
2412 		if (ret_op) {
2413 			ksmbd_debug(OPLOCK, "found opinfo\n");
2414 			goto out;
2415 		}
2416 		break;
2417 	}
2418 
2419 out:
2420 	read_unlock(&lease_list_lock);
2421 	return ret_op;
2422 }
2423 
smb2_check_durable_oplock(struct ksmbd_conn * conn,struct ksmbd_share_config * share,struct ksmbd_file * fp,struct lease_ctx_info * lctx,struct ksmbd_user * user,char * name)2424 int smb2_check_durable_oplock(struct ksmbd_conn *conn,
2425 			      struct ksmbd_share_config *share,
2426 			      struct ksmbd_file *fp,
2427 			      struct lease_ctx_info *lctx,
2428 			      struct ksmbd_user *user,
2429 			      char *name)
2430 {
2431 	struct oplock_info *opinfo = opinfo_get(fp);
2432 	int ret = 0;
2433 
2434 	if (!opinfo)
2435 		return 0;
2436 
2437 	if (ksmbd_has_other_active_fd(fp)) {
2438 		ksmbd_debug(SMB, "Durable handle reconnect failed: competing open\n");
2439 		ret = -EBADF;
2440 		goto out;
2441 	}
2442 
2443 	if (ksmbd_vfs_compare_durable_owner(fp, user) == false) {
2444 		ksmbd_debug(SMB, "Durable handle reconnect failed: owner mismatch\n");
2445 		ret = -EBADF;
2446 		goto out;
2447 	}
2448 
2449 	if (opinfo->is_lease == false) {
2450 		if (lctx) {
2451 			pr_err("create context include lease\n");
2452 			ret = -EBADF;
2453 			goto out;
2454 		}
2455 
2456 		if (opinfo->level != SMB2_OPLOCK_LEVEL_BATCH) {
2457 			pr_err("oplock level is not equal to SMB2_OPLOCK_LEVEL_BATCH\n");
2458 			ret = -EBADF;
2459 		}
2460 
2461 		goto out;
2462 	}
2463 
2464 	if (memcmp(conn->ClientGUID, fp->client_guid,
2465 				SMB2_CLIENT_GUID_SIZE)) {
2466 		ksmbd_debug(SMB, "Client guid of fp is not equal to the one of connection\n");
2467 		ret = -EBADF;
2468 		goto out;
2469 	}
2470 
2471 	if (!lctx) {
2472 		ksmbd_debug(SMB, "create context does not include lease\n");
2473 		ret = -EBADF;
2474 		goto out;
2475 	}
2476 
2477 	if (memcmp(opinfo->o_lease->lease_key, lctx->lease_key,
2478 				SMB2_LEASE_KEY_SIZE)) {
2479 		ksmbd_debug(SMB,
2480 			    "lease key of fp does not match lease key in create context\n");
2481 		ret = -EBADF;
2482 		goto out;
2483 	}
2484 
2485 	if (!(opinfo->o_lease->state & SMB2_LEASE_HANDLE_CACHING_LE)) {
2486 		ksmbd_debug(SMB, "lease state does not contain SMB2_LEASE_HANDLE_CACHING\n");
2487 		ret = -EBADF;
2488 		goto out;
2489 	}
2490 
2491 	if (opinfo->o_lease->version != lctx->version) {
2492 		ksmbd_debug(SMB,
2493 			    "lease version of fp does not match the one in create context\n");
2494 		ret = -EBADF;
2495 		goto out;
2496 	}
2497 
2498 	if (!ksmbd_inode_pending_delete(fp))
2499 		ret = ksmbd_validate_name_reconnect(share, fp, name);
2500 out:
2501 	opinfo_put(opinfo);
2502 	return ret;
2503 }
2504