summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fs/smb/client/inode.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c
index 72ebd72dd02b..de8063b44072 100644
--- a/fs/smb/client/inode.c
+++ b/fs/smb/client/inode.c
@@ -598,6 +598,17 @@ cifs_sfu_type(struct cifs_fattr *fattr, const char *path,
mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
fattr->cf_rdev = MKDEV(mjr, mnr);
+ } else if (bytes_read == 16) {
+ /*
+ * Windows NFS server before Windows Server 2012
+ * stores major and minor number in SFU-modified
+ * style, just as 32-bit numbers. Recognize it.
+ */
+ __u32 mjr; /* major */
+ __u32 mnr; /* minor */
+ mjr = le32_to_cpu(*(__le32 *)(pbuf+8));
+ mnr = le32_to_cpu(*(__le32 *)(pbuf+12));
+ fattr->cf_rdev = MKDEV(mjr, mnr);
}
} else if (memcmp("IntxCHR\0", pbuf, 8) == 0) {
cifs_dbg(FYI, "Char device\n");
@@ -610,6 +621,17 @@ cifs_sfu_type(struct cifs_fattr *fattr, const char *path,
mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
fattr->cf_rdev = MKDEV(mjr, mnr);
+ } else if (bytes_read == 16) {
+ /*
+ * Windows NFS server before Windows Server 2012
+ * stores major and minor number in SFU-modified
+ * style, just as 32-bit numbers. Recognize it.
+ */
+ __u32 mjr; /* major */
+ __u32 mnr; /* minor */
+ mjr = le32_to_cpu(*(__le32 *)(pbuf+8));
+ mnr = le32_to_cpu(*(__le32 *)(pbuf+12));
+ fattr->cf_rdev = MKDEV(mjr, mnr);
}
} else if (memcmp("LnxSOCK", pbuf, 8) == 0) {
cifs_dbg(FYI, "Socket\n");