[PATCH 2/4] ksmbd: set SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY in tree connect
Yunseong Kim <[email protected]>
| Newsgroups | org.kernel.vger.linux-kernel,org.kernel.vger.linux-cifs |
|---|---|
| Message-ID | <[email protected]> |
Set the SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY capability in the tree connect response for shares configured with the 'continuous availability' option (KSMBD_SHARE_FLAG_CONTINUOUS_AVAILABILITY). This capability is only advertised when persistent handles are also enabled globally (SMB2_GLOBAL_CAP_PERSISTENT_HANDLES). It informs clients that the share supports persistent handles, allowing them to request SMB2_DHANDLE_FLAG_PERSISTENT in DH2Q create contexts. Signed-off-by: Yunseong Kim <[email protected]> --- fs/smb/server/smb2pdu.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c index bd74b45ce0e7..b4bf36fb7183 100644 --- a/fs/smb/server/smb2pdu.c +++ b/fs/smb/server/smb2pdu.c @@ -2858,10 +2858,15 @@ int smb2_tree_connect(struct ksmbd_work *work) rsp->StructureSize = cpu_to_le16(16); out_err1: /* - * A configured CA share is not continuously available until persistent - * open recovery, ownership fencing, and failover are implemented. + * Advertise Continuous Availability on shares configured with + * the CA flag, when persistent handles are enabled globally. */ - rsp->Capabilities = 0; + if (share && test_share_config_flag(share, + KSMBD_SHARE_FLAG_CONTINUOUS_AVAILABILITY) && + conn->vals->req_capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES) + rsp->Capabilities = cpu_to_le32(SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY); + else + rsp->Capabilities = 0; rsp->Reserved = 0; /* default manual caching */ rsp->ShareFlags = SMB2_SHAREFLAG_MANUAL_CACHING; -- 2.47.3