@@ -682,6 +682,44 @@ struct nfs_client *nfs_init_client(struct nfs_client *clp,
682
682
}
683
683
EXPORT_SYMBOL_GPL (nfs_init_client );
684
684
685
+ static void nfs4_server_set_init_caps (struct nfs_server * server )
686
+ {
687
+ #if IS_ENABLED (CONFIG_NFS_V4 )
688
+ /* Set the basic capabilities */
689
+ server -> caps = server -> nfs_client -> cl_mvops -> init_caps ;
690
+ if (server -> flags & NFS_MOUNT_NORDIRPLUS )
691
+ server -> caps &= ~NFS_CAP_READDIRPLUS ;
692
+ if (server -> nfs_client -> cl_proto == XPRT_TRANSPORT_RDMA )
693
+ server -> caps &= ~NFS_CAP_READ_PLUS ;
694
+
695
+ /*
696
+ * Don't use NFS uid/gid mapping if we're using AUTH_SYS or lower
697
+ * authentication.
698
+ */
699
+ if (nfs4_disable_idmapping &&
700
+ server -> client -> cl_auth -> au_flavor == RPC_AUTH_UNIX )
701
+ server -> caps |= NFS_CAP_UIDGID_NOMAP ;
702
+ #endif
703
+ }
704
+
705
+ void nfs_server_set_init_caps (struct nfs_server * server )
706
+ {
707
+ switch (server -> nfs_client -> rpc_ops -> version ) {
708
+ case 2 :
709
+ server -> caps = NFS_CAP_HARDLINKS | NFS_CAP_SYMLINKS ;
710
+ break ;
711
+ case 3 :
712
+ server -> caps = NFS_CAP_HARDLINKS | NFS_CAP_SYMLINKS ;
713
+ if (!(server -> flags & NFS_MOUNT_NORDIRPLUS ))
714
+ server -> caps |= NFS_CAP_READDIRPLUS ;
715
+ break ;
716
+ default :
717
+ nfs4_server_set_init_caps (server );
718
+ break ;
719
+ }
720
+ }
721
+ EXPORT_SYMBOL_GPL (nfs_server_set_init_caps );
722
+
685
723
/*
686
724
* Create a version 2 or 3 client
687
725
*/
@@ -726,7 +764,6 @@ static int nfs_init_server(struct nfs_server *server,
726
764
/* Initialise the client representation from the mount data */
727
765
server -> flags = ctx -> flags ;
728
766
server -> options = ctx -> options ;
729
- server -> caps |= NFS_CAP_HARDLINKS | NFS_CAP_SYMLINKS ;
730
767
731
768
switch (clp -> rpc_ops -> version ) {
732
769
case 2 :
@@ -762,6 +799,8 @@ static int nfs_init_server(struct nfs_server *server,
762
799
if (error < 0 )
763
800
goto error ;
764
801
802
+ nfs_server_set_init_caps (server );
803
+
765
804
/* Preserve the values of mount_server-related mount options */
766
805
if (ctx -> mount_server .addrlen ) {
767
806
memcpy (& server -> mountd_address , & ctx -> mount_server .address ,
@@ -934,7 +973,6 @@ void nfs_server_copy_userdata(struct nfs_server *target, struct nfs_server *sour
934
973
target -> acregmax = source -> acregmax ;
935
974
target -> acdirmin = source -> acdirmin ;
936
975
target -> acdirmax = source -> acdirmax ;
937
- target -> caps = source -> caps ;
938
976
target -> options = source -> options ;
939
977
target -> auth_info = source -> auth_info ;
940
978
target -> port = source -> port ;
@@ -1169,6 +1207,8 @@ struct nfs_server *nfs_clone_server(struct nfs_server *source,
1169
1207
if (error < 0 )
1170
1208
goto out_free_server ;
1171
1209
1210
+ nfs_server_set_init_caps (server );
1211
+
1172
1212
/* probe the filesystem info for this server filesystem */
1173
1213
error = nfs_probe_server (server , fh );
1174
1214
if (error < 0 )
0 commit comments