Query File System Alignment
In SMB3 it is now possible to query the file system alignment info, and the preferred (for performance) sector size and whether the underlying disk has no seek penalty (like SSD). Query this information at mount time for SMB3, and make it visible in /proc/fs/cifs/DebugData for debugging purposes. This alignment information and preferred sector size info will be helpful for the copy offload patches to setup the right chunks in the CopyChunk requests. Presumably the knowledge that the underlying disk is SSD could also help us make better readahead and writebehind decisions (something to look at in the future). Signed-off-by: Steve French <smfrench@gmail.com>
This commit is contained in:

committed by
Steve French

parent
2167114c6e
commit
af6a12ea8d
@@ -209,6 +209,36 @@ smb2_negotiate_rsize(struct cifs_tcon *tcon, struct smb_vol *volume_info)
|
||||
return rsize;
|
||||
}
|
||||
|
||||
static void
|
||||
smb3_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon)
|
||||
{
|
||||
int rc;
|
||||
__le16 srch_path = 0; /* Null - open root of share */
|
||||
u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
|
||||
struct cifs_open_parms oparms;
|
||||
struct cifs_fid fid;
|
||||
|
||||
oparms.tcon = tcon;
|
||||
oparms.desired_access = FILE_READ_ATTRIBUTES;
|
||||
oparms.disposition = FILE_OPEN;
|
||||
oparms.create_options = 0;
|
||||
oparms.fid = &fid;
|
||||
oparms.reconnect = false;
|
||||
|
||||
rc = SMB2_open(xid, &oparms, &srch_path, &oplock, NULL, NULL);
|
||||
if (rc)
|
||||
return;
|
||||
|
||||
SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid,
|
||||
FS_ATTRIBUTE_INFORMATION);
|
||||
SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid,
|
||||
FS_DEVICE_INFORMATION);
|
||||
SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid,
|
||||
FS_SECTOR_SIZE_INFORMATION); /* SMB3 specific */
|
||||
SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid);
|
||||
return;
|
||||
}
|
||||
|
||||
static void
|
||||
smb2_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon)
|
||||
{
|
||||
@@ -332,7 +362,19 @@ smb2_dump_share_caps(struct seq_file *m, struct cifs_tcon *tcon)
|
||||
seq_puts(m, " ASYMMETRIC,");
|
||||
if (tcon->capabilities == 0)
|
||||
seq_puts(m, " None");
|
||||
if (tcon->ss_flags & SSINFO_FLAGS_ALIGNED_DEVICE)
|
||||
seq_puts(m, " Aligned,");
|
||||
if (tcon->ss_flags & SSINFO_FLAGS_PARTITION_ALIGNED_ON_DEVICE)
|
||||
seq_puts(m, " Partition Aligned,");
|
||||
if (tcon->ss_flags & SSINFO_FLAGS_NO_SEEK_PENALTY)
|
||||
seq_puts(m, " SSD,");
|
||||
if (tcon->ss_flags & SSINFO_FLAGS_TRIM_ENABLED)
|
||||
seq_puts(m, " TRIM-support,");
|
||||
|
||||
seq_printf(m, "\tShare Flags: 0x%x", tcon->share_flags);
|
||||
if (tcon->perf_sector_size)
|
||||
seq_printf(m, "\tOptimal sector size: 0x%x",
|
||||
tcon->perf_sector_size);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1048,7 +1090,7 @@ struct smb_version_operations smb30_operations = {
|
||||
.logoff = SMB2_logoff,
|
||||
.tree_connect = SMB2_tcon,
|
||||
.tree_disconnect = SMB2_tdis,
|
||||
.qfs_tcon = smb2_qfs_tcon,
|
||||
.qfs_tcon = smb3_qfs_tcon,
|
||||
.is_path_accessible = smb2_is_path_accessible,
|
||||
.can_echo = smb2_can_echo,
|
||||
.echo = SMB2_echo,
|
||||
|
Reference in New Issue
Block a user