aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cifs/smb2pdu.c
diff options
context:
space:
mode:
authorSteve French <smfrench@gmail.com>2013-10-09 03:07:00 -0400
committerSteve French <smfrench@gmail.com>2013-10-28 10:22:55 -0400
commit34f626406c09dd45878ce75170abab342985ec24 (patch)
tree6904e8c808392920874febebf28129e6d1a1b974 /fs/cifs/smb2pdu.c
parent64a5cfa6db94c5abba2cafe77aca077dd1e3283b (diff)
Query file system attributes from server on SMB2, not just cifs, mounts
Currently SMB2 and SMB3 mounts do not query the file system attributes from the server at mount time as is done for cifs. These can be useful for debugging. Signed-off-by: Steve French <smfrench@gmail.com>
Diffstat (limited to 'fs/cifs/smb2pdu.c')
-rw-r--r--fs/cifs/smb2pdu.c42
1 files changed, 40 insertions, 2 deletions
diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
index bbafa12e83b2..df12cf8bd979 100644
--- a/fs/cifs/smb2pdu.c
+++ b/fs/cifs/smb2pdu.c
@@ -2339,7 +2339,7 @@ SMB2_QFS_info(const unsigned int xid, struct cifs_tcon *tcon,
2339 rc = SendReceive2(xid, ses, &iov, 1, &resp_buftype, 0); 2339 rc = SendReceive2(xid, ses, &iov, 1, &resp_buftype, 0);
2340 if (rc) { 2340 if (rc) {
2341 cifs_stats_fail_inc(tcon, SMB2_QUERY_INFO_HE); 2341 cifs_stats_fail_inc(tcon, SMB2_QUERY_INFO_HE);
2342 goto qinf_exit; 2342 goto qfsinf_exit;
2343 } 2343 }
2344 rsp = (struct smb2_query_info_rsp *)iov.iov_base; 2344 rsp = (struct smb2_query_info_rsp *)iov.iov_base;
2345 2345
@@ -2351,7 +2351,45 @@ SMB2_QFS_info(const unsigned int xid, struct cifs_tcon *tcon,
2351 if (!rc) 2351 if (!rc)
2352 copy_fs_info_to_kstatfs(info, fsdata); 2352 copy_fs_info_to_kstatfs(info, fsdata);
2353 2353
2354qinf_exit: 2354qfsinf_exit:
2355 free_rsp_buf(resp_buftype, iov.iov_base);
2356 return rc;
2357}
2358
2359int
2360SMB2_QFS_attr(const unsigned int xid, struct cifs_tcon *tcon,
2361 u64 persistent_fid, u64 volatile_fid)
2362{
2363 struct smb2_query_info_rsp *rsp = NULL;
2364 struct kvec iov;
2365 int rc = 0;
2366 int resp_buftype;
2367 struct cifs_ses *ses = tcon->ses;
2368 unsigned int rsp_len, offset;
2369
2370 rc = build_qfs_info_req(&iov, tcon, SMB_QUERY_FS_ATTRIBUTE_INFO,
2371 sizeof(FILE_SYSTEM_ATTRIBUTE_INFO),
2372 persistent_fid, volatile_fid);
2373 if (rc)
2374 return rc;
2375
2376 rc = SendReceive2(xid, ses, &iov, 1, &resp_buftype, 0);
2377 if (rc) {
2378 cifs_stats_fail_inc(tcon, SMB2_QUERY_INFO_HE);
2379 goto qfsattr_exit;
2380 }
2381 rsp = (struct smb2_query_info_rsp *)iov.iov_base;
2382
2383 rsp_len = le32_to_cpu(rsp->OutputBufferLength);
2384 offset = le16_to_cpu(rsp->OutputBufferOffset);
2385 rc = validate_buf(offset, rsp_len, &rsp->hdr, MIN_FS_ATTR_INFO_SIZE);
2386 if (!rc) {
2387 memcpy(&tcon->fsAttrInfo, 4 /* RFC1001 len */ + offset
2388 + (char *)&rsp->hdr, min_t(unsigned int,
2389 rsp_len, sizeof(FILE_SYSTEM_ATTRIBUTE_INFO)));
2390 }
2391
2392qfsattr_exit:
2355 free_rsp_buf(resp_buftype, iov.iov_base); 2393 free_rsp_buf(resp_buftype, iov.iov_base);
2356 return rc; 2394 return rc;
2357} 2395}