diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/cifs/smb2ops.c | 5 | ||||
-rw-r--r-- | fs/cifs/smb2pdu.c | 31 | ||||
-rw-r--r-- | fs/cifs/smb2proto.h | 2 |
3 files changed, 28 insertions, 10 deletions
diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c index a53e2053ae9d..79084d67f3fb 100644 --- a/fs/cifs/smb2ops.c +++ b/fs/cifs/smb2ops.c | |||
@@ -229,7 +229,10 @@ smb2_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon) | |||
229 | if (rc) | 229 | if (rc) |
230 | return; | 230 | return; |
231 | 231 | ||
232 | SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid); | 232 | SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid, |
233 | FS_ATTRIBUTE_INFORMATION); | ||
234 | SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid, | ||
235 | FS_DEVICE_INFORMATION); | ||
233 | SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); | 236 | SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); |
234 | return; | 237 | return; |
235 | } | 238 | } |
diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c index df12cf8bd979..7887cf50e5fb 100644 --- a/fs/cifs/smb2pdu.c +++ b/fs/cifs/smb2pdu.c | |||
@@ -2358,17 +2358,27 @@ qfsinf_exit: | |||
2358 | 2358 | ||
2359 | int | 2359 | int |
2360 | SMB2_QFS_attr(const unsigned int xid, struct cifs_tcon *tcon, | 2360 | SMB2_QFS_attr(const unsigned int xid, struct cifs_tcon *tcon, |
2361 | u64 persistent_fid, u64 volatile_fid) | 2361 | u64 persistent_fid, u64 volatile_fid, int level) |
2362 | { | 2362 | { |
2363 | struct smb2_query_info_rsp *rsp = NULL; | 2363 | struct smb2_query_info_rsp *rsp = NULL; |
2364 | struct kvec iov; | 2364 | struct kvec iov; |
2365 | int rc = 0; | 2365 | int rc = 0; |
2366 | int resp_buftype; | 2366 | int resp_buftype, max_len, min_len; |
2367 | struct cifs_ses *ses = tcon->ses; | 2367 | struct cifs_ses *ses = tcon->ses; |
2368 | unsigned int rsp_len, offset; | 2368 | unsigned int rsp_len, offset; |
2369 | 2369 | ||
2370 | rc = build_qfs_info_req(&iov, tcon, SMB_QUERY_FS_ATTRIBUTE_INFO, | 2370 | if (level == FS_DEVICE_INFORMATION) { |
2371 | sizeof(FILE_SYSTEM_ATTRIBUTE_INFO), | 2371 | max_len = sizeof(FILE_SYSTEM_DEVICE_INFO); |
2372 | min_len = sizeof(FILE_SYSTEM_DEVICE_INFO); | ||
2373 | } else if (level == FS_ATTRIBUTE_INFORMATION) { | ||
2374 | max_len = sizeof(FILE_SYSTEM_ATTRIBUTE_INFO); | ||
2375 | min_len = MIN_FS_ATTR_INFO_SIZE; | ||
2376 | } else { | ||
2377 | cifs_dbg(FYI, "Invalid qfsinfo level %d", level); | ||
2378 | return -EINVAL; | ||
2379 | } | ||
2380 | |||
2381 | rc = build_qfs_info_req(&iov, tcon, level, max_len, | ||
2372 | persistent_fid, volatile_fid); | 2382 | persistent_fid, volatile_fid); |
2373 | if (rc) | 2383 | if (rc) |
2374 | return rc; | 2384 | return rc; |
@@ -2382,12 +2392,17 @@ SMB2_QFS_attr(const unsigned int xid, struct cifs_tcon *tcon, | |||
2382 | 2392 | ||
2383 | rsp_len = le32_to_cpu(rsp->OutputBufferLength); | 2393 | rsp_len = le32_to_cpu(rsp->OutputBufferLength); |
2384 | offset = le16_to_cpu(rsp->OutputBufferOffset); | 2394 | offset = le16_to_cpu(rsp->OutputBufferOffset); |
2385 | rc = validate_buf(offset, rsp_len, &rsp->hdr, MIN_FS_ATTR_INFO_SIZE); | 2395 | rc = validate_buf(offset, rsp_len, &rsp->hdr, min_len); |
2386 | if (!rc) { | 2396 | if (rc) |
2397 | goto qfsattr_exit; | ||
2398 | |||
2399 | if (level == FS_ATTRIBUTE_INFORMATION) | ||
2387 | memcpy(&tcon->fsAttrInfo, 4 /* RFC1001 len */ + offset | 2400 | memcpy(&tcon->fsAttrInfo, 4 /* RFC1001 len */ + offset |
2388 | + (char *)&rsp->hdr, min_t(unsigned int, | 2401 | + (char *)&rsp->hdr, min_t(unsigned int, |
2389 | rsp_len, sizeof(FILE_SYSTEM_ATTRIBUTE_INFO))); | 2402 | rsp_len, max_len)); |
2390 | } | 2403 | else if (level == FS_DEVICE_INFORMATION) |
2404 | memcpy(&tcon->fsDevInfo, 4 /* RFC1001 len */ + offset | ||
2405 | + (char *)&rsp->hdr, sizeof(FILE_SYSTEM_DEVICE_INFO)); | ||
2391 | 2406 | ||
2392 | qfsattr_exit: | 2407 | qfsattr_exit: |
2393 | free_rsp_buf(resp_buftype, iov.iov_base); | 2408 | free_rsp_buf(resp_buftype, iov.iov_base); |
diff --git a/fs/cifs/smb2proto.h b/fs/cifs/smb2proto.h index 68dc00d5fb12..313813e4c19b 100644 --- a/fs/cifs/smb2proto.h +++ b/fs/cifs/smb2proto.h | |||
@@ -151,7 +151,7 @@ extern int SMB2_QFS_info(const unsigned int xid, struct cifs_tcon *tcon, | |||
151 | u64 persistent_file_id, u64 volatile_file_id, | 151 | u64 persistent_file_id, u64 volatile_file_id, |
152 | struct kstatfs *FSData); | 152 | struct kstatfs *FSData); |
153 | extern int SMB2_QFS_attr(const unsigned int xid, struct cifs_tcon *tcon, | 153 | extern int SMB2_QFS_attr(const unsigned int xid, struct cifs_tcon *tcon, |
154 | u64 persistent_file_id, u64 volatile_file_id); | 154 | u64 persistent_file_id, u64 volatile_file_id, int lvl); |
155 | extern int SMB2_lock(const unsigned int xid, struct cifs_tcon *tcon, | 155 | extern int SMB2_lock(const unsigned int xid, struct cifs_tcon *tcon, |
156 | const __u64 persist_fid, const __u64 volatile_fid, | 156 | const __u64 persist_fid, const __u64 volatile_fid, |
157 | const __u32 pid, const __u64 length, const __u64 offset, | 157 | const __u32 pid, const __u64 length, const __u64 offset, |