@@ -4872,8 +4872,13 @@ static int get_file_standard_info(struct smb2_query_info_rsp *rsp,
4872
4872
sinfo = (struct smb2_file_standard_info * )rsp -> Buffer ;
4873
4873
delete_pending = ksmbd_inode_pending_delete (fp );
4874
4874
4875
- sinfo -> AllocationSize = cpu_to_le64 (stat .blocks << 9 );
4876
- sinfo -> EndOfFile = S_ISDIR (stat .mode ) ? 0 : cpu_to_le64 (stat .size );
4875
+ if (ksmbd_stream_fd (fp ) == false) {
4876
+ sinfo -> AllocationSize = cpu_to_le64 (stat .blocks << 9 );
4877
+ sinfo -> EndOfFile = S_ISDIR (stat .mode ) ? 0 : cpu_to_le64 (stat .size );
4878
+ } else {
4879
+ sinfo -> AllocationSize = cpu_to_le64 (fp -> stream .size );
4880
+ sinfo -> EndOfFile = cpu_to_le64 (fp -> stream .size );
4881
+ }
4877
4882
sinfo -> NumberOfLinks = cpu_to_le32 (get_nlink (& stat ) - delete_pending );
4878
4883
sinfo -> DeletePending = delete_pending ;
4879
4884
sinfo -> Directory = S_ISDIR (stat .mode ) ? 1 : 0 ;
@@ -4936,9 +4941,14 @@ static int get_file_all_info(struct ksmbd_work *work,
4936
4941
file_info -> ChangeTime = cpu_to_le64 (time );
4937
4942
file_info -> Attributes = fp -> f_ci -> m_fattr ;
4938
4943
file_info -> Pad1 = 0 ;
4939
- file_info -> AllocationSize =
4940
- cpu_to_le64 (stat .blocks << 9 );
4941
- file_info -> EndOfFile = S_ISDIR (stat .mode ) ? 0 : cpu_to_le64 (stat .size );
4944
+ if (ksmbd_stream_fd (fp ) == false) {
4945
+ file_info -> AllocationSize =
4946
+ cpu_to_le64 (stat .blocks << 9 );
4947
+ file_info -> EndOfFile = S_ISDIR (stat .mode ) ? 0 : cpu_to_le64 (stat .size );
4948
+ } else {
4949
+ file_info -> AllocationSize = cpu_to_le64 (fp -> stream .size );
4950
+ file_info -> EndOfFile = cpu_to_le64 (fp -> stream .size );
4951
+ }
4942
4952
file_info -> NumberOfLinks =
4943
4953
cpu_to_le32 (get_nlink (& stat ) - delete_pending );
4944
4954
file_info -> DeletePending = delete_pending ;
@@ -4947,7 +4957,10 @@ static int get_file_all_info(struct ksmbd_work *work,
4947
4957
file_info -> IndexNumber = cpu_to_le64 (stat .ino );
4948
4958
file_info -> EASize = 0 ;
4949
4959
file_info -> AccessFlags = fp -> daccess ;
4950
- file_info -> CurrentByteOffset = cpu_to_le64 (fp -> filp -> f_pos );
4960
+ if (ksmbd_stream_fd (fp ) == false)
4961
+ file_info -> CurrentByteOffset = cpu_to_le64 (fp -> filp -> f_pos );
4962
+ else
4963
+ file_info -> CurrentByteOffset = cpu_to_le64 (fp -> stream .pos );
4951
4964
file_info -> Mode = fp -> coption ;
4952
4965
file_info -> AlignmentRequirement = 0 ;
4953
4966
conv_len = smbConvertToUTF16 ((__le16 * )file_info -> FileName , filename ,
@@ -5135,8 +5148,13 @@ static int get_file_network_open_info(struct smb2_query_info_rsp *rsp,
5135
5148
time = ksmbd_UnixTimeToNT (stat .ctime );
5136
5149
file_info -> ChangeTime = cpu_to_le64 (time );
5137
5150
file_info -> Attributes = fp -> f_ci -> m_fattr ;
5138
- file_info -> AllocationSize = cpu_to_le64 (stat .blocks << 9 );
5139
- file_info -> EndOfFile = S_ISDIR (stat .mode ) ? 0 : cpu_to_le64 (stat .size );
5151
+ if (ksmbd_stream_fd (fp ) == false) {
5152
+ file_info -> AllocationSize = cpu_to_le64 (stat .blocks << 9 );
5153
+ file_info -> EndOfFile = S_ISDIR (stat .mode ) ? 0 : cpu_to_le64 (stat .size );
5154
+ } else {
5155
+ file_info -> AllocationSize = cpu_to_le64 (fp -> stream .size );
5156
+ file_info -> EndOfFile = cpu_to_le64 (fp -> stream .size );
5157
+ }
5140
5158
file_info -> Reserved = cpu_to_le32 (0 );
5141
5159
rsp -> OutputBufferLength =
5142
5160
cpu_to_le32 (sizeof (struct smb2_file_ntwrk_info ));
@@ -5159,7 +5177,11 @@ static void get_file_position_info(struct smb2_query_info_rsp *rsp,
5159
5177
struct smb2_file_pos_info * file_info ;
5160
5178
5161
5179
file_info = (struct smb2_file_pos_info * )rsp -> Buffer ;
5162
- file_info -> CurrentByteOffset = cpu_to_le64 (fp -> filp -> f_pos );
5180
+ if (ksmbd_stream_fd (fp ) == false)
5181
+ file_info -> CurrentByteOffset = cpu_to_le64 (fp -> filp -> f_pos );
5182
+ else
5183
+ file_info -> CurrentByteOffset = cpu_to_le64 (fp -> stream .pos );
5184
+
5163
5185
rsp -> OutputBufferLength =
5164
5186
cpu_to_le32 (sizeof (struct smb2_file_pos_info ));
5165
5187
}
@@ -5248,8 +5270,13 @@ static int find_file_posix_info(struct smb2_query_info_rsp *rsp,
5248
5270
file_info -> ChangeTime = cpu_to_le64 (time );
5249
5271
file_info -> DosAttributes = fp -> f_ci -> m_fattr ;
5250
5272
file_info -> Inode = cpu_to_le64 (stat .ino );
5251
- file_info -> EndOfFile = cpu_to_le64 (stat .size );
5252
- file_info -> AllocationSize = cpu_to_le64 (stat .blocks << 9 );
5273
+ if (ksmbd_stream_fd (fp ) == false) {
5274
+ file_info -> EndOfFile = cpu_to_le64 (stat .size );
5275
+ file_info -> AllocationSize = cpu_to_le64 (stat .blocks << 9 );
5276
+ } else {
5277
+ file_info -> EndOfFile = cpu_to_le64 (fp -> stream .size );
5278
+ file_info -> AllocationSize = cpu_to_le64 (fp -> stream .size );
5279
+ }
5253
5280
file_info -> HardLinks = cpu_to_le32 (stat .nlink );
5254
5281
file_info -> Mode = cpu_to_le32 (stat .mode & 0777 );
5255
5282
switch (stat .mode & S_IFMT ) {
@@ -6191,6 +6218,9 @@ static int set_file_allocation_info(struct ksmbd_work *work,
6191
6218
if (!(fp -> daccess & FILE_WRITE_DATA_LE ))
6192
6219
return - EACCES ;
6193
6220
6221
+ if (ksmbd_stream_fd (fp ) == true)
6222
+ return 0 ;
6223
+
6194
6224
rc = vfs_getattr (& fp -> filp -> f_path , & stat , STATX_BASIC_STATS ,
6195
6225
AT_STATX_SYNC_AS_STAT );
6196
6226
if (rc )
@@ -6249,7 +6279,8 @@ static int set_end_of_file_info(struct ksmbd_work *work, struct ksmbd_file *fp,
6249
6279
* truncate of some filesystem like FAT32 fill zero data in
6250
6280
* truncated range.
6251
6281
*/
6252
- if (inode -> i_sb -> s_magic != MSDOS_SUPER_MAGIC ) {
6282
+ if (inode -> i_sb -> s_magic != MSDOS_SUPER_MAGIC &&
6283
+ ksmbd_stream_fd (fp ) == false) {
6253
6284
ksmbd_debug (SMB , "truncated to newsize %lld\n" , newsize );
6254
6285
rc = ksmbd_vfs_truncate (work , fp , newsize );
6255
6286
if (rc ) {
@@ -6322,7 +6353,13 @@ static int set_file_position_info(struct ksmbd_file *fp,
6322
6353
return - EINVAL ;
6323
6354
}
6324
6355
6325
- fp -> filp -> f_pos = current_byte_offset ;
6356
+ if (ksmbd_stream_fd (fp ) == false)
6357
+ fp -> filp -> f_pos = current_byte_offset ;
6358
+ else {
6359
+ if (current_byte_offset > XATTR_SIZE_MAX )
6360
+ current_byte_offset = XATTR_SIZE_MAX ;
6361
+ fp -> stream .pos = current_byte_offset ;
6362
+ }
6326
6363
return 0 ;
6327
6364
}
6328
6365
0 commit comments