@@ -691,29 +691,36 @@ static void smb311_posix_info_to_fattr(struct cifs_fattr *fattr,
691
691
fattr -> cf_mtime .tv_sec += tcon -> ses -> server -> timeAdj ;
692
692
}
693
693
694
+ /*
695
+ * The srv fs device id is overridden on network mount so setting
696
+ * @fattr->cf_rdev isn't needed here.
697
+ */
694
698
fattr -> cf_eof = le64_to_cpu (info -> EndOfFile );
695
699
fattr -> cf_bytes = le64_to_cpu (info -> AllocationSize );
696
700
fattr -> cf_createtime = le64_to_cpu (info -> CreationTime );
697
-
698
701
fattr -> cf_nlink = le32_to_cpu (info -> HardLinks );
699
702
fattr -> cf_mode = (umode_t ) le32_to_cpu (info -> Mode );
700
- /* The srv fs device id is overridden on network mount so setting rdev isn't needed here */
701
- /* fattr->cf_rdev = le32_to_cpu(info->DeviceId); */
702
703
703
- if (data -> symlink ) {
704
- fattr -> cf_mode |= S_IFLNK ;
705
- fattr -> cf_dtype = DT_LNK ;
706
- fattr -> cf_symlink_target = data -> symlink_target ;
707
- data -> symlink_target = NULL ;
708
- } else if (fattr -> cf_cifsattrs & ATTR_DIRECTORY ) {
704
+ if (cifs_open_data_reparse ( data ) &&
705
+ cifs_reparse_point_to_fattr ( cifs_sb , fattr , data ))
706
+ goto out_reparse ;
707
+
708
+ fattr -> cf_mode &= ~ S_IFMT ;
709
+ if (fattr -> cf_cifsattrs & ATTR_DIRECTORY ) {
709
710
fattr -> cf_mode |= S_IFDIR ;
710
711
fattr -> cf_dtype = DT_DIR ;
711
712
} else { /* file */
712
713
fattr -> cf_mode |= S_IFREG ;
713
714
fattr -> cf_dtype = DT_REG ;
714
715
}
715
- /* else if reparse point ... TODO: add support for FIFO and blk dev; special file types */
716
716
717
+ out_reparse :
718
+ if (S_ISLNK (fattr -> cf_mode )) {
719
+ if (likely (data -> symlink_target ))
720
+ fattr -> cf_eof = strnlen (data -> symlink_target , PATH_MAX );
721
+ fattr -> cf_symlink_target = data -> symlink_target ;
722
+ data -> symlink_target = NULL ;
723
+ }
717
724
sid_to_id (cifs_sb , owner , fattr , SIDOWNER );
718
725
sid_to_id (cifs_sb , group , fattr , SIDGROUP );
719
726
@@ -738,25 +745,25 @@ bool cifs_reparse_point_to_fattr(struct cifs_sb_info *cifs_sb,
738
745
if (tag == IO_REPARSE_TAG_NFS && buf ) {
739
746
switch (le64_to_cpu (buf -> InodeType )) {
740
747
case NFS_SPECFILE_CHR :
741
- fattr -> cf_mode |= S_IFCHR | cifs_sb -> ctx -> file_mode ;
748
+ fattr -> cf_mode |= S_IFCHR ;
742
749
fattr -> cf_dtype = DT_CHR ;
743
750
fattr -> cf_rdev = nfs_mkdev (buf );
744
751
break ;
745
752
case NFS_SPECFILE_BLK :
746
- fattr -> cf_mode |= S_IFBLK | cifs_sb -> ctx -> file_mode ;
753
+ fattr -> cf_mode |= S_IFBLK ;
747
754
fattr -> cf_dtype = DT_BLK ;
748
755
fattr -> cf_rdev = nfs_mkdev (buf );
749
756
break ;
750
757
case NFS_SPECFILE_FIFO :
751
- fattr -> cf_mode |= S_IFIFO | cifs_sb -> ctx -> file_mode ;
758
+ fattr -> cf_mode |= S_IFIFO ;
752
759
fattr -> cf_dtype = DT_FIFO ;
753
760
break ;
754
761
case NFS_SPECFILE_SOCK :
755
- fattr -> cf_mode |= S_IFSOCK | cifs_sb -> ctx -> file_mode ;
762
+ fattr -> cf_mode |= S_IFSOCK ;
756
763
fattr -> cf_dtype = DT_SOCK ;
757
764
break ;
758
765
case NFS_SPECFILE_LNK :
759
- fattr -> cf_mode = S_IFLNK | cifs_sb -> ctx -> file_mode ;
766
+ fattr -> cf_mode | = S_IFLNK ;
760
767
fattr -> cf_dtype = DT_LNK ;
761
768
break ;
762
769
default :
@@ -768,29 +775,29 @@ bool cifs_reparse_point_to_fattr(struct cifs_sb_info *cifs_sb,
768
775
769
776
switch (tag ) {
770
777
case IO_REPARSE_TAG_LX_SYMLINK :
771
- fattr -> cf_mode |= S_IFLNK | cifs_sb -> ctx -> file_mode ;
778
+ fattr -> cf_mode |= S_IFLNK ;
772
779
fattr -> cf_dtype = DT_LNK ;
773
780
break ;
774
781
case IO_REPARSE_TAG_LX_FIFO :
775
- fattr -> cf_mode |= S_IFIFO | cifs_sb -> ctx -> file_mode ;
782
+ fattr -> cf_mode |= S_IFIFO ;
776
783
fattr -> cf_dtype = DT_FIFO ;
777
784
break ;
778
785
case IO_REPARSE_TAG_AF_UNIX :
779
- fattr -> cf_mode |= S_IFSOCK | cifs_sb -> ctx -> file_mode ;
786
+ fattr -> cf_mode |= S_IFSOCK ;
780
787
fattr -> cf_dtype = DT_SOCK ;
781
788
break ;
782
789
case IO_REPARSE_TAG_LX_CHR :
783
- fattr -> cf_mode |= S_IFCHR | cifs_sb -> ctx -> file_mode ;
790
+ fattr -> cf_mode |= S_IFCHR ;
784
791
fattr -> cf_dtype = DT_CHR ;
785
792
break ;
786
793
case IO_REPARSE_TAG_LX_BLK :
787
- fattr -> cf_mode |= S_IFBLK | cifs_sb -> ctx -> file_mode ;
794
+ fattr -> cf_mode |= S_IFBLK ;
788
795
fattr -> cf_dtype = DT_BLK ;
789
796
break ;
790
797
case 0 : /* SMB1 symlink */
791
798
case IO_REPARSE_TAG_SYMLINK :
792
799
case IO_REPARSE_TAG_NFS :
793
- fattr -> cf_mode = S_IFLNK | cifs_sb -> ctx -> file_mode ;
800
+ fattr -> cf_mode | = S_IFLNK ;
794
801
fattr -> cf_dtype = DT_LNK ;
795
802
break ;
796
803
default :
@@ -830,6 +837,7 @@ static void cifs_open_info_to_fattr(struct cifs_fattr *fattr,
830
837
fattr -> cf_createtime = le64_to_cpu (info -> CreationTime );
831
838
fattr -> cf_nlink = le32_to_cpu (info -> NumberOfLinks );
832
839
840
+ fattr -> cf_mode = cifs_sb -> ctx -> file_mode ;
833
841
if (cifs_open_data_reparse (data ) &&
834
842
cifs_reparse_point_to_fattr (cifs_sb , fattr , data ))
835
843
goto out_reparse ;
0 commit comments