Skip to content

Commit

Permalink
ksmbd: store fids as opaque u64 integers
Browse files Browse the repository at this point in the history
There is no need to store the fids as le64 integers as they are opaque
to the client and only used for equality.

Signed-off-by: Paulo Alcantara (SUSE) <pc@cjr.nz>
Reviewed-by: Tom Talpey <tom@talpey.com>
Acked-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
  • Loading branch information
Paulo Alcantara authored and Steve French committed Mar 23, 2022
1 parent 351a59d commit 2d004c6
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 72 deletions.
94 changes: 39 additions & 55 deletions fs/ksmbd/smb2pdu.c
Original file line number Diff line number Diff line change
Expand Up @@ -377,12 +377,8 @@ static void init_chained_smb2_rsp(struct ksmbd_work *work)
* command in the compound request
*/
if (req->Command == SMB2_CREATE && rsp->Status == STATUS_SUCCESS) {
work->compound_fid =
le64_to_cpu(((struct smb2_create_rsp *)rsp)->
VolatileFileId);
work->compound_pfid =
le64_to_cpu(((struct smb2_create_rsp *)rsp)->
PersistentFileId);
work->compound_fid = ((struct smb2_create_rsp *)rsp)->VolatileFileId;
work->compound_pfid = ((struct smb2_create_rsp *)rsp)->PersistentFileId;
work->compound_sid = le64_to_cpu(rsp->SessionId);
}

Expand Down Expand Up @@ -2129,7 +2125,7 @@ static noinline int create_smb2_pipe(struct ksmbd_work *work)
rsp->EndofFile = cpu_to_le64(0);
rsp->FileAttributes = FILE_ATTRIBUTE_NORMAL_LE;
rsp->Reserved2 = 0;
rsp->VolatileFileId = cpu_to_le64(id);
rsp->VolatileFileId = id;
rsp->PersistentFileId = 0;
rsp->CreateContextsOffset = 0;
rsp->CreateContextsLength = 0;
Expand Down Expand Up @@ -3157,8 +3153,8 @@ int smb2_open(struct ksmbd_work *work)

rsp->Reserved2 = 0;

rsp->PersistentFileId = cpu_to_le64(fp->persistent_id);
rsp->VolatileFileId = cpu_to_le64(fp->volatile_id);
rsp->PersistentFileId = fp->persistent_id;
rsp->VolatileFileId = fp->volatile_id;

rsp->CreateContextsOffset = 0;
rsp->CreateContextsLength = 0;
Expand Down Expand Up @@ -3865,9 +3861,7 @@ int smb2_query_dir(struct ksmbd_work *work)
goto err_out2;
}

