@@ -2381,10 +2381,12 @@ static int smb2_create_sd_buffer(struct ksmbd_work *work,
2381
2381
le32_to_cpu (sd_buf -> ccontext .DataLength ), true);
2382
2382
}
2383
2383
2384
- static void ksmbd_acls_fattr (struct smb_fattr * fattr , struct inode * inode )
2384
+ static void ksmbd_acls_fattr (struct smb_fattr * fattr ,
2385
+ struct user_namespace * mnt_userns ,
2386
+ struct inode * inode )
2385
2387
{
2386
- fattr -> cf_uid = inode -> i_uid ;
2387
- fattr -> cf_gid = inode -> i_gid ;
2388
+ fattr -> cf_uid = i_uid_into_mnt ( mnt_userns , inode ) ;
2389
+ fattr -> cf_gid = i_gid_into_mnt ( mnt_userns , inode ) ;
2388
2390
fattr -> cf_mode = inode -> i_mode ;
2389
2391
fattr -> cf_acls = NULL ;
2390
2392
fattr -> cf_dacls = NULL ;
@@ -2893,7 +2895,7 @@ int smb2_open(struct ksmbd_work *work)
2893
2895
struct smb_ntsd * pntsd ;
2894
2896
int pntsd_size , ace_num = 0 ;
2895
2897
2896
- ksmbd_acls_fattr (& fattr , inode );
2898
+ ksmbd_acls_fattr (& fattr , user_ns , inode );
2897
2899
if (fattr .cf_acls )
2898
2900
ace_num = fattr .cf_acls -> a_count ;
2899
2901
if (fattr .cf_dacls )
@@ -3324,7 +3326,6 @@ static int dentry_name(struct ksmbd_dir_info *d_info, int info_level)
3324
3326
*/
3325
3327
static int smb2_populate_readdir_entry (struct ksmbd_conn * conn , int info_level ,
3326
3328
struct ksmbd_dir_info * d_info ,
3327
- struct user_namespace * user_ns ,
3328
3329
struct ksmbd_kstat * ksmbd_kstat )
3329
3330
{
3330
3331
int next_entry_offset = 0 ;
@@ -3478,9 +3479,9 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
3478
3479
S_ISDIR (ksmbd_kstat -> kstat -> mode ) ? ATTR_DIRECTORY_LE : ATTR_ARCHIVE_LE ;
3479
3480
if (d_info -> hide_dot_file && d_info -> name [0 ] == '.' )
3480
3481
posix_info -> DosAttributes |= ATTR_HIDDEN_LE ;
3481
- id_to_sid (from_kuid ( user_ns , ksmbd_kstat -> kstat -> uid ),
3482
+ id_to_sid (from_kuid_munged ( & init_user_ns , ksmbd_kstat -> kstat -> uid ),
3482
3483
SIDNFS_USER , (struct smb_sid * )& posix_info -> SidBuffer [0 ]);
3483
- id_to_sid (from_kgid ( user_ns , ksmbd_kstat -> kstat -> gid ),
3484
+ id_to_sid (from_kgid_munged ( & init_user_ns , ksmbd_kstat -> kstat -> gid ),
3484
3485
SIDNFS_GROUP , (struct smb_sid * )& posix_info -> SidBuffer [20 ]);
3485
3486
memcpy (posix_info -> name , conv_name , conv_len );
3486
3487
posix_info -> name_len = cpu_to_le32 (conv_len );
@@ -3543,9 +3544,9 @@ static int process_query_dir_entries(struct smb2_query_dir_private *priv)
3543
3544
return - EINVAL ;
3544
3545
3545
3546
lock_dir (priv -> dir_fp );
3546
- dent = lookup_one_len ( priv -> d_info -> name ,
3547
- priv -> dir_fp -> filp -> f_path .dentry ,
3548
- priv -> d_info -> name_len );
3547
+ dent = lookup_one ( user_ns , priv -> d_info -> name ,
3548
+ priv -> dir_fp -> filp -> f_path .dentry ,
3549
+ priv -> d_info -> name_len );
3549
3550
unlock_dir (priv -> dir_fp );
3550
3551
3551
3552
if (IS_ERR (dent )) {
@@ -3571,7 +3572,6 @@ static int process_query_dir_entries(struct smb2_query_dir_private *priv)
3571
3572
rc = smb2_populate_readdir_entry (priv -> work -> conn ,
3572
3573
priv -> info_level ,
3573
3574
priv -> d_info ,
3574
- user_ns ,
3575
3575
& ksmbd_kstat );
3576
3576
dput (dent );
3577
3577
if (rc )
@@ -5008,7 +5008,7 @@ static int smb2_get_info_sec(struct ksmbd_work *work,
5008
5008
5009
5009
user_ns = file_mnt_user_ns (fp -> filp );
5010
5010
inode = file_inode (fp -> filp );
5011
- ksmbd_acls_fattr (& fattr , inode );
5011
+ ksmbd_acls_fattr (& fattr , user_ns , inode );
5012
5012
5013
5013
if (test_share_config_flag (work -> tcon -> share_conf ,
5014
5014
KSMBD_SHARE_FLAG_ACL_XATTR ))
@@ -5246,7 +5246,9 @@ int smb2_echo(struct ksmbd_work *work)
5246
5246
return 0 ;
5247
5247
}
5248
5248
5249
- static int smb2_rename (struct ksmbd_work * work , struct ksmbd_file * fp ,
5249
+ static int smb2_rename (struct ksmbd_work * work ,
5250
+ struct ksmbd_file * fp ,
5251
+ struct user_namespace * user_ns ,
5250
5252
struct smb2_file_rename_info * file_info ,
5251
5253
struct nls_table * local_nls )
5252
5254
{
@@ -5310,7 +5312,7 @@ static int smb2_rename(struct ksmbd_work *work, struct ksmbd_file *fp,
5310
5312
if (rc )
5311
5313
goto out ;
5312
5314
5313
- rc = ksmbd_vfs_setxattr (file_mnt_user_ns ( fp -> filp ) ,
5315
+ rc = ksmbd_vfs_setxattr (user_ns ,
5314
5316
fp -> filp -> f_path .dentry ,
5315
5317
xattr_stream_name ,
5316
5318
NULL , 0 , 0 );
@@ -5438,11 +5440,11 @@ static int set_file_basic_info(struct ksmbd_file *fp, char *buf,
5438
5440
{
5439
5441
struct smb2_file_all_info * file_info ;
5440
5442
struct iattr attrs ;
5441
- struct iattr temp_attrs ;
5443
+ struct timespec64 ctime ;
5442
5444
struct file * filp ;
5443
5445
struct inode * inode ;
5444
5446
struct user_namespace * user_ns ;
5445
- int rc ;
5447
+ int rc = 0 ;
5446
5448
5447
5449
if (!(fp -> daccess & FILE_WRITE_ATTRIBUTES_LE ))
5448
5450
return - EACCES ;
@@ -5462,11 +5464,11 @@ static int set_file_basic_info(struct ksmbd_file *fp, char *buf,
5462
5464
}
5463
5465
5464
5466
if (file_info -> ChangeTime ) {
5465
- temp_attrs .ia_ctime = ksmbd_NTtimeToUnix (file_info -> ChangeTime );
5466
- attrs . ia_ctime = temp_attrs .ia_ctime ;
5467
+ attrs .ia_ctime = ksmbd_NTtimeToUnix (file_info -> ChangeTime );
5468
+ ctime = attrs .ia_ctime ;
5467
5469
attrs .ia_valid |= ATTR_CTIME ;
5468
5470
} else {
5469
- temp_attrs . ia_ctime = inode -> i_ctime ;
5471
+ ctime = inode -> i_ctime ;
5470
5472
}
5471
5473
5472
5474
if (file_info -> LastWriteTime ) {
@@ -5505,31 +5507,22 @@ static int set_file_basic_info(struct ksmbd_file *fp, char *buf,
5505
5507
rc = 0 ;
5506
5508
}
5507
5509
5508
- /*
5509
- * HACK : set ctime here to avoid ctime changed
5510
- * when file_info->ChangeTime is zero.
5511
- */
5512
- attrs .ia_ctime = temp_attrs .ia_ctime ;
5513
- attrs .ia_valid |= ATTR_CTIME ;
5514
-
5515
5510
if (attrs .ia_valid ) {
5516
5511
struct dentry * dentry = filp -> f_path .dentry ;
5517
5512
struct inode * inode = d_inode (dentry );
5518
5513
5519
5514
if (IS_IMMUTABLE (inode ) || IS_APPEND (inode ))
5520
5515
return - EACCES ;
5521
5516
5522
- rc = setattr_prepare (user_ns , dentry , & attrs );
5523
- if (rc )
5524
- return - EINVAL ;
5525
-
5526
5517
inode_lock (inode );
5527
- setattr_copy (user_ns , inode , & attrs );
5528
- attrs .ia_valid &= ~ATTR_CTIME ;
5529
5518
rc = notify_change (user_ns , dentry , & attrs , NULL );
5519
+ if (!rc ) {
5520
+ inode -> i_ctime = ctime ;
5521
+ mark_inode_dirty (inode );
5522
+ }
5530
5523
inode_unlock (inode );
5531
5524
}
5532
- return 0 ;
5525
+ return rc ;
5533
5526
}
5534
5527
5535
5528
static int set_file_allocation_info (struct ksmbd_work * work ,
@@ -5624,6 +5617,7 @@ static int set_end_of_file_info(struct ksmbd_work *work, struct ksmbd_file *fp,
5624
5617
static int set_rename_info (struct ksmbd_work * work , struct ksmbd_file * fp ,
5625
5618
char * buf )
5626
5619
{
5620
+ struct user_namespace * user_ns ;
5627
5621
struct ksmbd_file * parent_fp ;
5628
5622
struct dentry * parent ;
5629
5623
struct dentry * dentry = fp -> filp -> f_path .dentry ;
@@ -5634,11 +5628,12 @@ static int set_rename_info(struct ksmbd_work *work, struct ksmbd_file *fp,
5634
5628
return - EACCES ;
5635
5629
}
5636
5630
5631
+ user_ns = file_mnt_user_ns (fp -> filp );
5637
5632
if (ksmbd_stream_fd (fp ))
5638
5633
goto next ;
5639
5634
5640
5635
parent = dget_parent (dentry );
5641
- ret = ksmbd_vfs_lock_parent (parent , dentry );
5636
+ ret = ksmbd_vfs_lock_parent (user_ns , parent , dentry );
5642
5637
if (ret ) {
5643
5638
dput (parent );
5644
5639
return ret ;
@@ -5655,7 +5650,7 @@ static int set_rename_info(struct ksmbd_work *work, struct ksmbd_file *fp,
5655
5650
}
5656
5651
}
5657
5652
next :
5658
- return smb2_rename (work , fp ,
5653
+ return smb2_rename (work , fp , user_ns ,
5659
5654
(struct smb2_file_rename_info * )buf ,
5660
5655
work -> sess -> conn -> local_nls );
5661
5656
}
@@ -7116,8 +7111,8 @@ static int fsctl_query_iface_info_ioctl(struct ksmbd_conn *conn,
7116
7111
netdev -> ethtool_ops -> get_link_ksettings (netdev , & cmd );
7117
7112
speed = cmd .base .speed ;
7118
7113
} else {
7119
- pr_err ( "%s %s\n" , netdev -> name ,
7120
- "speed is unknown, defaulting to 1Gb/sec" );
7114
+ ksmbd_debug ( SMB , "%s %s\n" , netdev -> name ,
7115
+ "speed is unknown, defaulting to 1Gb/sec" );
7121
7116
speed = SPEED_1000 ;
7122
7117
}
7123
7118
0 commit comments