Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp2984771imu; Sun, 9 Dec 2018 14:18:15 -0800 (PST) X-Google-Smtp-Source: AFSGD/X8ec/otkBGj7yCCu3XLyFuM6/91v1OWzw5ihRJVtc/NSMj/Fdo2UtZ65JWHiYHSPIq+kOx X-Received: by 2002:a62:6385:: with SMTP id x127mr10226069pfb.15.1544393895754; Sun, 09 Dec 2018 14:18:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544393895; cv=none; d=google.com; s=arc-20160816; b=Fo3niNV7ZT5aUJ7qcveTFYJeLl/g2d91j5/bWs6P3sVeuecTdlzPz3QPv4ybHUPpfs i6sbQEtpIRCsaCeiemnaWC8s3sEtJv5eywKpfWDfiKL4hlE9b1k2Ke+wlnmnNykWDHhH JnxsuVPA7Ch6vLisrUHmp0rAMeJdBXILOiwBdnDvFdtv8j3moXd6p70NMEBFkxWijjXG FxBPzMQuq6X7iGfdkN2fGfasaTTbe59Yb1HexcONxaIYHHSAt0st8HIH8nJz2YMKQjn+ /9fhCM8/QcUb786ifsqNS+8PYelGoFpR7cR1p3Q9ESeqVtmOJVBCkDah9T1j3GJ0n+GT jPFA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:in-reply-to:subject:message-id:date:cc:to :from:mime-version:content-transfer-encoding:content-disposition; bh=pe6YUf88zUZZ6b5IAs6skrcwX+15KoegOKVDL4ETn0s=; b=hACI69SQOErMbCKQ2FoBYdk8Az9XpWu8/V54qw4gK9FewsgZfRpX3UGOsUNkYocc1s Rgjrg7GcpDoFxJwXyufgkXbNcVUK1wdUX7vvyQv+dSm2IF2OzSChc11/Pvwn4rwh45Wl suctMmx0M6eTNvbqRW1Osgh76EPdE1sNvY0Agp9zvMq4fQNMX44oGVWoHTPoMOvAdsdx twqN/vKdzrDZLfK1hrgHLWeFgUWQTCjrHG8ztYC9kupRclWGAKWdnnEyQPd/hVlSjQms iBCC2sfcDeYfXk71r63Q+sHE6ov/7ex8VLKM2SZ53KZd22sOYrT93EKQ37LrjVV0G2dH HBfQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c201si9277390pfb.211.2018.12.09.14.18.00; Sun, 09 Dec 2018 14:18:15 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728019AbeLIWIG (ORCPT + 99 others); Sun, 9 Dec 2018 17:08:06 -0500 Received: from shadbolt.e.decadent.org.uk ([88.96.1.126]:37260 "EHLO shadbolt.e.decadent.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727929AbeLIWHt (ORCPT ); Sun, 9 Dec 2018 17:07:49 -0500 Received: from pub.yeoldevic.com ([81.174.156.145] helo=deadeye) by shadbolt.decadent.org.uk with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1gW73G-0002ib-VG; Sun, 09 Dec 2018 21:55:51 +0000 Received: from ben by deadeye with local (Exim 4.91) (envelope-from ) id 1gW72c-0003MV-Kz; Sun, 09 Dec 2018 21:55:10 +0000 Content-Type: text/plain; charset="UTF-8" Content-Disposition: inline Content-Transfer-Encoding: 8bit MIME-Version: 1.0 From: Ben Hutchings To: linux-kernel@vger.kernel.org, stable@vger.kernel.org CC: akpm@linux-foundation.org, "Steve French" , "Steve French" , "Aurelien Aptel" Date: Sun, 09 Dec 2018 21:50:33 +0000 Message-ID: X-Mailer: LinuxStableQueue (scripts by bwh) X-Patchwork-Hint: ignore Subject: [PATCH 3.16 116/328] smb3: fill in statfs fsid and correct namelen In-Reply-To: X-SA-Exim-Connect-IP: 81.174.156.145 X-SA-Exim-Mail-From: ben@decadent.org.uk X-SA-Exim-Scanned: No (on shadbolt.decadent.org.uk); SAEximRunCond expanded to false Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 3.16.62-rc1 review patch. If anyone has any objections, please let me know. ------------------ From: Steve French commit 21ba3845b59c733a79ed4fe1c4f3732e7ece9df7 upstream. Fil in the correct namelen (typically 255 not 4096) in the statfs response and also fill in a reasonably unique fsid (in this case taken from the volume id, and the creation time of the volume). In the case of the POSIX statfs all fields are now filled in, and in the case of non-POSIX mounts, all fields are filled in which can be. Signed-off-by: Steve French Reviewed-by: Aurelien Aptel [bwh: Backported to 3.16: Only use cifs_tcon::vol_{serial_number,create_time} if CONFIG_CIFS_SMB2 is enabled] Signed-off-by: Ben Hutchings --- fs/cifs/cifsfs.c | 18 ++++++++++-------- fs/cifs/smb2ops.c | 2 ++ fs/cifs/smb2pdu.c | 8 ++++++++ fs/cifs/smb2pdu.h | 11 +++++++++++ 4 files changed, 31 insertions(+), 8 deletions(-) --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c @@ -190,14 +190,18 @@ cifs_statfs(struct dentry *dentry, struc xid = get_xid(); - /* - * PATH_MAX may be too long - it would presumably be total path, - * but note that some servers (includinng Samba 3) have a shorter - * maximum path. - * - * Instead could get the real value via SMB_QUERY_FS_ATTRIBUTE_INFO. - */ - buf->f_namelen = PATH_MAX; + if (le32_to_cpu(tcon->fsAttrInfo.MaxPathNameComponentLength) > 0) + buf->f_namelen = + le32_to_cpu(tcon->fsAttrInfo.MaxPathNameComponentLength); + else + buf->f_namelen = PATH_MAX; + +#ifdef CONFIG_CIFS_SMB2 + buf->f_fsid.val[0] = tcon->vol_serial_number; + /* are using part of create time for more randomness, see man statfs */ + buf->f_fsid.val[1] = (int)le64_to_cpu(tcon->vol_create_time); +#endif + buf->f_files = 0; /* undefined */ buf->f_ffree = 0; /* unlimited */ --- a/fs/cifs/smb2ops.c +++ b/fs/cifs/smb2ops.c @@ -263,6 +263,8 @@ smb3_qfs_tcon(const unsigned int xid, st 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_VOLUME_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; --- a/fs/cifs/smb2pdu.c +++ b/fs/cifs/smb2pdu.c @@ -2614,6 +2614,9 @@ SMB2_QFS_attr(const unsigned int xid, st } else if (level == FS_SECTOR_SIZE_INFORMATION) { max_len = sizeof(struct smb3_fs_ss_info); min_len = sizeof(struct smb3_fs_ss_info); + } else if (level == FS_VOLUME_INFORMATION) { + max_len = sizeof(struct smb3_fs_vol_info) + MAX_VOL_LABEL_LEN; + min_len = sizeof(struct smb3_fs_vol_info); } else { cifs_dbg(FYI, "Invalid qfsinfo level %d\n", level); return -EINVAL; @@ -2650,6 +2653,11 @@ SMB2_QFS_attr(const unsigned int xid, st tcon->ss_flags = le32_to_cpu(ss_info->Flags); tcon->perf_sector_size = le32_to_cpu(ss_info->PhysicalBytesPerSectorForPerf); + } else if (level == FS_VOLUME_INFORMATION) { + struct smb3_fs_vol_info *vol_info = (struct smb3_fs_vol_info *) + (offset + (char *)rsp); + tcon->vol_serial_number = vol_info->VolumeSerialNumber; + tcon->vol_create_time = vol_info->VolumeCreationTime; } qfsattr_exit: --- a/fs/cifs/smb2pdu.h +++ b/fs/cifs/smb2pdu.h @@ -946,6 +946,17 @@ struct smb3_fs_ss_info { __le32 ByteOffsetForPartitionAlignment; } __packed; +/* volume info struct - see MS-FSCC 2.5.9 */ +#define MAX_VOL_LABEL_LEN 32 +struct smb3_fs_vol_info { + __le64 VolumeCreationTime; + __u32 VolumeSerialNumber; + __le32 VolumeLabelLength; /* includes trailing null */ + __u8 SupportsObjects; /* True if eg like NTFS, supports objects */ + __u8 Reserved; + __u8 VolumeLabel[0]; /* variable len */ +} __packed; + /* partial list of QUERY INFO levels */ #define FILE_DIRECTORY_INFORMATION 1 #define FILE_FULL_DIRECTORY_INFORMATION 2