Lines Matching +full:data +full:- +full:path
1 // SPDX-License-Identifier: GPL-2.0-only
41 switch (get_cifs_symlink_type(CIFS_SB(inode->i_sb))) { in smb2_create_reparse_symlink()
49 return -EOPNOTSUPP; in smb2_create_reparse_symlink()
58 struct cifs_open_info_data data = {}; in create_native_symlink() local
59 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); in create_native_symlink()
62 __le16 *path = NULL; in create_native_symlink() local
71 return -ENAMETOOLONG; in create_native_symlink()
75 rc = -ENOMEM; in create_native_symlink()
79 data = (struct cifs_open_info_data) { in create_native_symlink()
85 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) && symname[0] == '/') { in create_native_symlink()
89 * NT-style path. So convert absolute Linux symlink target path in create_native_symlink()
90 * to the absolute NT-style path. Root of the NT-style path for in create_native_symlink()
95 if (!strstarts(symname, cifs_sb->ctx->symlinkroot)) { in create_native_symlink()
97 * If the absolute Linux symlink target path is not in create_native_symlink()
99 * to convert such Linux symlink to NT-style path. in create_native_symlink()
104 symname, cifs_sb->ctx->symlinkroot); in create_native_symlink()
105 rc = -EINVAL; in create_native_symlink()
108 len = strlen(cifs_sb->ctx->symlinkroot); in create_native_symlink()
109 if (cifs_sb->ctx->symlinkroot[len-1] != '/') in create_native_symlink()
114 * Symlink points to Linux target /symlinkroot/x/path/... in create_native_symlink()
116 * NT-style path for 'x' has common form \??\X:\path\... in create_native_symlink()
122 rc = -ENOMEM; in create_native_symlink()
126 sym[4] = symname[len] - ('a'-'A'); in create_native_symlink()
136 rc = -EINVAL; in create_native_symlink()
145 * so no conversion is needed. So just take symname as-is. in create_native_symlink()
149 rc = -ENOMEM; in create_native_symlink()
165 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) && symname[0] == '/') in create_native_symlink()
168 path = cifs_convert_path_to_utf16(sym, cifs_sb); in create_native_symlink()
169 if (!path) { in create_native_symlink()
170 rc = -ENOMEM; in create_native_symlink()
174 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) && symname[0] == '/') { in create_native_symlink()
178 path[0] = cpu_to_le16('\\'); in create_native_symlink()
179 path[1] = path[2] = cpu_to_le16('?'); in create_native_symlink()
180 path[5] = cpu_to_le16(':'); in create_native_symlink()
186 * directory cannot be resolved and vice-versa). Try to detect if in create_native_symlink()
188 * fails then treat symlink as a file (non-directory) symlink. in create_native_symlink()
195 slen = 2 * UniStrnlen((wchar_t *)path, REPARSE_SYM_PATH_MAX); in create_native_symlink()
198 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) && symname[0] == '/') { in create_native_symlink()
204 plen -= 2 * poff; in create_native_symlink()
209 rc = -ENOMEM; in create_native_symlink()
213 buf->ReparseTag = cpu_to_le32(IO_REPARSE_TAG_SYMLINK); in create_native_symlink()
214 buf->ReparseDataLength = cpu_to_le16(len - sizeof(struct reparse_data_buffer)); in create_native_symlink()
216 buf->SubstituteNameOffset = cpu_to_le16(plen); in create_native_symlink()
217 buf->SubstituteNameLength = cpu_to_le16(slen); in create_native_symlink()
218 memcpy(&buf->PathBuffer[plen], path, slen); in create_native_symlink()
220 buf->PrintNameOffset = 0; in create_native_symlink()
221 buf->PrintNameLength = cpu_to_le16(plen); in create_native_symlink()
222 memcpy(buf->PathBuffer, path+poff, plen); in create_native_symlink()
224 buf->Flags = cpu_to_le32(*symname != '/' ? SYMLINK_FLAG_RELATIVE : 0); in create_native_symlink()
228 new = smb2_get_reparse_inode(&data, inode->i_sb, xid, in create_native_symlink()
237 kfree(path); in create_native_symlink()
238 cifs_free_open_info(&data); in create_native_symlink()
265 * with slash, or last path component is dot or dot-dot then it is for in detect_directory_symlink_target()
283 "%s: cannot determinate if the symlink target path '%s' " in detect_directory_symlink_target()
291 * then try to resolve the path on the SMB server, check if the path in detect_directory_symlink_target()
305 return -ENOMEM; in detect_directory_symlink_target()
309 * Compose the resolved SMB symlink path from the SMB full path in detect_directory_symlink_target()
310 * and Linux target symlink path. in detect_directory_symlink_target()
331 open_rc = tcon->ses->server->ops->open(xid, &oparms, &oplock, NULL); in detect_directory_symlink_target()
333 /* Successful open means that the target path is definitely a directory. */ in detect_directory_symlink_target()
335 tcon->ses->server->ops->close(xid, tcon, &fid); in detect_directory_symlink_target()
336 } else if (open_rc == -ENOTDIR) { in detect_directory_symlink_target()
337 /* -ENOTDIR means that the target path is definitely a file. */ in detect_directory_symlink_target()
339 } else if (open_rc == -ENOENT) { in detect_directory_symlink_target()
340 /* -ENOENT means that the target path does not exist. */ in detect_directory_symlink_target()
342 "%s: symlink target path '%s' does not exist, " in detect_directory_symlink_target()
350 open_rc = tcon->ses->server->ops->open(xid, &oparms, &oplock, NULL); in detect_directory_symlink_target()
352 /* Successful open means that the target path is definitely a file. */ in detect_directory_symlink_target()
354 tcon->ses->server->ops->close(xid, tcon, &fid); in detect_directory_symlink_target()
355 } else if (open_rc == -EISDIR) { in detect_directory_symlink_target()
356 /* -EISDIR means that the target path is definitely a directory. */ in detect_directory_symlink_target()
364 * TODO: Try to use ops->query_dir_first on the parent directory in detect_directory_symlink_target()
367 * case this could work also when opening of the path is denied. in detect_directory_symlink_target()
370 "%s: cannot determinate if the symlink target path '%s' " in detect_directory_symlink_target()
389 struct cifs_open_info_data data = { in create_native_socket() local
400 new = smb2_get_reparse_inode(&data, inode->i_sb, xid, in create_native_socket()
406 cifs_free_open_info(&data); in create_native_socket()
425 ((__le32 *)buf->DataBuffer)[0] = cpu_to_le32(MAJOR(dev)); in nfs_set_reparse_buf()
426 ((__le32 *)buf->DataBuffer)[1] = cpu_to_le32(MINOR(dev)); in nfs_set_reparse_buf()
430 memcpy(buf->DataBuffer, symname_utf16, symname_utf16_len); in nfs_set_reparse_buf()
437 return -EOPNOTSUPP; in nfs_set_reparse_buf()
440 buf->ReparseTag = cpu_to_le32(IO_REPARSE_TAG_NFS); in nfs_set_reparse_buf()
441 buf->Reserved = 0; in nfs_set_reparse_buf()
442 buf->InodeType = cpu_to_le64(type); in nfs_set_reparse_buf()
443 buf->ReparseDataLength = cpu_to_le16(len + dlen - in nfs_set_reparse_buf()
445 iov->iov_base = buf; in nfs_set_reparse_buf()
446 iov->iov_len = len + dlen; in nfs_set_reparse_buf()
455 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); in mknod_nfs()
456 struct cifs_open_info_data data; in mknod_nfs() local
468 cifs_sb->local_nls, in mknod_nfs()
471 rc = -ENOMEM; in mknod_nfs()
474 symname_utf16_len -= 2; /* symlink is without trailing wide-nul */ in mknod_nfs()
477 rc = -ENOMEM; in mknod_nfs()
487 data = (struct cifs_open_info_data) { in mknod_nfs()
493 new = smb2_get_reparse_inode(&data, inode->i_sb, xid, in mknod_nfs()
499 cifs_free_open_info(&data); in mknod_nfs()
529 return -ENOMEM; in wsl_set_reparse_buf()
534 cifs_sb->local_nls, in wsl_set_reparse_buf()
537 return -ENOMEM; in wsl_set_reparse_buf()
543 return -ENOMEM; in wsl_set_reparse_buf()
545 /* Version field must be set to 2 (MS-FSCC 2.1.2.7) */ in wsl_set_reparse_buf()
546 symlink_buf->Version = cpu_to_le32(2); in wsl_set_reparse_buf()
547 /* Target for Version 2 is in UTF-8 but without trailing null-term byte */ in wsl_set_reparse_buf()
550 symlink_buf->Target, in wsl_set_reparse_buf()
557 return -EOPNOTSUPP; in wsl_set_reparse_buf()
560 (*buf)->ReparseTag = cpu_to_le32(tag); in wsl_set_reparse_buf()
561 (*buf)->Reserved = 0; in wsl_set_reparse_buf()
562 (*buf)->ReparseDataLength = cpu_to_le16(buf_len - sizeof(struct reparse_data_buffer)); in wsl_set_reparse_buf()
563 iov->iov_base = *buf; in wsl_set_reparse_buf()
564 iov->iov_len = buf_len; in wsl_set_reparse_buf()
575 return ERR_PTR(-ENOMEM); in ea_create_context()
577 cc->ctx.NameOffset = cpu_to_le16(offsetof(struct smb2_create_ea_ctx, in ea_create_context()
579 cc->ctx.NameLength = cpu_to_le16(4); in ea_create_context()
580 memcpy(cc->name, SMB2_CREATE_EA_BUFFER, strlen(SMB2_CREATE_EA_BUFFER)); in ea_create_context()
581 cc->ctx.DataOffset = cpu_to_le16(offsetof(struct smb2_create_ea_ctx, ea)); in ea_create_context()
582 cc->ctx.DataLength = cpu_to_le32(dlen); in ea_create_context()
598 struct smb3_fs_context *ctx = CIFS_SB(inode->i_sb)->ctx; in wsl_set_xattrs()
599 __le64 uid = cpu_to_le64(from_kuid(current_user_ns(), ctx->linux_uid)); in wsl_set_xattrs()
600 __le64 gid = cpu_to_le64(from_kgid(current_user_ns(), ctx->linux_gid)); in wsl_set_xattrs()
616 /* Exclude $LXDEV xattr for non-device files */ in wsl_set_xattrs()
618 num_xattrs = ARRAY_SIZE(xattrs) - 1; in wsl_set_xattrs()
632 ea = &cc->ea; in wsl_set_xattrs()
636 ea->next_entry_offset = cpu_to_le32(next); in wsl_set_xattrs()
638 ea->ea_name_length = name_size - 1; in wsl_set_xattrs()
639 ea->ea_value_length = cpu_to_le16(xattrs[i].size); in wsl_set_xattrs()
640 memcpy(ea->ea_data, xattrs[i].name, name_size); in wsl_set_xattrs()
641 memcpy(&ea->ea_data[name_size], in wsl_set_xattrs()
644 ea->next_entry_offset = 0; in wsl_set_xattrs()
646 iov->iov_base = cc; in wsl_set_xattrs()
647 iov->iov_len = cc_len; in wsl_set_xattrs()
656 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); in mknod_wsl()
657 struct cifs_open_info_data data; in mknod_wsl() local
675 data = (struct cifs_open_info_data) { in mknod_wsl()
677 .reparse = { .tag = le32_to_cpu(buf->ReparseTag), .buf = buf, }, in mknod_wsl()
682 len = le32_to_cpu(cc->ctx.DataLength); in mknod_wsl()
683 memcpy(data.wsl.eas, &cc->ea, len); in mknod_wsl()
684 data.wsl.eas_len = len; in mknod_wsl()
686 new = smb2_get_reparse_inode(&data, inode->i_sb, in mknod_wsl()
693 cifs_free_open_info(&data); in mknod_wsl()
703 struct smb3_fs_context *ctx = CIFS_SB(inode->i_sb)->ctx; in smb2_mknod_reparse()
705 if (S_ISSOCK(mode) && !ctx->nonativesocket && ctx->reparse_type != CIFS_REPARSE_TYPE_NONE) in smb2_mknod_reparse()
708 switch (ctx->reparse_type) { in smb2_mknod_reparse()
714 return -EOPNOTSUPP; in smb2_mknod_reparse()
718 /* See MS-FSCC 2.1.2.6 for the 'NFS' style reparse tags */
721 struct cifs_open_info_data *data) in parse_reparse_nfs() argument
726 len = le16_to_cpu(buf->ReparseDataLength); in parse_reparse_nfs()
727 if (len < sizeof(buf->InodeType)) { in parse_reparse_nfs()
729 return -EIO; in parse_reparse_nfs()
732 len -= sizeof(buf->InodeType); in parse_reparse_nfs()
734 switch ((type = le64_to_cpu(buf->InodeType))) { in parse_reparse_nfs()
738 return -EIO; in parse_reparse_nfs()
741 * Check that buffer does not contain UTF-16 null codepoint in parse_reparse_nfs()
744 if (UniStrnlen((wchar_t *)buf->DataBuffer, len/2) != len/2) { in parse_reparse_nfs()
746 return -EIO; in parse_reparse_nfs()
748 data->symlink_target = cifs_strndup_from_utf16(buf->DataBuffer, in parse_reparse_nfs()
750 cifs_sb->local_nls); in parse_reparse_nfs()
751 if (!data->symlink_target) in parse_reparse_nfs()
752 return -ENOMEM; in parse_reparse_nfs()
753 cifs_dbg(FYI, "%s: target path: %s\n", in parse_reparse_nfs()
754 __func__, data->symlink_target); in parse_reparse_nfs()
758 /* DataBuffer for block and char devices contains two 32-bit numbers */ in parse_reparse_nfs()
761 return -EIO; in parse_reparse_nfs()
769 return -EIO; in parse_reparse_nfs()
775 return -EOPNOTSUPP; in parse_reparse_nfs()
798 rc = -EIO; in smb2_parse_native_symlink()
803 * Check that buffer does not contain UTF-16 null codepoint in smb2_parse_native_symlink()
808 rc = -EIO; in smb2_parse_native_symlink()
812 smb_target = cifs_strndup_from_utf16(buf, len, true, cifs_sb->local_nls); in smb2_parse_native_symlink()
814 rc = -ENOMEM; in smb2_parse_native_symlink()
818 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) && !relative) { in smb2_parse_native_symlink()
821 * support POSIX paths, so the symlink is in NT-style path. in smb2_parse_native_symlink()
822 * So convert it to absolute Linux symlink target path. Root of in smb2_parse_native_symlink()
823 * the NT-style path for symlinks is specified in "symlinkroot" in smb2_parse_native_symlink()
826 * Root of the DOS and Win32 paths is at NT path \??\ in smb2_parse_native_symlink()
827 * It means that DOS/Win32 path C:\folder\file.txt is in smb2_parse_native_symlink()
828 * NT path \??\C:\folder\file.txt in smb2_parse_native_symlink()
830 * NT systems have some well-known object symlinks in their NT in smb2_parse_native_symlink()
833 * \?? -> \GLOBAL?? in smb2_parse_native_symlink()
834 * \DosDevices -> \?? in smb2_parse_native_symlink()
835 * \GLOBAL??\GLOBALROOT -> \ in smb2_parse_native_symlink()
836 * \GLOBAL??\Global -> \GLOBAL?? in smb2_parse_native_symlink()
837 * \GLOBAL??\NUL -> \Device\Null in smb2_parse_native_symlink()
838 * \GLOBAL??\UNC -> \Device\Mup in smb2_parse_native_symlink()
839 * \GLOBAL??\PhysicalDrive0 -> \Device\Harddisk0\DR0 (for each harddisk) in smb2_parse_native_symlink()
840 * \GLOBAL??\A: -> \Device\Floppy0 (if A: is the first floppy) in smb2_parse_native_symlink()
841 * \GLOBAL??\C: -> \Device\HarddiskVolume1 (if C: is the first harddisk) in smb2_parse_native_symlink()
842 * \GLOBAL??\D: -> \Device\CdRom0 (if D: is first cdrom) in smb2_parse_native_symlink()
843 * \SystemRoot -> \Device\Harddisk0\Partition1\WINDOWS (or where is NT system installed) in smb2_parse_native_symlink()
844 * \Volume{...} -> \Device\HarddiskVolume1 (where ... is system generated guid) in smb2_parse_native_symlink()
846 * In most common cases, absolute NT symlinks points to path on in smb2_parse_native_symlink()
847 * DOS/Win32 drive letter, system-specific Volume or on UNC share. in smb2_parse_native_symlink()
854 * \??\Volume{b75e2c83-0000-0000-0000-602f00000000}\folder\file.txt in smb2_parse_native_symlink()
856 * It means that the most common path prefix \??\ is also NT path in smb2_parse_native_symlink()
857 * symlink (to \GLOBAL??). It is less common that second path in smb2_parse_native_symlink()
873 abs_path += sizeof("\\??\\")-1; in smb2_parse_native_symlink()
875 abs_path += sizeof("\\DosDevices\\")-1; in smb2_parse_native_symlink()
877 abs_path += sizeof("\\GLOBAL??\\")-1; in smb2_parse_native_symlink()
884 rc = -EIO; in smb2_parse_native_symlink()
888 /* Sometimes path separator after \?? is double backslash */ in smb2_parse_native_symlink()
893 abs_path += sizeof("Global\\")-1; in smb2_parse_native_symlink()
896 /* Label globalroot requires path with leading '\\', so do not trim '\\' */ in smb2_parse_native_symlink()
897 abs_path += sizeof("GLOBALROOT")-1; in smb2_parse_native_symlink()
909 drive_letter += 'a'-'A'; in smb2_parse_native_symlink()
918 rc = -EIO; in smb2_parse_native_symlink()
923 symlinkroot_len = strlen(cifs_sb->ctx->symlinkroot); in smb2_parse_native_symlink()
924 if (cifs_sb->ctx->symlinkroot[symlinkroot_len-1] == '/') in smb2_parse_native_symlink()
925 symlinkroot_len--; in smb2_parse_native_symlink()
928 rc = -ENOMEM; in smb2_parse_native_symlink()
931 memcpy(linux_target, cifs_sb->ctx->symlinkroot, symlinkroot_len); in smb2_parse_native_symlink()
940 * full_path is the SMB path to the symlink (from which is in smb2_parse_native_symlink()
941 * extracted current directory) and smb_target is the SMB path in smb2_parse_native_symlink()
953 rc = -ENOMEM; in smb2_parse_native_symlink()
964 * This is either an absolute symlink in POSIX-style format in smb2_parse_native_symlink()
992 struct cifs_open_info_data *data) in parse_reparse_native_symlink() argument
997 /* We handle Symbolic Link reparse tag here. See: MS-FSCC 2.1.2.4 */ in parse_reparse_native_symlink()
999 offs = le16_to_cpu(sym->SubstituteNameOffset); in parse_reparse_native_symlink()
1000 len = le16_to_cpu(sym->SubstituteNameLength); in parse_reparse_native_symlink()
1003 return -EIO; in parse_reparse_native_symlink()
1006 return smb2_parse_native_symlink(&data->symlink_target, in parse_reparse_native_symlink()
1007 sym->PathBuffer + offs, in parse_reparse_native_symlink()
1009 le32_to_cpu(sym->Flags) & SYMLINK_FLAG_RELATIVE, in parse_reparse_native_symlink()
1016 struct cifs_open_info_data *data) in parse_reparse_wsl_symlink() argument
1018 int len = le16_to_cpu(buf->ReparseDataLength); in parse_reparse_wsl_symlink()
1019 int data_offset = offsetof(typeof(*buf), Target) - offsetof(typeof(*buf), Version); in parse_reparse_wsl_symlink()
1026 return -EIO; in parse_reparse_wsl_symlink()
1029 /* MS-FSCC 2.1.2.7 defines layout of the Target field only for Version 2. */ in parse_reparse_wsl_symlink()
1030 if (le32_to_cpu(buf->Version) != 2) { in parse_reparse_wsl_symlink()
1031 cifs_dbg(VFS, "srv returned unsupported wsl symlink version %u\n", le32_to_cpu(buf->Version)); in parse_reparse_wsl_symlink()
1032 return -EIO; in parse_reparse_wsl_symlink()
1035 /* Target for Version 2 is in UTF-8 but without trailing null-term byte */ in parse_reparse_wsl_symlink()
1036 symname_utf8_len = len - data_offset; in parse_reparse_wsl_symlink()
1041 if (strnlen(buf->Target, symname_utf8_len) != symname_utf8_len) { in parse_reparse_wsl_symlink()
1043 return -EIO; in parse_reparse_wsl_symlink()
1047 return -ENOMEM; in parse_reparse_wsl_symlink()
1048 symname_utf16_len = utf8s_to_utf16s(buf->Target, symname_utf8_len, in parse_reparse_wsl_symlink()
1057 data->symlink_target = cifs_strndup_from_utf16((u8 *)symname_utf16, in parse_reparse_wsl_symlink()
1059 cifs_sb->local_nls); in parse_reparse_wsl_symlink()
1061 if (!data->symlink_target) in parse_reparse_wsl_symlink()
1062 return -ENOMEM; in parse_reparse_wsl_symlink()
1070 struct cifs_open_info_data *data) in parse_reparse_point() argument
1072 data->reparse.buf = buf; in parse_reparse_point()
1074 /* See MS-FSCC 2.1.2 */ in parse_reparse_point()
1075 switch (le32_to_cpu(buf->ReparseTag)) { in parse_reparse_point()
1078 cifs_sb, data); in parse_reparse_point()
1082 plen, cifs_sb, full_path, data); in parse_reparse_point()
1086 cifs_sb, data); in parse_reparse_point()
1091 if (le16_to_cpu(buf->ReparseDataLength) != 0) { in parse_reparse_point()
1093 le32_to_cpu(buf->ReparseTag)); in parse_reparse_point()
1094 return -EIO; in parse_reparse_point()
1098 return -EOPNOTSUPP; in parse_reparse_point()
1105 struct cifs_open_info_data *data) in smb2_parse_reparse_point() argument
1108 struct smb2_ioctl_rsp *io = rsp_iov->iov_base; in smb2_parse_reparse_point()
1109 u32 plen = le32_to_cpu(io->OutputCount); in smb2_parse_reparse_point()
1112 le32_to_cpu(io->OutputOffset)); in smb2_parse_reparse_point()
1113 return parse_reparse_point(buf, plen, cifs_sb, full_path, data); in smb2_parse_reparse_point()
1116 static bool wsl_to_fattr(struct cifs_open_info_data *data, in wsl_to_fattr() argument
1126 fattr->cf_mode |= S_IFLNK; in wsl_to_fattr()
1129 fattr->cf_mode |= S_IFIFO; in wsl_to_fattr()
1132 fattr->cf_mode |= S_IFSOCK; in wsl_to_fattr()
1135 fattr->cf_mode |= S_IFCHR; in wsl_to_fattr()
1138 fattr->cf_mode |= S_IFBLK; in wsl_to_fattr()
1142 if (!data->wsl.eas_len) in wsl_to_fattr()
1145 ea = (struct smb2_file_full_ea_info *)data->wsl.eas; in wsl_to_fattr()
1152 next = le32_to_cpu(ea->next_entry_offset); in wsl_to_fattr()
1153 if (!le16_to_cpu(ea->ea_value_length)) in wsl_to_fattr()
1156 name = ea->ea_data; in wsl_to_fattr()
1157 nlen = ea->ea_name_length; in wsl_to_fattr()
1158 v = (void *)((u8 *)ea->ea_data + ea->ea_name_length + 1); in wsl_to_fattr()
1161 fattr->cf_uid = wsl_make_kuid(cifs_sb, v); in wsl_to_fattr()
1163 fattr->cf_gid = wsl_make_kgid(cifs_sb, v); in wsl_to_fattr()
1166 if (S_DT(fattr->cf_mode) != S_DT(le32_to_cpu(*(__le32 *)v))) in wsl_to_fattr()
1168 fattr->cf_mode = (umode_t)le32_to_cpu(*(__le32 *)v); in wsl_to_fattr()
1170 fattr->cf_rdev = reparse_mkdev(v); in wsl_to_fattr()
1180 fattr->cf_dtype = S_DT(fattr->cf_mode); in wsl_to_fattr()
1186 struct cifs_open_info_data *data) in posix_reparse_to_fattr() argument
1188 struct reparse_nfs_data_buffer *buf = (struct reparse_nfs_data_buffer *)data->reparse.buf; in posix_reparse_to_fattr()
1193 if (le16_to_cpu(buf->ReparseDataLength) < sizeof(buf->InodeType)) { in posix_reparse_to_fattr()
1198 switch (le64_to_cpu(buf->InodeType)) { in posix_reparse_to_fattr()
1200 if (le16_to_cpu(buf->ReparseDataLength) != sizeof(buf->InodeType) + 8) { in posix_reparse_to_fattr()
1204 fattr->cf_mode |= S_IFCHR; in posix_reparse_to_fattr()
1205 fattr->cf_rdev = reparse_mkdev(buf->DataBuffer); in posix_reparse_to_fattr()
1208 if (le16_to_cpu(buf->ReparseDataLength) != sizeof(buf->InodeType) + 8) { in posix_reparse_to_fattr()
1212 fattr->cf_mode |= S_IFBLK; in posix_reparse_to_fattr()
1213 fattr->cf_rdev = reparse_mkdev(buf->DataBuffer); in posix_reparse_to_fattr()
1216 fattr->cf_mode |= S_IFIFO; in posix_reparse_to_fattr()
1219 fattr->cf_mode |= S_IFSOCK; in posix_reparse_to_fattr()
1222 fattr->cf_mode |= S_IFLNK; in posix_reparse_to_fattr()
1233 struct cifs_open_info_data *data) in cifs_reparse_point_to_fattr() argument
1235 u32 tag = data->reparse.tag; in cifs_reparse_point_to_fattr()
1240 if (!(fattr->cf_cifsattrs & ATTR_DIRECTORY)) in cifs_reparse_point_to_fattr()
1247 fattr->cf_mode = S_IFDIR | 0711; in cifs_reparse_point_to_fattr()
1254 ok = wsl_to_fattr(data, cifs_sb, tag, fattr); in cifs_reparse_point_to_fattr()
1259 ok = posix_reparse_to_fattr(cifs_sb, fattr, data); in cifs_reparse_point_to_fattr()
1265 fattr->cf_mode |= S_IFLNK; in cifs_reparse_point_to_fattr()
1271 fattr->cf_dtype = S_DT(fattr->cf_mode); in cifs_reparse_point_to_fattr()