diff options
Diffstat (limited to 'fs/nfsd')
| -rw-r--r-- | fs/nfsd/Kconfig | 1 | ||||
| -rw-r--r-- | fs/nfsd/nfsctl.c | 19 | ||||
| -rw-r--r-- | fs/nfsd/vfs.c | 19 |
3 files changed, 19 insertions, 20 deletions
diff --git a/fs/nfsd/Kconfig b/fs/nfsd/Kconfig index 18b3e8975fe0..fbb2a5ef5817 100644 --- a/fs/nfsd/Kconfig +++ b/fs/nfsd/Kconfig | |||
| @@ -82,6 +82,7 @@ config NFSD_V4 | |||
| 82 | select NFSD_V3 | 82 | select NFSD_V3 |
| 83 | select FS_POSIX_ACL | 83 | select FS_POSIX_ACL |
| 84 | select SUNRPC_GSS | 84 | select SUNRPC_GSS |
| 85 | select CRYPTO | ||
| 85 | help | 86 | help |
| 86 | This option enables support in your system's NFS server for | 87 | This option enables support in your system's NFS server for |
| 87 | version 4 of the NFS protocol (RFC 3530). | 88 | version 4 of the NFS protocol (RFC 3530). |
diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c index 1f5eae40f34e..2b1449dd2f49 100644 --- a/fs/nfsd/nfsctl.c +++ b/fs/nfsd/nfsctl.c | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include <linux/lockd/lockd.h> | 13 | #include <linux/lockd/lockd.h> |
| 14 | #include <linux/sunrpc/clnt.h> | 14 | #include <linux/sunrpc/clnt.h> |
| 15 | #include <linux/sunrpc/gss_api.h> | 15 | #include <linux/sunrpc/gss_api.h> |
| 16 | #include <linux/sunrpc/gss_krb5_enctypes.h> | ||
| 16 | 17 | ||
| 17 | #include "idmap.h" | 18 | #include "idmap.h" |
| 18 | #include "nfsd.h" | 19 | #include "nfsd.h" |
| @@ -189,18 +190,10 @@ static struct file_operations export_features_operations = { | |||
| 189 | .release = single_release, | 190 | .release = single_release, |
| 190 | }; | 191 | }; |
| 191 | 192 | ||
| 192 | #ifdef CONFIG_SUNRPC_GSS | 193 | #if defined(CONFIG_SUNRPC_GSS) || defined(CONFIG_SUNRPC_GSS_MODULE) |
| 193 | static int supported_enctypes_show(struct seq_file *m, void *v) | 194 | static int supported_enctypes_show(struct seq_file *m, void *v) |
| 194 | { | 195 | { |
| 195 | struct gss_api_mech *k5mech; | 196 | seq_printf(m, KRB5_SUPPORTED_ENCTYPES); |
| 196 | |||
| 197 | k5mech = gss_mech_get_by_name("krb5"); | ||
| 198 | if (k5mech == NULL) | ||
| 199 | goto out; | ||
| 200 | if (k5mech->gm_upcall_enctypes != NULL) | ||
| 201 | seq_printf(m, k5mech->gm_upcall_enctypes); | ||
| 202 | gss_mech_put(k5mech); | ||
| 203 | out: | ||
| 204 | return 0; | 197 | return 0; |
| 205 | } | 198 | } |
| 206 | 199 | ||
| @@ -215,7 +208,7 @@ static struct file_operations supported_enctypes_ops = { | |||
| 215 | .llseek = seq_lseek, | 208 | .llseek = seq_lseek, |
| 216 | .release = single_release, | 209 | .release = single_release, |
| 217 | }; | 210 | }; |
| 218 | #endif /* CONFIG_SUNRPC_GSS */ | 211 | #endif /* CONFIG_SUNRPC_GSS or CONFIG_SUNRPC_GSS_MODULE */ |
| 219 | 212 | ||
| 220 | extern int nfsd_pool_stats_open(struct inode *inode, struct file *file); | 213 | extern int nfsd_pool_stats_open(struct inode *inode, struct file *file); |
| 221 | extern int nfsd_pool_stats_release(struct inode *inode, struct file *file); | 214 | extern int nfsd_pool_stats_release(struct inode *inode, struct file *file); |
| @@ -1427,9 +1420,9 @@ static int nfsd_fill_super(struct super_block * sb, void * data, int silent) | |||
| 1427 | [NFSD_Versions] = {"versions", &transaction_ops, S_IWUSR|S_IRUSR}, | 1420 | [NFSD_Versions] = {"versions", &transaction_ops, S_IWUSR|S_IRUSR}, |
| 1428 | [NFSD_Ports] = {"portlist", &transaction_ops, S_IWUSR|S_IRUGO}, | 1421 | [NFSD_Ports] = {"portlist", &transaction_ops, S_IWUSR|S_IRUGO}, |
| 1429 | [NFSD_MaxBlkSize] = {"max_block_size", &transaction_ops, S_IWUSR|S_IRUGO}, | 1422 | [NFSD_MaxBlkSize] = {"max_block_size", &transaction_ops, S_IWUSR|S_IRUGO}, |
| 1430 | #ifdef CONFIG_SUNRPC_GSS | 1423 | #if defined(CONFIG_SUNRPC_GSS) || defined(CONFIG_SUNRPC_GSS_MODULE) |
| 1431 | [NFSD_SupportedEnctypes] = {"supported_krb5_enctypes", &supported_enctypes_ops, S_IRUGO}, | 1424 | [NFSD_SupportedEnctypes] = {"supported_krb5_enctypes", &supported_enctypes_ops, S_IRUGO}, |
| 1432 | #endif /* CONFIG_SUNRPC_GSS */ | 1425 | #endif /* CONFIG_SUNRPC_GSS or CONFIG_SUNRPC_GSS_MODULE */ |
| 1433 | #ifdef CONFIG_NFSD_V4 | 1426 | #ifdef CONFIG_NFSD_V4 |
| 1434 | [NFSD_Leasetime] = {"nfsv4leasetime", &transaction_ops, S_IWUSR|S_IRUSR}, | 1427 | [NFSD_Leasetime] = {"nfsv4leasetime", &transaction_ops, S_IWUSR|S_IRUSR}, |
| 1435 | [NFSD_Gracetime] = {"nfsv4gracetime", &transaction_ops, S_IWUSR|S_IRUSR}, | 1428 | [NFSD_Gracetime] = {"nfsv4gracetime", &transaction_ops, S_IWUSR|S_IRUSR}, |
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index d5718273bb32..fd0acca5370a 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c | |||
| @@ -696,7 +696,15 @@ nfsd_access(struct svc_rqst *rqstp, struct svc_fh *fhp, u32 *access, u32 *suppor | |||
| 696 | } | 696 | } |
| 697 | #endif /* CONFIG_NFSD_V3 */ | 697 | #endif /* CONFIG_NFSD_V3 */ |
| 698 | 698 | ||
| 699 | static int nfsd_open_break_lease(struct inode *inode, int access) | ||
| 700 | { | ||
| 701 | unsigned int mode; | ||
| 699 | 702 | ||
| 703 | if (access & NFSD_MAY_NOT_BREAK_LEASE) | ||
| 704 | return 0; | ||
| 705 | mode = (access & NFSD_MAY_WRITE) ? O_WRONLY : O_RDONLY; | ||
| 706 | return break_lease(inode, mode | O_NONBLOCK); | ||
| 707 | } | ||
| 700 | 708 | ||
| 701 | /* | 709 | /* |
| 702 | * Open an existing file or directory. | 710 | * Open an existing file or directory. |
| @@ -744,12 +752,7 @@ nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, | |||
| 744 | if (!inode->i_fop) | 752 | if (!inode->i_fop) |
| 745 | goto out; | 753 | goto out; |
| 746 | 754 | ||
| 747 | /* | 755 | host_err = nfsd_open_break_lease(inode, access); |
| 748 | * Check to see if there are any leases on this file. | ||
| 749 | * This may block while leases are broken. | ||
| 750 | */ | ||
| 751 | if (!(access & NFSD_MAY_NOT_BREAK_LEASE)) | ||
| 752 | host_err = break_lease(inode, O_NONBLOCK | ((access & NFSD_MAY_WRITE) ? O_WRONLY : 0)); | ||
| 753 | if (host_err) /* NOMEM or WOULDBLOCK */ | 756 | if (host_err) /* NOMEM or WOULDBLOCK */ |
| 754 | goto out_nfserr; | 757 | goto out_nfserr; |
| 755 | 758 | ||
| @@ -1660,8 +1663,10 @@ nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp, | |||
| 1660 | if (!dold->d_inode) | 1663 | if (!dold->d_inode) |
| 1661 | goto out_drop_write; | 1664 | goto out_drop_write; |
| 1662 | host_err = nfsd_break_lease(dold->d_inode); | 1665 | host_err = nfsd_break_lease(dold->d_inode); |
| 1663 | if (host_err) | 1666 | if (host_err) { |
| 1667 | err = nfserrno(host_err); | ||
| 1664 | goto out_drop_write; | 1668 | goto out_drop_write; |
| 1669 | } | ||
| 1665 | host_err = vfs_link(dold, dirp, dnew); | 1670 | host_err = vfs_link(dold, dirp, dnew); |
| 1666 | if (!host_err) { | 1671 | if (!host_err) { |
| 1667 | err = nfserrno(commit_metadata(ffhp)); | 1672 | err = nfserrno(commit_metadata(ffhp)); |
