diff options
author | Jeremy Allison <jra@samba.org> | 2014-06-04 14:53:01 -0700 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2014-06-07 05:41:44 +0200 |
commit | 9c6f1a589ff56928b077904430086062e82b0acb (patch) | |
tree | 89d3fed3e9bc312a5d80a958cf0be73cb60d6419 | |
parent | d0a7d7e87ece03a63840b0f143502075d6fa5527 (diff) | |
download | samba-9c6f1a589ff56928b077904430086062e82b0acb.tar.gz samba-9c6f1a589ff56928b077904430086062e82b0acb.tar.xz samba-9c6f1a589ff56928b077904430086062e82b0acb.zip |
s3: libsmb: Change cli_disk_size() to use the trans2/SMB_FS_FULL_SIZE_INFORMATION call in preference to the old SMB1 call.
Fallback to the old CORE protocol SMBdskattr if
trans2/SMB_FS_FULL_SIZE_INFORMATION is not supported.
Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Volker Lendecke <Volker.Lendecke@SerNet.DE>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Sat Jun 7 05:41:44 CEST 2014 on sn-devel-104
-rw-r--r-- | source3/libsmb/clifile.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c index 18ed5297b71..1c527303e66 100644 --- a/source3/libsmb/clifile.c +++ b/source3/libsmb/clifile.c @@ -4130,6 +4130,8 @@ NTSTATUS cli_dskattr(struct cli_state *cli, int *bsize, int *total, int *avail) NTSTATUS cli_disk_size(struct cli_state *cli, uint64_t *bsize, uint64_t *total, uint64_t *avail) { + uint64_t sectors_per_block; + uint64_t bytes_per_sector; int old_bsize, old_total, old_avail; NTSTATUS status; @@ -4137,6 +4139,49 @@ NTSTATUS cli_disk_size(struct cli_state *cli, uint64_t *bsize, uint64_t *total, return cli_smb2_dskattr(cli, bsize, total, avail); } + /* + * Try the trans2 disk full size info call first. + * We already use this in SMBC_fstatvfs_ctx(). + * Ignore 'actual_available_units' as we only + * care about the quota for the caller. + */ + + status = cli_get_fs_full_size_info(cli, + total, + avail, + NULL, + §ors_per_block, + &bytes_per_sector); + + /* Try and cope will all varients of "we don't do this call" + and fall back to cli_dskattr. */ + + if (NT_STATUS_EQUAL(status,NT_STATUS_NOT_IMPLEMENTED) || + NT_STATUS_EQUAL(status,NT_STATUS_NOT_SUPPORTED) || + NT_STATUS_EQUAL(status,NT_STATUS_INVALID_INFO_CLASS) || + NT_STATUS_EQUAL(status,NT_STATUS_PROCEDURE_NOT_FOUND) || + NT_STATUS_EQUAL(status,NT_STATUS_INVALID_LEVEL) || + NT_STATUS_EQUAL(status,NT_STATUS_INVALID_PARAMETER) || + NT_STATUS_EQUAL(status,NT_STATUS_INVALID_DEVICE_REQUEST) || + NT_STATUS_EQUAL(status,NT_STATUS_INVALID_DEVICE_STATE) || + NT_STATUS_EQUAL(status,NT_STATUS_CTL_FILE_NOT_SUPPORTED) || + NT_STATUS_EQUAL(status,NT_STATUS_UNSUCCESSFUL)) { + goto try_dskattr; + } + + if (!NT_STATUS_IS_OK(status)) { + return status; + } + + if (bsize) { + *bsize = sectors_per_block * + bytes_per_sector; + } + + return NT_STATUS_OK; + + try_dskattr: + /* Old SMB1 core protocol fallback. */ status = cli_dskattr(cli, &old_bsize, &old_total, &old_avail); if (!NT_STATUS_IS_OK(status)) { |