Lines Matching defs: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 (opinfo->conn == NULL ||
163 !atomic_inc_not_zero(&opinfo->refcount))
164 opinfo = NULL;
166 atomic_inc(&opinfo->conn->r_count);
167 if (ksmbd_conn_releasing(opinfo->conn)) {
168 atomic_dec(&opinfo->conn->r_count);
169 atomic_dec(&opinfo->refcount);
170 opinfo = NULL;
177 return opinfo;
180 static void opinfo_conn_put(struct oplock_info *opinfo)
184 if (!opinfo)
187 conn = opinfo->conn;
195 opinfo_put(opinfo);
198 void opinfo_put(struct oplock_info *opinfo)
200 if (!atomic_dec_and_test(&opinfo->refcount))
203 call_rcu(&opinfo->rcu_head, opinfo_free_rcu);
206 static void opinfo_add(struct oplock_info *opinfo)
208 struct ksmbd_inode *ci = opinfo->o_fp->f_ci;
211 list_add_rcu(&opinfo->op_entry, &ci->m_op_list);
215 static void opinfo_del(struct oplock_info *opinfo)
217 struct ksmbd_inode *ci = opinfo->o_fp->f_ci;
219 if (opinfo->is_lease) {
221 lease_del_list(opinfo);
225 list_del_rcu(&opinfo->op_entry);
255 * @opinfo: current oplock info
259 int opinfo_write_to_read(struct oplock_info *opinfo)
261 struct lease *lease = opinfo->o_lease;
263 if (!(opinfo->level == SMB2_OPLOCK_LEVEL_BATCH ||
264 opinfo->level == SMB2_OPLOCK_LEVEL_EXCLUSIVE)) {
265 pr_err("bad oplock(0x%x)\n", opinfo->level);
266 if (opinfo->is_lease)
270 opinfo->level = SMB2_OPLOCK_LEVEL_II;
272 if (opinfo->is_lease)
279 * @opinfo: current oplock info
283 int opinfo_read_handle_to_read(struct oplock_info *opinfo)
285 struct lease *lease = opinfo->o_lease;
288 opinfo->level = SMB2_OPLOCK_LEVEL_II;
294 * @opinfo: current oplock info
298 int opinfo_write_to_none(struct oplock_info *opinfo)
300 struct lease *lease = opinfo->o_lease;
302 if (!(opinfo->level == SMB2_OPLOCK_LEVEL_BATCH ||
303 opinfo->level == SMB2_OPLOCK_LEVEL_EXCLUSIVE)) {
304 pr_err("bad oplock(0x%x)\n", opinfo->level);
305 if (opinfo->is_lease)
309 opinfo->level = SMB2_OPLOCK_LEVEL_NONE;
310 if (opinfo->is_lease)
317 * @opinfo: current oplock info
321 int opinfo_read_to_none(struct oplock_info *opinfo)
323 struct lease *lease = opinfo->o_lease;
325 if (opinfo->level != SMB2_OPLOCK_LEVEL_II) {
326 pr_err("bad oplock(0x%x)\n", opinfo->level);
327 if (opinfo->is_lease)
331 opinfo->level = SMB2_OPLOCK_LEVEL_NONE;
332 if (opinfo->is_lease)
339 * @opinfo: current lease info
343 int lease_read_to_write(struct oplock_info *opinfo)
345 struct lease *lease = opinfo->o_lease;
355 opinfo->level = SMB2_OPLOCK_LEVEL_BATCH;
357 opinfo->level = SMB2_OPLOCK_LEVEL_EXCLUSIVE;
363 * @opinfo: current lease info
368 static int lease_none_upgrade(struct oplock_info *opinfo, __le32 new_state)
370 struct lease *lease = opinfo->o_lease;
381 opinfo->level = SMB2_OPLOCK_LEVEL_BATCH;
383 opinfo->level = SMB2_OPLOCK_LEVEL_II;
385 opinfo->level = SMB2_OPLOCK_LEVEL_EXCLUSIVE;
387 opinfo->level = SMB2_OPLOCK_LEVEL_II;
398 struct oplock_info *opinfo;
403 opinfo = opinfo_get(fp);
404 if (!opinfo)
407 opinfo_del(opinfo);
410 if (opinfo->op_state == OPLOCK_ACK_WAIT) {
411 opinfo->op_state = OPLOCK_CLOSING;
412 wake_up_interruptible_all(&opinfo->oplock_q);
413 if (opinfo->is_lease) {
414 atomic_set(&opinfo->breaking_cnt, 0);
415 wake_up_interruptible_all(&opinfo->oplock_brk);
420 atomic_dec(&opinfo->refcount);
421 opinfo_put(opinfo);
490 static inline int compare_guid_key(struct oplock_info *opinfo,
495 guid2 = opinfo->conn->ClientGUID;
496 key2 = opinfo->o_lease->lease_key;
519 struct oplock_info *opinfo;
530 list_for_each_entry(opinfo, &ci->m_op_list, op_entry) {
531 if (!opinfo->is_lease || !opinfo->conn)
534 lease = opinfo->o_lease;
536 ret = compare_guid_key(opinfo, client_guid, lctx->lease_key);
538 m_opinfo = opinfo;
540 if (atomic_read(&opinfo->breaking_cnt)) {
554 lease_read_to_write(opinfo);
570 lease_none_upgrade(opinfo, lctx->req_state);
580 static void wait_for_break_ack(struct oplock_info *opinfo)
584 rc = wait_event_interruptible_timeout(opinfo->oplock_q,
585 opinfo->op_state == OPLOCK_STATE_NONE ||
586 opinfo->op_state == OPLOCK_CLOSING,
591 if (opinfo->is_lease)
592 opinfo->o_lease->state = SMB2_LEASE_NONE_LE;
593 opinfo->level = SMB2_OPLOCK_LEVEL_NONE;
594 opinfo->op_state = OPLOCK_STATE_NONE;
598 static void wake_up_oplock_break(struct oplock_info *opinfo)
600 clear_bit_unlock(0, &opinfo->pending_break);
603 wake_up_bit(&opinfo->pending_break, 0);
606 static int oplock_break_pending(struct oplock_info *opinfo, int req_op_level)
608 while (test_and_set_bit(0, &opinfo->pending_break)) {
609 wait_on_bit(&opinfo->pending_break, 0, TASK_UNINTERRUPTIBLE);
612 opinfo->open_trunc = 0;
614 if (opinfo->op_state == OPLOCK_CLOSING)
616 else if (!opinfo->is_lease && opinfo->level <= req_op_level)
620 if (!opinfo->is_lease && opinfo->level <= req_op_level) {
621 wake_up_oplock_break(opinfo);
701 * @opinfo: oplock info object
705 static int smb2_oplock_break_noti(struct oplock_info *opinfo)
707 struct ksmbd_conn *conn = opinfo->conn;
721 br_info->level = opinfo->level;
722 br_info->fid = opinfo->fid;
723 br_info->open_trunc = opinfo->open_trunc;
727 work->sess = opinfo->sess;
729 if (opinfo->op_state == OPLOCK_ACK_WAIT) {
733 wait_for_break_ack(opinfo);
736 if (opinfo->level == SMB2_OPLOCK_LEVEL_II)
737 opinfo->level = SMB2_OPLOCK_LEVEL_NONE;
802 * @opinfo: conains lease state information
806 static int smb2_lease_break_noti(struct oplock_info *opinfo)
808 struct ksmbd_conn *conn = opinfo->conn;
812 struct lease *lease = opinfo->o_lease;
834 work->sess = opinfo->sess;
836 if (opinfo->op_state == OPLOCK_ACK_WAIT) {
837 list_for_each_safe(tmp, t, &opinfo->interim_list) {
849 wait_for_break_ack(opinfo);
852 if (opinfo->o_lease->new_state == SMB2_LEASE_NONE_LE) {
853 opinfo->level = SMB2_OPLOCK_LEVEL_NONE;
854 opinfo->o_lease->state = SMB2_LEASE_NONE_LE;
860 static void wait_lease_breaking(struct oplock_info *opinfo)
862 if (!opinfo->is_lease)
865 wake_up_interruptible_all(&opinfo->oplock_brk);
866 if (atomic_read(&opinfo->breaking_cnt)) {
869 ret = wait_event_interruptible_timeout(opinfo->oplock_brk,
870 atomic_read(&opinfo->breaking_cnt) == 0,
873 atomic_set(&opinfo->breaking_cnt, 0);
953 struct oplock_info *opinfo;
967 list_for_each_entry_rcu(opinfo, &lb->lease_list,
970 lease_del_list(opinfo);
983 struct oplock_info *opinfo;
1007 list_for_each_entry_rcu(opinfo, &lb->lease_list, lease_entry) {
1008 if (!atomic_inc_not_zero(&opinfo->refcount))
1011 if (opinfo->o_fp->f_ci == ci)
1013 err = compare_guid_key(opinfo, sess->ClientGUID,
1019 opinfo_put(opinfo);
1023 opinfo_put(opinfo);
1048 static int add_lease_global_list(struct oplock_info *opinfo)
1054 if (!memcmp(lb->client_guid, opinfo->conn->ClientGUID,
1056 opinfo->o_lease->l_lb = lb;
1057 lease_add_list(opinfo);
1068 memcpy(lb->client_guid, opinfo->conn->ClientGUID,
1072 opinfo->o_lease->l_lb = lb;
1073 lease_add_list(opinfo);
1078 static void set_oplock_level(struct oplock_info *opinfo, int level,
1084 grant_write_oplock(opinfo, level, lctx);
1087 grant_read_oplock(opinfo, lctx);
1090 grant_none_oplock(opinfo, lctx);
1098 struct oplock_info *opinfo;
1109 list_for_each_entry(opinfo, &p_ci->m_op_list, op_entry) {
1110 if (opinfo->conn == NULL || !opinfo->is_lease)
1113 if (opinfo->o_lease->state != SMB2_OPLOCK_LEVEL_NONE &&
1115 !compare_guid_key(opinfo, fp->conn->ClientGUID,
1117 if (!atomic_inc_not_zero(&opinfo->refcount))
1120 atomic_inc(&opinfo->conn->r_count);
1121 if (ksmbd_conn_releasing(opinfo->conn)) {
1122 atomic_dec(&opinfo->conn->r_count);
1127 oplock_break(opinfo, SMB2_OPLOCK_LEVEL_NONE);
1128 opinfo_conn_put(opinfo);
1139 struct oplock_info *opinfo;
1143 opinfo = rcu_dereference(fp->f_opinfo);
1146 if (!opinfo || !opinfo->is_lease || opinfo->o_lease->version != 2)
1154 list_for_each_entry(opinfo, &p_ci->m_op_list, op_entry) {
1155 if (opinfo->conn == NULL || !opinfo->is_lease)
1158 if (opinfo->o_lease->state != SMB2_OPLOCK_LEVEL_NONE) {
1159 if (!atomic_inc_not_zero(&opinfo->refcount))
1162 atomic_inc(&opinfo->conn->r_count);
1163 if (ksmbd_conn_releasing(opinfo->conn)) {
1164 atomic_dec(&opinfo->conn->r_count);
1168 oplock_break(opinfo, SMB2_OPLOCK_LEVEL_NONE);
1169 opinfo_conn_put(opinfo);
1196 struct oplock_info *opinfo = NULL, *prev_opinfo = NULL;
1207 opinfo = alloc_opinfo(work, pid, tid);
1208 if (!opinfo)
1212 err = alloc_lease(opinfo, lctx);
1215 opinfo->is_lease = 1;
1237 copy_lease(m_opinfo, opinfo);
1239 opinfo->o_lease->flags =
1296 set_oplock_level(opinfo, req_op_level, lctx);
1299 rcu_assign_pointer(fp->f_opinfo, opinfo);
1300 opinfo->o_fp = fp;
1303 opinfo_add(opinfo);
1304 if (opinfo->is_lease) {
1305 err = add_lease_global_list(opinfo);
1312 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, &lt->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);
1823 struct oplock_info *opinfo = opinfo_get(fp);
1826 if (!opinfo)
1829 if (opinfo->is_lease == false) {
1836 if (opinfo->level != SMB2_OPLOCK_LEVEL_BATCH) {
1857 if (memcmp(opinfo->o_lease->lease_key, lctx->lease_key,
1865 if (!(opinfo->o_lease->state & SMB2_LEASE_HANDLE_CACHING_LE)) {
1871 if (opinfo->o_lease->version != lctx->version) {
1881 opinfo_put(opinfo);