s4/ntvfs: support FS_SECTOR_SIZE_INFORMATION query-info
authorDavid Disseldorp <ddiss@samba.org>
Fri, 13 Mar 2015 00:00:51 +0000 (01:00 +0100)
committerJeremy Allison <jra@samba.org>
Wed, 18 Mar 2015 17:57:21 +0000 (18:57 +0100)
Return the same values as used by s3fs.

Signed-off-by: David Disseldorp <ddiss@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source4/libcli/raw/rawfsinfo.c
source4/ntvfs/ntvfs_generic.c
source4/ntvfs/posix/pvfs_fsinfo.c
source4/smb_server/blob.c

index 9c03e1446630a450ce839b7f2db8cf6e03e8c758..bf149ee252edeeec8e42f31bc4e7f23b81639903 100644 (file)
@@ -226,6 +226,23 @@ NTSTATUS smb_raw_fsinfo_passthru_parse(DATA_BLOB blob, TALLOC_CTX *mem_ctx,
                        fsinfo->objectid_information.out.unknown[i] = BVAL(blob.data, 16 + i*8);
                }
                break;
+
+       case RAW_QFS_SECTOR_SIZE_INFORMATION:
+               QFS_CHECK_SIZE(28);
+               fsinfo->sector_size_info.out.logical_bytes_per_sector
+                                                       = IVAL(blob.data,  0);
+               fsinfo->sector_size_info.out.phys_bytes_per_sector_atomic
+                                                       = IVAL(blob.data,  4);
+               fsinfo->sector_size_info.out.phys_bytes_per_sector_perf
+                                                       = IVAL(blob.data,  8);
+               fsinfo->sector_size_info.out.fs_effective_phys_bytes_per_sector_atomic
+                                                       = IVAL(blob.data, 12);
+               fsinfo->sector_size_info.out.flags      = IVAL(blob.data, 16);
+               fsinfo->sector_size_info.out.byte_off_sector_align
+                                                       = IVAL(blob.data, 20);
+               fsinfo->sector_size_info.out.byte_off_partition_align
+                                                       = IVAL(blob.data, 24);
+               break;
        }
                
        default:
@@ -319,6 +336,10 @@ NTSTATUS smb_raw_fsinfo_recv(struct smbcli_request *req,
        case RAW_QFS_OBJECTID_INFORMATION:
                return smb_raw_fsinfo_passthru_parse(blob, mem_ctx, 
                                                     RAW_QFS_OBJECTID_INFORMATION, fsinfo);
+
+       case RAW_QFS_SECTOR_SIZE_INFORMATION:
+               return smb_raw_fsinfo_passthru_parse(blob, mem_ctx,
+                               RAW_QFS_SECTOR_SIZE_INFORMATION, fsinfo);
        }
 
 failed:
index d3f79196890c63ccc644c923254a88a0e5fb363d..4edc31c22cc8efde4a1292f19840a9b2803bcc11 100644 (file)
@@ -664,6 +664,22 @@ static NTSTATUS ntvfs_map_fsinfo_finish(struct ntvfs_module_context *ntvfs,
                ZERO_STRUCT(fs->objectid_information.out.unknown);
                return NT_STATUS_OK;
 
+       case RAW_QFS_SECTOR_SIZE_INFORMATION:
+               fs->sector_size_info.out.logical_bytes_per_sector
+                                               = fs2->generic.out.block_size;
+               fs->sector_size_info.out.phys_bytes_per_sector_atomic
+                                               = fs2->generic.out.block_size;
+               fs->sector_size_info.out.phys_bytes_per_sector_perf
+                                               = fs2->generic.out.block_size;
+               fs->sector_size_info.out.fs_effective_phys_bytes_per_sector_atomic
+                                               = fs2->generic.out.block_size;
+               fs->sector_size_info.out.flags
+                                       = QFS_SSINFO_FLAGS_ALIGNED_DEVICE
+                               | QFS_SSINFO_FLAGS_PARTITION_ALIGNED_ON_DEVICE;
+               fs->sector_size_info.out.byte_off_sector_align = 0;
+               fs->sector_size_info.out.byte_off_partition_align = 0;
+               return NT_STATUS_OK;
+
        case RAW_QFS_GENERIC:
        case RAW_QFS_UNIX_INFO:
                return NT_STATUS_INVALID_LEVEL;
index 210433baef526642e1c94841c07cf7f1f60bc7b3..35256fe69d1c38edb92c02ed209be9e187b0147f 100644 (file)
@@ -201,6 +201,21 @@ NTSTATUS pvfs_fsinfo(struct ntvfs_module_context *ntvfs,
                fs->objectid_information.out.guid = *pvfs->base_fs_uuid;
                return NT_STATUS_OK;
 
+       case RAW_QFS_SECTOR_SIZE_INFORMATION:
+               fs->sector_size_info.out.logical_bytes_per_sector = block_size;
+               fs->sector_size_info.out.phys_bytes_per_sector_atomic
+                                                               = block_size;
+               fs->sector_size_info.out.phys_bytes_per_sector_perf
+                                                               = block_size;
+               fs->sector_size_info.out.fs_effective_phys_bytes_per_sector_atomic
+                                                               = block_size;
+               fs->sector_size_info.out.flags
+                                       = QFS_SSINFO_FLAGS_ALIGNED_DEVICE
+                               | QFS_SSINFO_FLAGS_PARTITION_ALIGNED_ON_DEVICE;
+               fs->sector_size_info.out.byte_off_sector_align = 0;
+               fs->sector_size_info.out.byte_off_partition_align = 0;
+               return NT_STATUS_OK;
+
        default:
                break;
        }
index a3e11239b1a53233669e7cebe6ecdcad5bd663d1..24893299a903c701ce56267ab1558bf11610ff66 100644 (file)
@@ -292,6 +292,26 @@ NTSTATUS smbsrv_push_passthru_fsinfo(TALLOC_CTX *mem_ctx,
 
                return NT_STATUS_OK;
        }
+
+       case RAW_QFS_SECTOR_SIZE_INFORMATION:
+               BLOB_CHECK(smbsrv_blob_grow_data(mem_ctx, blob, 28));
+               SIVAL(blob->data,  0,
+                     fsinfo->sector_size_info.out.logical_bytes_per_sector);
+               SIVAL(blob->data,  4,
+                    fsinfo->sector_size_info.out.phys_bytes_per_sector_atomic);
+               SIVAL(blob->data,  8,
+                     fsinfo->sector_size_info.out.phys_bytes_per_sector_perf);
+               SIVAL(blob->data, 12,
+                     fsinfo->sector_size_info.out.fs_effective_phys_bytes_per_sector_atomic);
+               SIVAL(blob->data, 16,
+                     fsinfo->sector_size_info.out.flags);
+               SIVAL(blob->data, 20,
+                     fsinfo->sector_size_info.out.byte_off_sector_align);
+               SIVAL(blob->data, 24,
+                     fsinfo->sector_size_info.out.byte_off_partition_align);
+
+               return NT_STATUS_OK;
+
        default:
                return NT_STATUS_INVALID_LEVEL;
        }