posix_info->DeviceId = cpu_to_le32(ksmbd_kstat->kstat->rdev);
                posix_info->HardLinks = cpu_to_le32(ksmbd_kstat->kstat->nlink);
                posix_info->Mode = cpu_to_le32(ksmbd_kstat->kstat->mode & 0777);
+               switch (ksmbd_kstat->kstat->mode & S_IFMT) {
+               case S_IFDIR:
+                       posix_info->Mode |= cpu_to_le32(POSIX_TYPE_DIR << POSIX_FILETYPE_SHIFT);
+                       break;
+               case S_IFLNK:
+                       posix_info->Mode |= cpu_to_le32(POSIX_TYPE_SYMLINK << POSIX_FILETYPE_SHIFT);
+                       break;
+               case S_IFCHR:
+                       posix_info->Mode |= cpu_to_le32(POSIX_TYPE_CHARDEV << POSIX_FILETYPE_SHIFT);
+                       break;
+               case S_IFBLK:
+                       posix_info->Mode |= cpu_to_le32(POSIX_TYPE_BLKDEV << POSIX_FILETYPE_SHIFT);
+                       break;
+               case S_IFIFO:
+                       posix_info->Mode |= cpu_to_le32(POSIX_TYPE_FIFO << POSIX_FILETYPE_SHIFT);
+                       break;
+               case S_IFSOCK:
+                       posix_info->Mode |= cpu_to_le32(POSIX_TYPE_SOCKET << POSIX_FILETYPE_SHIFT);
+               }
+
                posix_info->Inode = cpu_to_le64(ksmbd_kstat->kstat->ino);
                posix_info->DosAttributes =
                        S_ISDIR(ksmbd_kstat->kstat->mode) ?
        file_info->AllocationSize = cpu_to_le64(stat.blocks << 9);
        file_info->HardLinks = cpu_to_le32(stat.nlink);
        file_info->Mode = cpu_to_le32(stat.mode & 0777);
+       switch (stat.mode & S_IFMT) {
+       case S_IFDIR:
+               file_info->Mode |= cpu_to_le32(POSIX_TYPE_DIR << POSIX_FILETYPE_SHIFT);
+               break;
+       case S_IFLNK:
+               file_info->Mode |= cpu_to_le32(POSIX_TYPE_SYMLINK << POSIX_FILETYPE_SHIFT);
+               break;
+       case S_IFCHR:
+               file_info->Mode |= cpu_to_le32(POSIX_TYPE_CHARDEV << POSIX_FILETYPE_SHIFT);
+               break;
+       case S_IFBLK:
+               file_info->Mode |= cpu_to_le32(POSIX_TYPE_BLKDEV << POSIX_FILETYPE_SHIFT);
+               break;
+       case S_IFIFO:
+               file_info->Mode |= cpu_to_le32(POSIX_TYPE_FIFO << POSIX_FILETYPE_SHIFT);
+               break;
+       case S_IFSOCK:
+               file_info->Mode |= cpu_to_le32(POSIX_TYPE_SOCKET << POSIX_FILETYPE_SHIFT);
+       }
+
        file_info->DeviceId = cpu_to_le32(stat.rdev);
 
        /*
 
        return buf + 4;
 }
 
+#define POSIX_TYPE_FILE                0
+#define POSIX_TYPE_DIR         1
+#define POSIX_TYPE_SYMLINK     2
+#define POSIX_TYPE_CHARDEV     3
+#define POSIX_TYPE_BLKDEV      4
+#define POSIX_TYPE_FIFO                5
+#define POSIX_TYPE_SOCKET      6
+
+#define POSIX_FILETYPE_SHIFT   12
+
 #endif /* _SMB2PDU_H */