dir_fp = ksmbd_lookup_fd_slow(work,
le64_to_cpu(req->VolatileFileId),
le64_to_cpu(req->PersistentFileId));
dir_fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId);
if (!dir_fp) {
rc = -EBADF;
goto err_out2;
Expand Down Expand Up @@ -4088,12 +4082,12 @@ static int smb2_get_info_file_pipe(struct ksmbd_session *sess,
* Windows can sometime send query file info request on
* pipe without opening it, checking error condition here
*/
id = le64_to_cpu(req->VolatileFileId);
id = req->VolatileFileId;
if (!ksmbd_session_rpc_method(sess, id))
return -ENOENT;

ksmbd_debug(SMB, "FileInfoClass %u, FileId 0x%llx\n",
req->FileInfoClass, le64_to_cpu(req->VolatileFileId));
req->FileInfoClass, req->VolatileFileId);

switch (req->FileInfoClass) {
case FILE_STANDARD_INFORMATION:
Expand Down Expand Up @@ -4738,7 +4732,7 @@ static int smb2_get_info_file(struct ksmbd_work *work,
}

if (work->next_smb2_rcv_hdr_off) {
if (!has_file_id(le64_to_cpu(req->VolatileFileId))) {
if (!has_file_id(req->VolatileFileId)) {
ksmbd_debug(SMB, "Compound request set FID = %llu\n",
work->compound_fid);
id = work->compound_fid;
Expand All @@ -4747,8 +4741,8 @@ static int smb2_get_info_file(struct ksmbd_work *work,
}

if (!has_file_id(id)) {
id = le64_to_cpu(req->VolatileFileId);
pid = le64_to_cpu(req->PersistentFileId);
id = req->VolatileFileId;
pid = req->PersistentFileId;
}

fp = ksmbd_lookup_fd_slow(work, id, pid);
Expand Down Expand Up @@ -5113,7 +5107,7 @@ static int smb2_get_info_sec(struct ksmbd_work *work,
}

if (work->next_smb2_rcv_hdr_off) {
if (!has_file_id(le64_to_cpu(req->VolatileFileId))) {
if (!has_file_id(req->VolatileFileId)) {
ksmbd_debug(SMB, "Compound request set FID = %llu\n",
work->compound_fid);
id = work->compound_fid;
Expand All @@ -5122,8 +5116,8 @@ static int smb2_get_info_sec(struct ksmbd_work *work,
}

if (!has_file_id(id)) {
id = le64_to_cpu(req->VolatileFileId);
pid = le64_to_cpu(req->PersistentFileId);
id = req->VolatileFileId;
pid = req->PersistentFileId;
}

fp = ksmbd_lookup_fd_slow(work, id, pid);
Expand Down Expand Up @@ -5221,7 +5215,7 @@ static noinline int smb2_close_pipe(struct ksmbd_work *work)
struct smb2_close_req *req = smb2_get_msg(work->request_buf);
struct smb2_close_rsp *rsp = smb2_get_msg(work->response_buf);

id = le64_to_cpu(req->VolatileFileId);
id = req->VolatileFileId;
ksmbd_session_rpc_close(work->sess, id);

rsp->StructureSize = cpu_to_le16(60);
Expand Down Expand Up @@ -5280,7 +5274,7 @@ int smb2_close(struct ksmbd_work *work)
}

if (work->next_smb2_rcv_hdr_off &&
!has_file_id(le64_to_cpu(req->VolatileFileId))) {
!has_file_id(req->VolatileFileId)) {
if (!has_file_id(work->compound_fid)) {
/* file already closed, return FILE_CLOSED */
ksmbd_debug(SMB, "file already closed\n");
Expand All @@ -5299,7 +5293,7 @@ int smb2_close(struct ksmbd_work *work)
work->compound_pfid = KSMBD_NO_FID;
}
} else {
volatile_id = le64_to_cpu(req->VolatileFileId);
volatile_id = req->VolatileFileId;
}
ksmbd_debug(SMB, "volatile_id = %llu\n", volatile_id);

Expand Down Expand Up @@ -5988,7 +5982,7 @@ int smb2_set_info(struct ksmbd_work *work)
if (work->next_smb2_rcv_hdr_off) {
req = ksmbd_req_buf_next(work);
rsp = ksmbd_resp_buf_next(work);
if (!has_file_id(le64_to_cpu(req->VolatileFileId))) {
if (!has_file_id(req->VolatileFileId)) {
ksmbd_debug(SMB, "Compound request set FID = %llu\n",
work->compound_fid);
id = work->compound_fid;
Expand All @@ -6000,8 +5994,8 @@ int smb2_set_info(struct ksmbd_work *work)
}

if (!has_file_id(id)) {
id = le64_to_cpu(req->VolatileFileId);
pid = le64_to_cpu(req->PersistentFileId);
id = req->VolatileFileId;
pid = req->PersistentFileId;
}

fp = ksmbd_lookup_fd_slow(work, id, pid);
Expand Down Expand Up @@ -6079,7 +6073,7 @@ static noinline int smb2_read_pipe(struct ksmbd_work *work)
struct smb2_read_req *req = smb2_get_msg(work->request_buf);
struct smb2_read_rsp *rsp = smb2_get_msg(work->response_buf);

id = le64_to_cpu(req->VolatileFileId);
id = req->VolatileFileId;

inc_rfc1001_len(work->response_buf, 16);
rpc_resp = ksmbd_rpc_read(work->sess, id);
Expand Down Expand Up @@ -6215,8 +6209,7 @@ int smb2_read(struct ksmbd_work *work)
goto out;
}

fp = ksmbd_lookup_fd_slow(work, le64_to_cpu(req->VolatileFileId),
le64_to_cpu(req->PersistentFileId));
fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId);
if (!fp) {
err = -ENOENT;
goto out;
Expand Down Expand Up @@ -6335,7 +6328,7 @@ static noinline int smb2_write_pipe(struct ksmbd_work *work)
size_t length;

length = le32_to_cpu(req->Length);
id = le64_to_cpu(req->VolatileFileId);
id = req->VolatileFileId;

if (le16_to_cpu(req->DataOffset) ==
offsetof(struct smb2_write_req, Buffer)) {
Expand Down Expand Up @@ -6471,8 +6464,7 @@ int smb2_write(struct ksmbd_work *work)
goto out;
}

fp = ksmbd_lookup_fd_slow(work, le64_to_cpu(req->VolatileFileId),
le64_to_cpu(req->PersistentFileId));
fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId);
if (!fp) {
err = -ENOENT;
goto out;
Expand Down Expand Up @@ -6584,12 +6576,9 @@ int smb2_flush(struct ksmbd_work *work)

WORK_BUFFERS(work, req, rsp);

ksmbd_debug(SMB, "SMB2_FLUSH called for fid %llu\n",
le64_to_cpu(req->VolatileFileId));
ksmbd_debug(SMB, "SMB2_FLUSH called for fid %llu\n", req->VolatileFileId);

err = ksmbd_vfs_fsync(work,
le64_to_cpu(req->VolatileFileId),
le64_to_cpu(req->PersistentFileId));
err = ksmbd_vfs_fsync(work, req->VolatileFileId, req->PersistentFileId);
if (err)
goto out;

Expand Down Expand Up @@ -6804,12 +6793,9 @@ int smb2_lock(struct ksmbd_work *work)
int prior_lock = 0;

ksmbd_debug(SMB, "Received lock request\n");
fp = ksmbd_lookup_fd_slow(work,
le64_to_cpu(req->VolatileFileId),
le64_to_cpu(req->PersistentFileId));
fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId);
if (!fp) {
ksmbd_debug(SMB, "Invalid file id for lock : %llu\n",
le64_to_cpu(req->VolatileFileId));
ksmbd_debug(SMB, "Invalid file id for lock : %llu\n", req->VolatileFileId);
err = -ENOENT;
goto out2;
}
Expand Down Expand Up @@ -7164,8 +7150,8 @@ static int fsctl_copychunk(struct ksmbd_work *work,

ci_rsp = (struct copychunk_ioctl_rsp *)&rsp->Buffer[0];

rsp->VolatileFileId = cpu_to_le64(volatile_id);
rsp->PersistentFileId = cpu_to_le64(persistent_id);
rsp->VolatileFileId = volatile_id;
rsp->PersistentFileId = persistent_id;
ci_rsp->ChunksWritten =
cpu_to_le32(ksmbd_server_side_copy_max_chunk_count());
ci_rsp->ChunkBytesWritten =
Expand Down Expand Up @@ -7379,8 +7365,8 @@ static int fsctl_query_iface_info_ioctl(struct ksmbd_conn *conn,
if (nii_rsp)
nii_rsp->Next = 0;

rsp->PersistentFileId = cpu_to_le64(SMB2_NO_FID);
rsp->VolatileFileId = cpu_to_le64(SMB2_NO_FID);
rsp->PersistentFileId = SMB2_NO_FID;
rsp->VolatileFileId = SMB2_NO_FID;
return nbytes;
}

Expand Down Expand Up @@ -7547,9 +7533,7 @@ static int fsctl_request_resume_key(struct ksmbd_work *work,
{
struct ksmbd_file *fp;

fp = ksmbd_lookup_fd_slow(work,
le64_to_cpu(req->VolatileFileId),
le64_to_cpu(req->PersistentFileId));
fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId);
if (!fp)
return -ENOENT;

Expand Down Expand Up @@ -7579,7 +7563,7 @@ int smb2_ioctl(struct ksmbd_work *work)
if (work->next_smb2_rcv_hdr_off) {
req = ksmbd_req_buf_next(work);
rsp = ksmbd_resp_buf_next(work);
if (!has_file_id(le64_to_cpu(req->VolatileFileId))) {
if (!has_file_id(req->VolatileFileId)) {
ksmbd_debug(SMB, "Compound request set FID = %llu\n",
work->compound_fid);
id = work->compound_fid;
Expand All @@ -7590,7 +7574,7 @@ int smb2_ioctl(struct ksmbd_work *work)
}

if (!has_file_id(id))
id = le64_to_cpu(req->VolatileFileId);
id = req->VolatileFileId;

if (req->Flags != cpu_to_le32(SMB2_0_IOCTL_IS_FSCTL)) {
rsp->hdr.Status = STATUS_NOT_SUPPORTED;
Expand Down Expand Up @@ -7656,8 +7640,8 @@ int smb2_ioctl(struct ksmbd_work *work)
goto out;

nbytes = sizeof(struct validate_negotiate_info_rsp);
rsp->PersistentFileId = cpu_to_le64(SMB2_NO_FID);
rsp->VolatileFileId = cpu_to_le64(SMB2_NO_FID);
rsp->PersistentFileId = SMB2_NO_FID;
rsp->VolatileFileId = SMB2_NO_FID;
break;
case FSCTL_QUERY_NETWORK_INTERFACE_INFO:
ret = fsctl_query_iface_info_ioctl(conn, rsp, out_buf_len);
Expand Down Expand Up @@ -7705,8 +7689,8 @@ int smb2_ioctl(struct ksmbd_work *work)
(struct copychunk_ioctl_req *)&req->Buffer[0],
le32_to_cpu(req->CntCode),
le32_to_cpu(req->InputCount),
le64_to_cpu(req->VolatileFileId),
le64_to_cpu(req->PersistentFileId),
req->VolatileFileId,
req->PersistentFileId,
rsp);
break;
case FSCTL_SET_SPARSE:
Expand Down
34 changes: 17 additions & 17 deletions fs/ksmbd/smb2pdu.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,8 +116,8 @@ struct create_durable_reconn_req {
union {
__u8 Reserved[16];
struct {
__le64 PersistentFileId;
__le64 VolatileFileId;
__u64 PersistentFileId;
__u64 VolatileFileId;
} Fid;
} Data;
} __packed;
Expand All @@ -126,8 +126,8 @@ struct create_durable_reconn_v2_req {
struct create_context ccontext;
__u8 Name[8];
struct {
__le64 PersistentFileId;
__le64 VolatileFileId;
__u64 PersistentFileId;
__u64 VolatileFileId;
} Fid;
__u8 CreateGuid[16];
__le32 Flags;
Expand Down Expand Up @@ -269,8 +269,8 @@ struct smb2_ioctl_req {
__le16 StructureSize; /* Must be 57 */
__le16 Reserved; /* offset from start of SMB2 header to write data */
__le32 CntCode;
__le64 PersistentFileId;
__le64 VolatileFileId;
__u64 PersistentFileId;
__u64 VolatileFileId;
__le32 InputOffset; /* Reserved MBZ */
__le32 InputCount;
__le32 MaxInputResponse;
Expand All @@ -287,8 +287,8 @@ struct smb2_ioctl_rsp {
__le16 StructureSize; /* Must be 49 */
__le16 Reserved; /* offset from start of SMB2 header to write data */
__le32 CntCode;
__le64 PersistentFileId;
__le64 VolatileFileId;
__u64 PersistentFileId;
__u64 VolatileFileId;
__le32 InputOffset; /* Reserved MBZ */
__le32 InputCount;
__le32 OutputOffset;
Expand Down Expand Up @@ -357,7 +357,7 @@ struct file_object_buf_type1_ioctl_rsp {
} __packed;

struct resume_key_ioctl_rsp {
__le64 ResumeKey[3];
__u64 ResumeKey[3];
__le32 ContextLength;
__u8 Context[4]; /* ignored, Windows sets to 4 bytes of zero */
} __packed;
Expand Down Expand Up @@ -432,8 +432,8 @@ struct smb2_lock_req {
__le16 StructureSize; /* Must be 48 */
__le16 LockCount;
__le32 Reserved;
__le64 PersistentFileId;
__le64 VolatileFileId;
__u64 PersistentFileId;
__u64 VolatileFileId;
/* Followed by at least one */
struct smb2_lock_element locks[1];
} __packed;
Expand Down Expand Up @@ -468,8 +468,8 @@ struct smb2_query_directory_req {
__u8 FileInformationClass;
__u8 Flags;
__le32 FileIndex;
__le64 PersistentFileId;
__le64 VolatileFileId;
__u64 PersistentFileId;
__u64 VolatileFileId;
__le16 FileNameOffset;
__le16 FileNameLength;
__le32 OutputBufferLength;
Expand Down Expand Up @@ -515,8 +515,8 @@ struct smb2_query_info_req {
__le32 InputBufferLength;
__le32 AdditionalInformation;
__le32 Flags;
__le64 PersistentFileId;
__le64 VolatileFileId;
__u64 PersistentFileId;
__u64 VolatileFileId;
__u8 Buffer[1];
} __packed;

Expand All @@ -537,8 +537,8 @@ struct smb2_set_info_req {
__le16 BufferOffset;
__u16 Reserved;
__le32 AdditionalInformation;
__le64 PersistentFileId;
__le64 VolatileFileId;
__u64 PersistentFileId;
__u64 VolatileFileId;
__u8 Buffer[1];
} __packed;

Expand Down

0 comments on commit 2d004c6

Please sign in to comment.