From patchwork Wed Oct 9 18:44:04 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve French X-Patchwork-Id: 3011221 Return-Path: X-Original-To: patchwork-cifs-client@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 612619F1E1 for ; Wed, 9 Oct 2013 18:44:16 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 837E3202C7 for ; Wed, 9 Oct 2013 18:44:15 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6BD5F202BE for ; Wed, 9 Oct 2013 18:44:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754836Ab3JISoG (ORCPT ); Wed, 9 Oct 2013 14:44:06 -0400 Received: from mail-pa0-f52.google.com ([209.85.220.52]:52242 "EHLO mail-pa0-f52.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754764Ab3JISoF (ORCPT ); Wed, 9 Oct 2013 14:44:05 -0400 Received: by mail-pa0-f52.google.com with SMTP id kl14so1488862pab.11 for ; Wed, 09 Oct 2013 11:44:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=MUOlLsWrBmejkk+hw95ffo6pqHdjSPNc1HL6ThghNRo=; b=JvdSZ1GXx19G+Ej6/C7K0nMjquYc/kjIT6ByC90JEmYpmX9HYCYte7/Ot0kNM3DZXs nveiIGB0ivR8vAyGbt+WMWUAgpj/TQ90J9poCETOCOehHJlb9AAww3j7tSoWWpfvkSBO Dx9jBcttQgCqGGVY+wsEu1OzHqrMB5fK9OxKqVaQMt8LJm3cKMA/08Tdfck3rXVheIko 2SA/fnByIcQbD65lEWnSHCbWIFmQA5cV3GFhvh0zhv9nbl7bbQyFGQYHkU4/NyAnjZur kC2QIJ4l2QAn4ekWa7eoHX/SLKuSOXmCS0ADHMjtQFzxOoCsnhGjzltHgB/OMcNZJphj 1HCg== MIME-Version: 1.0 X-Received: by 10.68.254.132 with SMTP id ai4mr9472991pbd.51.1381344244509; Wed, 09 Oct 2013 11:44:04 -0700 (PDT) Received: by 10.68.125.106 with HTTP; Wed, 9 Oct 2013 11:44:04 -0700 (PDT) Date: Wed, 9 Oct 2013 13:44:04 -0500 Message-ID: Subject: [PATCH] [CIFS] Query device characteristics at mount time from server on SMB2/3 not just on cifs mounts From: Steve French To: "linux-cifs@vger.kernel.org" , samba-technical , linux-fsdevel Sender: linux-cifs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-cifs@vger.kernel.org X-Spam-Status: No, score=-7.0 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, T_DKIM_INVALID, T_TVD_MIME_EPI,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Currently SMB2 and SMB3 mounts do not query the device information at mount time from the server at mount time as is done for cifs. These can be useful for debugging. This is a minor patch, that extends the previous one (which added ability to query file system attributes at mount time - this returns the device characteristics - also via in /proc/fs/cifs/DebugData). I wonder if there is a way to make additional device characteristics and fs attributes available in consistent way for nfs/cifs/smb3 and local file systems (as we do for certain file attributes). Signed-off-by: Steve French --- fs/cifs/smb2ops.c | 5 ++++- fs/cifs/smb2pdu.c | 31 +++++++++++++++++++++++-------- fs/cifs/smb2proto.h | 2 +- 3 files changed, 28 insertions(+), 10 deletions(-) const __u32 pid, const __u64 length, const __u64 offset, diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c index a53e205..71a3460 100644 --- a/fs/cifs/smb2ops.c +++ b/fs/cifs/smb2ops.c @@ -229,7 +229,10 @@ smb2_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon) if (rc) return; - SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid); + SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid, + SMB_QUERY_FS_ATTRIBUTE_INFO); + SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid, + SMB_QUERY_FS_DEVICE_INFO); SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); return; } diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c index 2ade58b..c822d9a 100644 --- a/fs/cifs/smb2pdu.c +++ b/fs/cifs/smb2pdu.c @@ -2347,17 +2347,27 @@ qfsinf_exit: int SMB2_QFS_attr(const unsigned int xid, struct cifs_tcon *tcon, - u64 persistent_fid, u64 volatile_fid) + u64 persistent_fid, u64 volatile_fid, int level) { struct smb2_query_info_rsp *rsp = NULL; struct kvec iov; int rc = 0; - int resp_buftype; + int resp_buftype, max_len, min_len; struct cifs_ses *ses = tcon->ses; unsigned int rsp_len, offset; - rc = build_qfs_info_req(&iov, tcon, SMB_QUERY_FS_ATTRIBUTE_INFO, - sizeof(FILE_SYSTEM_ATTRIBUTE_INFO), + if (level == SMB_QUERY_FS_DEVICE_INFO) { + max_len = sizeof(FILE_SYSTEM_DEVICE_INFO); + min_len = sizeof(FILE_SYSTEM_DEVICE_INFO); + } else if (level == SMB_QUERY_FS_ATTRIBUTE_INFO) { + max_len = sizeof(FILE_SYSTEM_ATTRIBUTE_INFO); + min_len = MIN_FS_ATTR_INFO_SIZE; + } else { + cifs_dbg(FYI, "Invalid qfsinfo level %d", level); + return -EINVAL; + } + + rc = build_qfs_info_req(&iov, tcon, level, max_len, persistent_fid, volatile_fid); if (rc) return rc; @@ -2371,12 +2381,17 @@ SMB2_QFS_attr(const unsigned int xid, struct cifs_tcon *tcon, rsp_len = le32_to_cpu(rsp->OutputBufferLength); offset = le16_to_cpu(rsp->OutputBufferOffset); - rc = validate_buf(offset, rsp_len, &rsp->hdr, MIN_FS_ATTR_INFO_SIZE); - if (!rc) { + rc = validate_buf(offset, rsp_len, &rsp->hdr, min_len); + if (rc) + goto qfsattr_exit; + + if (level == SMB_QUERY_FS_ATTRIBUTE_INFO) memcpy(&tcon->fsAttrInfo, 4 /* RFC1001 len */ + offset + (char *)&rsp->hdr, min_t(unsigned int, - rsp_len, sizeof(FILE_SYSTEM_ATTRIBUTE_INFO))); - } + rsp_len, max_len)); + else if (level == SMB_QUERY_FS_DEVICE_INFO) + memcpy(&tcon->fsDevInfo, 4 /* RFC1001 len */ + offset + + (char *)&rsp->hdr, sizeof(FILE_SYSTEM_DEVICE_INFO)); qfsattr_exit: free_rsp_buf(resp_buftype, iov.iov_base); diff --git a/fs/cifs/smb2proto.h b/fs/cifs/smb2proto.h index 68dc00d..313813e 100644 --- a/fs/cifs/smb2proto.h +++ b/fs/cifs/smb2proto.h @@ -151,7 +151,7 @@ extern int SMB2_QFS_info(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_file_id, u64 volatile_file_id, struct kstatfs *FSData); extern int SMB2_QFS_attr(const unsigned int xid, struct cifs_tcon *tcon, - u64 persistent_file_id, u64 volatile_file_id); + u64 persistent_file_id, u64 volatile_file_id, int lvl); extern int SMB2_lock(const unsigned int xid, struct cifs_tcon *tcon, const __u64 persist_fid, const __u64 volatile_fid,