@@ -108,6 +108,21 @@ static struct rpc_program nfs_program = {
108
108
.pipe_dir_name = "/nfs" ,
109
109
};
110
110
111
+ #ifdef CONFIG_NFS_V3_ACL
112
+ static struct rpc_stat nfsacl_rpcstat = { & nfsacl_program };
113
+ static struct rpc_version * nfsacl_version [] = {
114
+ [3 ] = & nfsacl_version3 ,
115
+ };
116
+
117
+ struct rpc_program nfsacl_program = {
118
+ .name = "nfsacl" ,
119
+ .number = NFS_ACL_PROGRAM ,
120
+ .nrvers = sizeof (nfsacl_version ) / sizeof (nfsacl_version [0 ]),
121
+ .version = nfsacl_version ,
122
+ .stats = & nfsacl_rpcstat ,
123
+ };
124
+ #endif /* CONFIG_NFS_V3_ACL */
125
+
111
126
static inline unsigned long
112
127
nfs_fattr_to_ino_t (struct nfs_fattr * fattr )
113
128
{
@@ -165,6 +180,9 @@ nfs_umount_begin(struct super_block *sb)
165
180
/* -EIO all pending I/O */
166
181
if (!IS_ERR (rpc ))
167
182
rpc_killall_tasks (rpc );
183
+ rpc = NFS_SB (sb )-> client_acl ;
184
+ if (!IS_ERR (rpc ))
185
+ rpc_killall_tasks (rpc );
168
186
}
169
187
170
188
@@ -461,8 +479,17 @@ nfs_fill_super(struct super_block *sb, struct nfs_mount_data *data, int silent)
461
479
atomic_inc (& server -> client -> cl_count );
462
480
server -> client_sys = server -> client ;
463
481
}
464
-
465
482
if (server -> flags & NFS_MOUNT_VER3 ) {
483
+ #ifdef CONFIG_NFS_V3_ACL
484
+ if (!(server -> flags & NFS_MOUNT_NOACL )) {
485
+ server -> client_acl = rpc_bind_new_program (server -> client , & nfsacl_program , 3 );
486
+ /* No errors! Assume that Sun nfsacls are supported */
487
+ if (!IS_ERR (server -> client_acl ))
488
+ server -> caps |= NFS_CAP_ACLS ;
489
+ }
490
+ #else
491
+ server -> flags &= ~NFS_MOUNT_NOACL ;
492
+ #endif /* CONFIG_NFS_V3_ACL */
466
493
if (server -> namelen == 0 || server -> namelen > NFS3_MAXNAMLEN )
467
494
server -> namelen = NFS3_MAXNAMLEN ;
468
495
sb -> s_time_gran = 1 ;
@@ -546,6 +573,7 @@ static int nfs_show_options(struct seq_file *m, struct vfsmount *mnt)
546
573
{ NFS_MOUNT_NOCTO , ",nocto" , "" },
547
574
{ NFS_MOUNT_NOAC , ",noac" , "" },
548
575
{ NFS_MOUNT_NONLM , ",nolock" , ",lock" },
576
+ { NFS_MOUNT_NOACL , ",noacl" , "" },
549
577
{ 0 , NULL , NULL }
550
578
};
551
579
struct proc_nfs_info * nfs_infop ;
@@ -1452,7 +1480,7 @@ static struct super_block *nfs_get_sb(struct file_system_type *fs_type,
1452
1480
memset (server , 0 , sizeof (struct nfs_server ));
1453
1481
/* Zero out the NFS state stuff */
1454
1482
init_nfsv4_state (server );
1455
- server -> client = server -> client_sys = ERR_PTR (- EINVAL );
1483
+ server -> client = server -> client_sys = server -> client_acl = ERR_PTR (- EINVAL );
1456
1484
1457
1485
root = & server -> fh ;
1458
1486
if (data -> flags & NFS_MOUNT_VER3 )
@@ -1513,6 +1541,8 @@ static void nfs_kill_super(struct super_block *s)
1513
1541
rpc_shutdown_client (server -> client );
1514
1542
if (!IS_ERR (server -> client_sys ))
1515
1543
rpc_shutdown_client (server -> client_sys );
1544
+ if (!IS_ERR (server -> client_acl ))
1545
+ rpc_shutdown_client (server -> client_acl );
1516
1546
1517
1547
if (!(server -> flags & NFS_MOUNT_NONLM ))
1518
1548
lockd_down (); /* release rpc.lockd */
@@ -1794,7 +1824,7 @@ static struct super_block *nfs4_get_sb(struct file_system_type *fs_type,
1794
1824
memset (server , 0 , sizeof (struct nfs_server ));
1795
1825
/* Zero out the NFS state stuff */
1796
1826
init_nfsv4_state (server );
1797
- server -> client = server -> client_sys = ERR_PTR (- EINVAL );
1827
+ server -> client = server -> client_sys = server -> client_acl = ERR_PTR (- EINVAL );
1798
1828
1799
1829
p = nfs_copy_user_string (NULL , & data -> hostname , 256 );
1800
1830
if (IS_ERR (p ))
0 commit comments