Merge branch 'for-2.6.40' of git://linux-nfs.org/~bfields/linux
* 'for-2.6.40' of git://linux-nfs.org/~bfields/linux: nfsd4: fix break_lease flags on nfsd open nfsd: link returns nfserr_delay when breaking lease nfsd: v4 support requires CRYPTO nfsd: fix dependency of nfsd on auth_rpcgss
This commit is contained in:
commit
eda0841094
@ -82,6 +82,7 @@ config NFSD_V4
|
|||||||
select NFSD_V3
|
select NFSD_V3
|
||||||
select FS_POSIX_ACL
|
select FS_POSIX_ACL
|
||||||
select SUNRPC_GSS
|
select SUNRPC_GSS
|
||||||
|
select CRYPTO
|
||||||
help
|
help
|
||||||
This option enables support in your system's NFS server for
|
This option enables support in your system's NFS server for
|
||||||
version 4 of the NFS protocol (RFC 3530).
|
version 4 of the NFS protocol (RFC 3530).
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include <linux/lockd/lockd.h>
|
#include <linux/lockd/lockd.h>
|
||||||
#include <linux/sunrpc/clnt.h>
|
#include <linux/sunrpc/clnt.h>
|
||||||
#include <linux/sunrpc/gss_api.h>
|
#include <linux/sunrpc/gss_api.h>
|
||||||
|
#include <linux/sunrpc/gss_krb5_enctypes.h>
|
||||||
|
|
||||||
#include "idmap.h"
|
#include "idmap.h"
|
||||||
#include "nfsd.h"
|
#include "nfsd.h"
|
||||||
@ -189,18 +190,10 @@ static struct file_operations export_features_operations = {
|
|||||||
.release = single_release,
|
.release = single_release,
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_SUNRPC_GSS
|
#if defined(CONFIG_SUNRPC_GSS) || defined(CONFIG_SUNRPC_GSS_MODULE)
|
||||||
static int supported_enctypes_show(struct seq_file *m, void *v)
|
static int supported_enctypes_show(struct seq_file *m, void *v)
|
||||||
{
|
{
|
||||||
struct gss_api_mech *k5mech;
|
seq_printf(m, KRB5_SUPPORTED_ENCTYPES);
|
||||||
|
|
||||||
k5mech = gss_mech_get_by_name("krb5");
|
|
||||||
if (k5mech == NULL)
|
|
||||||
goto out;
|
|
||||||
if (k5mech->gm_upcall_enctypes != NULL)
|
|
||||||
seq_printf(m, k5mech->gm_upcall_enctypes);
|
|
||||||
gss_mech_put(k5mech);
|
|
||||||
out:
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -215,7 +208,7 @@ static struct file_operations supported_enctypes_ops = {
|
|||||||
.llseek = seq_lseek,
|
.llseek = seq_lseek,
|
||||||
.release = single_release,
|
.release = single_release,
|
||||||
};
|
};
|
||||||
#endif /* CONFIG_SUNRPC_GSS */
|
#endif /* CONFIG_SUNRPC_GSS or CONFIG_SUNRPC_GSS_MODULE */
|
||||||
|
|
||||||
extern int nfsd_pool_stats_open(struct inode *inode, struct file *file);
|
extern int nfsd_pool_stats_open(struct inode *inode, struct file *file);
|
||||||
extern int nfsd_pool_stats_release(struct inode *inode, struct file *file);
|
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)
|
|||||||
[NFSD_Versions] = {"versions", &transaction_ops, S_IWUSR|S_IRUSR},
|
[NFSD_Versions] = {"versions", &transaction_ops, S_IWUSR|S_IRUSR},
|
||||||
[NFSD_Ports] = {"portlist", &transaction_ops, S_IWUSR|S_IRUGO},
|
[NFSD_Ports] = {"portlist", &transaction_ops, S_IWUSR|S_IRUGO},
|
||||||
[NFSD_MaxBlkSize] = {"max_block_size", &transaction_ops, S_IWUSR|S_IRUGO},
|
[NFSD_MaxBlkSize] = {"max_block_size", &transaction_ops, S_IWUSR|S_IRUGO},
|
||||||
#ifdef CONFIG_SUNRPC_GSS
|
#if defined(CONFIG_SUNRPC_GSS) || defined(CONFIG_SUNRPC_GSS_MODULE)
|
||||||
[NFSD_SupportedEnctypes] = {"supported_krb5_enctypes", &supported_enctypes_ops, S_IRUGO},
|
[NFSD_SupportedEnctypes] = {"supported_krb5_enctypes", &supported_enctypes_ops, S_IRUGO},
|
||||||
#endif /* CONFIG_SUNRPC_GSS */
|
#endif /* CONFIG_SUNRPC_GSS or CONFIG_SUNRPC_GSS_MODULE */
|
||||||
#ifdef CONFIG_NFSD_V4
|
#ifdef CONFIG_NFSD_V4
|
||||||
[NFSD_Leasetime] = {"nfsv4leasetime", &transaction_ops, S_IWUSR|S_IRUSR},
|
[NFSD_Leasetime] = {"nfsv4leasetime", &transaction_ops, S_IWUSR|S_IRUSR},
|
||||||
[NFSD_Gracetime] = {"nfsv4gracetime", &transaction_ops, S_IWUSR|S_IRUSR},
|
[NFSD_Gracetime] = {"nfsv4gracetime", &transaction_ops, S_IWUSR|S_IRUSR},
|
||||||
|
@ -696,7 +696,15 @@ nfsd_access(struct svc_rqst *rqstp, struct svc_fh *fhp, u32 *access, u32 *suppor
|
|||||||
}
|
}
|
||||||
#endif /* CONFIG_NFSD_V3 */
|
#endif /* CONFIG_NFSD_V3 */
|
||||||
|
|
||||||
|
static int nfsd_open_break_lease(struct inode *inode, int access)
|
||||||
|
{
|
||||||
|
unsigned int mode;
|
||||||
|
|
||||||
|
if (access & NFSD_MAY_NOT_BREAK_LEASE)
|
||||||
|
return 0;
|
||||||
|
mode = (access & NFSD_MAY_WRITE) ? O_WRONLY : O_RDONLY;
|
||||||
|
return break_lease(inode, mode | O_NONBLOCK);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Open an existing file or directory.
|
* Open an existing file or directory.
|
||||||
@ -744,12 +752,7 @@ nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, int type,
|
|||||||
if (!inode->i_fop)
|
if (!inode->i_fop)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/*
|
host_err = nfsd_open_break_lease(inode, access);
|
||||||
* Check to see if there are any leases on this file.
|
|
||||||
* This may block while leases are broken.
|
|
||||||
*/
|
|
||||||
if (!(access & NFSD_MAY_NOT_BREAK_LEASE))
|
|
||||||
host_err = break_lease(inode, O_NONBLOCK | ((access & NFSD_MAY_WRITE) ? O_WRONLY : 0));
|
|
||||||
if (host_err) /* NOMEM or WOULDBLOCK */
|
if (host_err) /* NOMEM or WOULDBLOCK */
|
||||||
goto out_nfserr;
|
goto out_nfserr;
|
||||||
|
|
||||||
@ -1660,8 +1663,10 @@ nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp,
|
|||||||
if (!dold->d_inode)
|
if (!dold->d_inode)
|
||||||
goto out_drop_write;
|
goto out_drop_write;
|
||||||
host_err = nfsd_break_lease(dold->d_inode);
|
host_err = nfsd_break_lease(dold->d_inode);
|
||||||
if (host_err)
|
if (host_err) {
|
||||||
|
err = nfserrno(host_err);
|
||||||
goto out_drop_write;
|
goto out_drop_write;
|
||||||
|
}
|
||||||
host_err = vfs_link(dold, dirp, dnew);
|
host_err = vfs_link(dold, dirp, dnew);
|
||||||
if (!host_err) {
|
if (!host_err) {
|
||||||
err = nfserrno(commit_metadata(ffhp));
|
err = nfserrno(commit_metadata(ffhp));
|
||||||
|
4
include/linux/sunrpc/gss_krb5_enctypes.h
Normal file
4
include/linux/sunrpc/gss_krb5_enctypes.h
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/*
|
||||||
|
* Dumb way to share this static piece of information with nfsd
|
||||||
|
*/
|
||||||
|
#define KRB5_SUPPORTED_ENCTYPES "18,17,16,23,3,1,2"
|
@ -43,6 +43,7 @@
|
|||||||
#include <linux/sunrpc/gss_krb5.h>
|
#include <linux/sunrpc/gss_krb5.h>
|
||||||
#include <linux/sunrpc/xdr.h>
|
#include <linux/sunrpc/xdr.h>
|
||||||
#include <linux/crypto.h>
|
#include <linux/crypto.h>
|
||||||
|
#include <linux/sunrpc/gss_krb5_enctypes.h>
|
||||||
|
|
||||||
#ifdef RPC_DEBUG
|
#ifdef RPC_DEBUG
|
||||||
# define RPCDBG_FACILITY RPCDBG_AUTH
|
# define RPCDBG_FACILITY RPCDBG_AUTH
|
||||||
@ -750,7 +751,7 @@ static struct gss_api_mech gss_kerberos_mech = {
|
|||||||
.gm_ops = &gss_kerberos_ops,
|
.gm_ops = &gss_kerberos_ops,
|
||||||
.gm_pf_num = ARRAY_SIZE(gss_kerberos_pfs),
|
.gm_pf_num = ARRAY_SIZE(gss_kerberos_pfs),
|
||||||
.gm_pfs = gss_kerberos_pfs,
|
.gm_pfs = gss_kerberos_pfs,
|
||||||
.gm_upcall_enctypes = "18,17,16,23,3,1,2",
|
.gm_upcall_enctypes = KRB5_SUPPORTED_ENCTYPES,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init init_kerberos_module(void)
|
static int __init init_kerberos_module(void)
|
||||||
|
Loading…
Reference in New Issue
Block a user