Lines Matching refs:opinfo
23 * alloc_opinfo() - allocate a new opinfo object for oplock info
28 * Return: allocated opinfo object on success, otherwise NULL
35 struct oplock_info *opinfo;
37 opinfo = kzalloc(sizeof(struct oplock_info), GFP_KERNEL);
38 if (!opinfo)
41 opinfo->sess = sess;
42 opinfo->conn = conn;
43 opinfo->level = SMB2_OPLOCK_LEVEL_NONE;
44 opinfo->op_state = OPLOCK_STATE_NONE;
45 opinfo->pending_break = 0;
46 opinfo->fid = id;
47 opinfo->Tid = Tid;
48 INIT_LIST_HEAD(&opinfo->op_entry);
49 INIT_LIST_HEAD(&opinfo->interim_list);
50 init_waitqueue_head(&opinfo->oplock_q);
51 init_waitqueue_head(&opinfo->oplock_brk);
52 atomic_set(&opinfo->refcount, 1);
53 atomic_set(&opinfo->breaking_cnt, 0);
55 return opinfo;
58 static void lease_add_list(struct oplock_info *opinfo)
60 struct lease_table *lb = opinfo->o_lease->l_lb;
63 list_add_rcu(&opinfo->lease_entry, &lb->lease_list);
67 static void lease_del_list(struct oplock_info *opinfo)
69 struct lease_table *lb = opinfo->o_lease->l_lb;
75 if (list_empty(&opinfo->lease_entry)) {
80 list_del_init(&opinfo->lease_entry);
81 opinfo->o_lease->l_lb = NULL;
92 static int alloc_lease(struct oplock_info *opinfo, struct lease_ctx_info *lctx)
109 INIT_LIST_HEAD(&opinfo->lease_entry);
110 opinfo->o_lease = lease;
115 static void free_lease(struct oplock_info *opinfo)
119 lease = opinfo->o_lease;
123 static void free_opinfo(struct oplock_info *opinfo)
125 if (opinfo->is_lease)
126 free_lease(opinfo);
127 kfree(opinfo);
132 struct oplock_info *opinfo;
134 opinfo = container_of(rcu_head, struct oplock_info, rcu_head);
135 free_opinfo(opinfo);
140 struct oplock_info *opinfo;
143 opinfo = rcu_dereference(fp->f_opinfo);
144 if (opinfo && !atomic_inc_not_zero(&opinfo->refcount))
145 opinfo = NULL;
148 return opinfo;
153 struct oplock_info *opinfo;
159 opinfo = list_first_or_null_rcu(&ci->m_op_list, struct oplock_info,
161 if (opinfo) {
162 if (!atomic_inc_not_zero(&opinfo->refcount))
163 opinfo = NULL;
165 atomic_inc(&opinfo->conn->r_count);
166 if (ksmbd_conn_releasing(opinfo->conn)) {
167 atomic_dec(&opinfo->conn->r_count);
168 atomic_dec(&opinfo->refcount);
169 opinfo = NULL;
176 return opinfo;
179 static void opinfo_conn_put(struct oplock_info *opinfo)
183 if (!opinfo)
186 conn = opinfo->conn;
194 opinfo_put(opinfo);
197 void opinfo_put(struct oplock_info *opinfo)
199 if (!atomic_dec_and_test(&opinfo->refcount))
202 call_rcu(&opinfo->rcu_head, opinfo_free_rcu);
205 static void opinfo_add(struct oplock_info *opinfo)
207 struct ksmbd_inode *ci = opinfo->o_fp->f_ci;
210 list_add_rcu(&opinfo->op_entry, &ci->m_op_list);
214 static void opinfo_del(struct oplock_info *opinfo)
216 struct ksmbd_inode *ci = opinfo->o_fp->f_ci;
218 if (opinfo->is_lease) {
220 lease_del_list(opinfo);
224 list_del_rcu(&opinfo->op_entry);
254 * @opinfo: current oplock info
258 int opinfo_write_to_read(struct oplock_info *opinfo)
260 struct lease *lease = opinfo->o_lease;
262 if (!(opinfo->level == SMB2_OPLOCK_LEVEL_BATCH ||
263 opinfo->level == SMB2_OPLOCK_LEVEL_EXCLUSIVE)) {
264 pr_err("bad oplock(0x%x)\n", opinfo->level);
265 if (opinfo->is_lease)
269 opinfo->level = SMB2_OPLOCK_LEVEL_II;
271 if (opinfo->is_lease)
278 * @opinfo: current oplock info
282 int opinfo_read_handle_to_read(struct oplock_info *opinfo)
284 struct lease *lease = opinfo->o_lease;
287 opinfo->level = SMB2_OPLOCK_LEVEL_II;
293 * @opinfo: current oplock info
297 int opinfo_write_to_none(struct oplock_info *opinfo)
299 struct lease *lease = opinfo->o_lease;
301 if (!(opinfo->level == SMB2_OPLOCK_LEVEL_BATCH ||
302 opinfo->level == SMB2_OPLOCK_LEVEL_EXCLUSIVE)) {
303 pr_err("bad oplock(0x%x)\n", opinfo->level);
304 if (opinfo->is_lease)
308 opinfo->level = SMB2_OPLOCK_LEVEL_NONE;
309 if (opinfo->is_lease)
316 * @opinfo: current oplock info
320 int opinfo_read_to_none(struct oplock_info *opinfo)
322 struct lease *lease = opinfo->o_lease;
324 if (opinfo->level != SMB2_OPLOCK_LEVEL_II) {
325 pr_err("bad oplock(0x%x)\n", opinfo->level);
326 if (opinfo->is_lease)
330 opinfo->level = SMB2_OPLOCK_LEVEL_NONE;
331 if (opinfo->is_lease)
338 * @opinfo: current lease info
342 int lease_read_to_write(struct oplock_info *opinfo)
344 struct lease *lease = opinfo->o_lease;
354 opinfo->level = SMB2_OPLOCK_LEVEL_BATCH;
356 opinfo->level = SMB2_OPLOCK_LEVEL_EXCLUSIVE;
362 * @opinfo: current lease info
367 static int lease_none_upgrade(struct oplock_info *opinfo, __le32 new_state)
369 struct lease *lease = opinfo->o_lease;
380 opinfo->level = SMB2_OPLOCK_LEVEL_BATCH;
382 opinfo->level = SMB2_OPLOCK_LEVEL_II;
384 opinfo->level = SMB2_OPLOCK_LEVEL_EXCLUSIVE;
386 opinfo->level = SMB2_OPLOCK_LEVEL_II;
397 struct oplock_info *opinfo;
402 opinfo = opinfo_get(fp);
403 if (!opinfo)
406 opinfo_del(opinfo);
409 if (opinfo->op_state == OPLOCK_ACK_WAIT) {
410 opinfo->op_state = OPLOCK_CLOSING;
411 wake_up_interruptible_all(&opinfo->oplock_q);
412 if (opinfo->is_lease) {
413 atomic_set(&opinfo->breaking_cnt, 0);
414 wake_up_interruptible_all(&opinfo->oplock_brk);
419 atomic_dec(&opinfo->refcount);
420 opinfo_put(opinfo);
489 static inline int compare_guid_key(struct oplock_info *opinfo,
494 guid2 = opinfo->conn->ClientGUID;
495 key2 = opinfo->o_lease->lease_key;
518 struct oplock_info *opinfo;
529 list_for_each_entry(opinfo, &ci->m_op_list, op_entry) {
530 if (!opinfo->is_lease)
533 lease = opinfo->o_lease;
535 ret = compare_guid_key(opinfo, client_guid, lctx->lease_key);
537 m_opinfo = opinfo;
539 if (atomic_read(&opinfo->breaking_cnt)) {
553 lease_read_to_write(opinfo);
569 lease_none_upgrade(opinfo, lctx->req_state);
579 static void wait_for_break_ack(struct oplock_info *opinfo)
583 rc = wait_event_interruptible_timeout(opinfo->oplock_q,
584 opinfo->op_state == OPLOCK_STATE_NONE ||
585 opinfo->op_state == OPLOCK_CLOSING,
590 if (opinfo->is_lease)
591 opinfo->o_lease->state = SMB2_LEASE_NONE_LE;
592 opinfo->level = SMB2_OPLOCK_LEVEL_NONE;
593 opinfo->op_state = OPLOCK_STATE_NONE;
597 static void wake_up_oplock_break(struct oplock_info *opinfo)
599 clear_bit_unlock(0, &opinfo->pending_break);
602 wake_up_bit(&opinfo->pending_break, 0);
605 static int oplock_break_pending(struct oplock_info *opinfo, int req_op_level)
607 while (test_and_set_bit(0, &opinfo->pending_break)) {
608 wait_on_bit(&opinfo->pending_break, 0, TASK_UNINTERRUPTIBLE);
611 opinfo->open_trunc = 0;
613 if (opinfo->op_state == OPLOCK_CLOSING)
615 else if (!opinfo->is_lease && opinfo->level <= req_op_level)
619 if (!opinfo->is_lease && opinfo->level <= req_op_level) {
620 wake_up_oplock_break(opinfo);
700 * @opinfo: oplock info object
704 static int smb2_oplock_break_noti(struct oplock_info *opinfo)
706 struct ksmbd_conn *conn = opinfo->conn;
720 br_info->level = opinfo->level;
721 br_info->fid = opinfo->fid;
722 br_info->open_trunc = opinfo->open_trunc;
726 work->sess = opinfo->sess;
728 if (opinfo->op_state == OPLOCK_ACK_WAIT) {
732 wait_for_break_ack(opinfo);
735 if (opinfo->level == SMB2_OPLOCK_LEVEL_II)
736 opinfo->level = SMB2_OPLOCK_LEVEL_NONE;
801 * @opinfo: conains lease state information
805 static int smb2_lease_break_noti(struct oplock_info *opinfo)
807 struct ksmbd_conn *conn = opinfo->conn;
811 struct lease *lease = opinfo->o_lease;
833 work->sess = opinfo->sess;
835 if (opinfo->op_state == OPLOCK_ACK_WAIT) {
836 list_for_each_safe(tmp, t, &opinfo->interim_list) {
848 wait_for_break_ack(opinfo);
851 if (opinfo->o_lease->new_state == SMB2_LEASE_NONE_LE) {
852 opinfo->level = SMB2_OPLOCK_LEVEL_NONE;
853 opinfo->o_lease->state = SMB2_LEASE_NONE_LE;
859 static void wait_lease_breaking(struct oplock_info *opinfo)
861 if (!opinfo->is_lease)
864 wake_up_interruptible_all(&opinfo->oplock_brk);
865 if (atomic_read(&opinfo->breaking_cnt)) {
868 ret = wait_event_interruptible_timeout(opinfo->oplock_brk,
869 atomic_read(&opinfo->breaking_cnt) == 0,
872 atomic_set(&opinfo->breaking_cnt, 0);
952 struct oplock_info *opinfo;
966 list_for_each_entry_rcu(opinfo, &lb->lease_list,
969 lease_del_list(opinfo);
982 struct oplock_info *opinfo;
1006 list_for_each_entry_rcu(opinfo, &lb->lease_list, lease_entry) {
1007 if (!atomic_inc_not_zero(&opinfo->refcount))
1010 if (opinfo->o_fp->f_ci == ci)
1012 err = compare_guid_key(opinfo, sess->ClientGUID,
1018 opinfo_put(opinfo);
1022 opinfo_put(opinfo);
1047 static int add_lease_global_list(struct oplock_info *opinfo)
1053 if (!memcmp(lb->client_guid, opinfo->conn->ClientGUID,
1055 opinfo->o_lease->l_lb = lb;
1056 lease_add_list(opinfo);
1067 memcpy(lb->client_guid, opinfo->conn->ClientGUID,
1071 opinfo->o_lease->l_lb = lb;
1072 lease_add_list(opinfo);
1077 static void set_oplock_level(struct oplock_info *opinfo, int level,
1083 grant_write_oplock(opinfo, level, lctx);
1086 grant_read_oplock(opinfo, lctx);
1089 grant_none_oplock(opinfo, lctx);
1097 struct oplock_info *opinfo;
1108 list_for_each_entry(opinfo, &p_ci->m_op_list, op_entry) {
1109 if (!opinfo->is_lease)
1112 if (opinfo->o_lease->state != SMB2_OPLOCK_LEVEL_NONE &&
1114 !compare_guid_key(opinfo, fp->conn->ClientGUID,
1116 if (!atomic_inc_not_zero(&opinfo->refcount))
1119 atomic_inc(&opinfo->conn->r_count);
1120 if (ksmbd_conn_releasing(opinfo->conn)) {
1121 atomic_dec(&opinfo->conn->r_count);
1126 oplock_break(opinfo, SMB2_OPLOCK_LEVEL_NONE);
1127 opinfo_conn_put(opinfo);
1138 struct oplock_info *opinfo;
1142 opinfo = rcu_dereference(fp->f_opinfo);
1145 if (!opinfo->is_lease || opinfo->o_lease->version != 2)
1153 list_for_each_entry(opinfo, &p_ci->m_op_list, op_entry) {
1154 if (!opinfo->is_lease)
1157 if (opinfo->o_lease->state != SMB2_OPLOCK_LEVEL_NONE) {
1158 if (!atomic_inc_not_zero(&opinfo->refcount))
1161 atomic_inc(&opinfo->conn->r_count);
1162 if (ksmbd_conn_releasing(opinfo->conn)) {
1163 atomic_dec(&opinfo->conn->r_count);
1167 oplock_break(opinfo, SMB2_OPLOCK_LEVEL_NONE);
1168 opinfo_conn_put(opinfo);
1195 struct oplock_info *opinfo = NULL, *prev_opinfo = NULL;
1206 opinfo = alloc_opinfo(work, pid, tid);
1207 if (!opinfo)
1211 err = alloc_lease(opinfo, lctx);
1214 opinfo->is_lease = 1;
1236 copy_lease(m_opinfo, opinfo);
1238 opinfo->o_lease->flags =
1295 set_oplock_level(opinfo, req_op_level, lctx);
1298 rcu_assign_pointer(fp->f_opinfo, opinfo);
1299 opinfo->o_fp = fp;
1302 opinfo_add(opinfo);
1303 if (opinfo->is_lease) {
1304 err = add_lease_global_list(opinfo);
1311 free_opinfo(opinfo);
1760 * Find lease object(opinfo) for given lease key/fid from lease
1768 * Return: opinfo if found matching opinfo, otherwise NULL
1773 struct oplock_info *opinfo = NULL, *ret_op = NULL;
1789 list_for_each_entry_rcu(opinfo, <->lease_list, lease_entry) {
1790 if (!atomic_inc_not_zero(&opinfo->refcount))
1793 if (!opinfo->op_state || opinfo->op_state == OPLOCK_CLOSING)
1795 if (!(opinfo->o_lease->state &
1799 ret = compare_guid_key(opinfo, conn->ClientGUID,
1802 ksmbd_debug(OPLOCK, "found opinfo\n");
1803 ret_op = opinfo;
1807 opinfo_put(opinfo);