/* a oplock break request handler */ static bool torture_oplock_handler(struct smb2_transport *transport, const struct smb2_handle *handle, uint8_t level, void *private_data) { struct smb2_tree *tree = private_data; struct smb2_request *req; struct smb2_break br; break_info.oplock_handle = *handle; break_info.oplock_level = level; break_info.oplock_count++; ZERO_STRUCT(br); br.in.file.handle = *handle; br.in.oplock_level = level; if (break_info.held_oplock_level > SMB2_OPLOCK_LEVEL_II) { req = smb2_break_send(tree, &br); req->async.fn = torture_oplock_break_callback; req->async.private_data = NULL; } break_info.held_oplock_level = level; return true; }
/* A general oplock break notification handler. This should be used when a * test expects to break from batch or exclusive to a lower level. */ static bool torture_oplock_handler(struct smb2_transport *transport, const struct smb2_handle *handle, uint8_t level, void *private_data) { struct smb2_tree *tree = private_data; const char *name; struct smb2_request *req; ZERO_STRUCT(break_info.br); break_info.handle = *handle; break_info.level = level; break_info.count++; switch (level) { case SMB2_OPLOCK_LEVEL_II: name = "level II"; break; case SMB2_OPLOCK_LEVEL_NONE: name = "none"; break; default: name = "unknown"; break_info.failures++; } printf("Acking to %s [0x%02X] in oplock handler\n", name, level); break_info.br.in.file.handle = *handle; break_info.br.in.oplock_level = level; break_info.br.in.reserved = 0; break_info.br.in.reserved2 = 0; req = smb2_break_send(tree, &break_info.br); req->async.fn = torture_oplock_break_callback; req->async.private_data = NULL; return true; }