fs/smb/client/smb2ops.c

Source file repositories/reference/linux-study-clean/fs/smb/client/smb2ops.c

File Facts

System
Linux kernel
Corpus path
fs/smb/client/smb2ops.c
Extension
.c
Size
172396 bytes
Lines
5983
Domain
Core OS
Bucket
VFS And Filesystem Core
Inferred role
Core OS: implementation source
Status
source implementation candidate

Why This File Exists

Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.

Dependency Surface

Detected Declarations

Annotated Snippet

struct smb2_decrypt_work {
	struct work_struct decrypt;
	struct TCP_Server_Info *server;
	struct folio_queue *buffer;
	char *buf;
	unsigned int len;
};


static void smb2_decrypt_offload(struct work_struct *work)
{
	struct smb2_decrypt_work *dw = container_of(work,
				struct smb2_decrypt_work, decrypt);
	int rc;
	struct mid_q_entry *mid;
	struct iov_iter iter;

	iov_iter_folio_queue(&iter, ITER_DEST, dw->buffer, 0, 0, dw->len);
	rc = decrypt_raw_data(dw->server, dw->buf, dw->server->vals->read_rsp_size,
			      &iter, true);
	if (rc) {
		cifs_dbg(VFS, "error decrypting rc=%d\n", rc);
		goto free_pages;
	}

	dw->server->lstrp = jiffies;
	mid = smb2_find_dequeue_mid(dw->server, dw->buf);
	if (mid == NULL)
		cifs_dbg(FYI, "mid not found\n");
	else {
		mid->decrypted = true;
		rc = handle_read_data(dw->server, mid, dw->buf,
				      dw->server->vals->read_rsp_size,
				      dw->buffer, dw->len,
				      true);
		if (rc >= 0) {
#ifdef CONFIG_CIFS_STATS2
			mid->when_received = jiffies;
#endif
			if (dw->server->ops->is_network_name_deleted)
				dw->server->ops->is_network_name_deleted(dw->buf,
									 dw->server);

			mid_execute_callback(dw->server, mid);
		} else {
			spin_lock(&dw->server->srv_lock);
			if (dw->server->tcpStatus == CifsNeedReconnect) {
				spin_lock(&dw->server->mid_queue_lock);
				mid->mid_state = MID_RETRY_NEEDED;
				spin_unlock(&dw->server->mid_queue_lock);
				spin_unlock(&dw->server->srv_lock);
				mid_execute_callback(dw->server, mid);
			} else {
				spin_lock(&dw->server->mid_queue_lock);
				mid->mid_state = MID_REQUEST_SUBMITTED;
				mid->deleted_from_q = false;
				list_add_tail(&mid->qhead,
					&dw->server->pending_mid_q);
				spin_unlock(&dw->server->mid_queue_lock);
				spin_unlock(&dw->server->srv_lock);
			}
		}
		release_mid(dw->server, mid);
	}

free_pages:
	netfs_free_folioq_buffer(dw->buffer);
	cifs_small_buf_release(dw->buf);
	kfree(dw);
}


static int
receive_encrypted_read(struct TCP_Server_Info *server, struct mid_q_entry **mid,
		       int *num_mids)
{
	char *buf = server->smallbuf;
	struct smb2_transform_hdr *tr_hdr = (struct smb2_transform_hdr *)buf;
	struct iov_iter iter;
	unsigned int len;
	unsigned int buflen = server->pdu_size;
	int rc;
	struct smb2_decrypt_work *dw;

	dw = kzalloc_obj(struct smb2_decrypt_work);
	if (!dw)
		return -ENOMEM;
	INIT_WORK(&dw->decrypt, smb2_decrypt_offload);
	dw->server = server;

Annotation

Implementation Notes