Merge branch 'for-linus' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6
* 'for-linus' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6: (58 commits) SUNRPC: Ensure IPV6_V6ONLY is set on the socket before binding to a port NSM: Fix unaligned accesses in nsm_init_private() NFS: Simplify logic to compare socket addresses in client.c NFS: Start PF_INET6 callback listener only if IPv6 support is available lockd: Start PF_INET6 listener only if IPv6 support is available SUNRPC: Remove CONFIG_SUNRPC_REGISTER_V4 SUNRPC: rpcb_register() should handle errors silently SUNRPC: Simplify kernel RPC service registration SUNRPC: Simplify svc_unregister() SUNRPC: Allow callers to pass rpcb_v4_register a NULL address SUNRPC: rpcbind actually interprets r_owner string SUNRPC: Clean up address type casts in rpcb_v4_register() SUNRPC: Don't return EPROTONOSUPPORT in svc_register()'s helpers SUNRPC: Use IPv4 loopback for registering AF_INET6 kernel RPC services SUNRPC: Set IPV6ONLY flag on PF_INET6 RPC listener sockets NFS: Revert creation of IPv6 listeners for lockd and NFSv4 callbacks SUNRPC: Remove @family argument from svc_create() and svc_create_pooled() SUNRPC: Change svc_create_xprt() to take a @family argument SUNRPC: svc_setup_socket() gets protocol family from socket SUNRPC: Pass a family argument to svc_register() ...
This commit is contained in:
@@ -166,8 +166,7 @@ struct nfs_inode {
|
||||
*/
|
||||
struct radix_tree_root nfs_page_tree;
|
||||
|
||||
unsigned long ncommit,
|
||||
npages;
|
||||
unsigned long npages;
|
||||
|
||||
/* Open contexts for shared mmap writes */
|
||||
struct list_head open_files;
|
||||
@@ -207,6 +206,7 @@ struct nfs_inode {
|
||||
#define NFS_INO_STALE (1) /* possible stale inode */
|
||||
#define NFS_INO_ACL_LRU_SET (2) /* Inode is on the LRU list */
|
||||
#define NFS_INO_MOUNTPOINT (3) /* inode is remote mountpoint */
|
||||
#define NFS_INO_FLUSHING (4) /* inode is flushing out data */
|
||||
|
||||
static inline struct nfs_inode *NFS_I(const struct inode *inode)
|
||||
{
|
||||
|
||||
@@ -106,6 +106,11 @@ struct nfs_server {
|
||||
u32 attr_bitmask[2];/* V4 bitmask representing the set
|
||||
of attributes supported on this
|
||||
filesystem */
|
||||
u32 cache_consistency_bitmask[2];
|
||||
/* V4 bitmask representing the subset
|
||||
of change attribute, size, ctime
|
||||
and mtime attributes supported by
|
||||
the server */
|
||||
u32 acl_bitmask; /* V4 bitmask representing the ACEs
|
||||
that are supported on this
|
||||
filesystem */
|
||||
|
||||
+46
-13
@@ -27,12 +27,8 @@ static inline int nfs_fsid_equal(const struct nfs_fsid *a, const struct nfs_fsid
|
||||
}
|
||||
|
||||
struct nfs_fattr {
|
||||
unsigned short valid; /* which fields are valid */
|
||||
__u64 pre_size; /* pre_op_attr.size */
|
||||
struct timespec pre_mtime; /* pre_op_attr.mtime */
|
||||
struct timespec pre_ctime; /* pre_op_attr.ctime */
|
||||
enum nfs_ftype type; /* always use NFSv2 types */
|
||||
__u32 mode;
|
||||
unsigned int valid; /* which fields are valid */
|
||||
umode_t mode;
|
||||
__u32 nlink;
|
||||
__u32 uid;
|
||||
__u32 gid;
|
||||
@@ -52,19 +48,55 @@ struct nfs_fattr {
|
||||
struct timespec atime;
|
||||
struct timespec mtime;
|
||||
struct timespec ctime;
|
||||
__u32 bitmap[2]; /* NFSv4 returned attribute bitmap */
|
||||
__u64 change_attr; /* NFSv4 change attribute */
|
||||
__u64 pre_change_attr;/* pre-op NFSv4 change attribute */
|
||||
__u64 pre_size; /* pre_op_attr.size */
|
||||
struct timespec pre_mtime; /* pre_op_attr.mtime */
|
||||
struct timespec pre_ctime; /* pre_op_attr.ctime */
|
||||
unsigned long time_start;
|
||||
unsigned long gencount;
|
||||
};
|
||||
|
||||
#define NFS_ATTR_WCC 0x0001 /* pre-op WCC data */
|
||||
#define NFS_ATTR_FATTR 0x0002 /* post-op attributes */
|
||||
#define NFS_ATTR_FATTR_V3 0x0004 /* NFSv3 attributes */
|
||||
#define NFS_ATTR_FATTR_V4 0x0008 /* NFSv4 change attribute */
|
||||
#define NFS_ATTR_WCC_V4 0x0010 /* pre-op change attribute */
|
||||
#define NFS_ATTR_FATTR_V4_REFERRAL 0x0020 /* NFSv4 referral */
|
||||
#define NFS_ATTR_FATTR_TYPE (1U << 0)
|
||||
#define NFS_ATTR_FATTR_MODE (1U << 1)
|
||||
#define NFS_ATTR_FATTR_NLINK (1U << 2)
|
||||
#define NFS_ATTR_FATTR_OWNER (1U << 3)
|
||||
#define NFS_ATTR_FATTR_GROUP (1U << 4)
|
||||
#define NFS_ATTR_FATTR_RDEV (1U << 5)
|
||||
#define NFS_ATTR_FATTR_SIZE (1U << 6)
|
||||
#define NFS_ATTR_FATTR_PRESIZE (1U << 7)
|
||||
#define NFS_ATTR_FATTR_BLOCKS_USED (1U << 8)
|
||||
#define NFS_ATTR_FATTR_SPACE_USED (1U << 9)
|
||||
#define NFS_ATTR_FATTR_FSID (1U << 10)
|
||||
#define NFS_ATTR_FATTR_FILEID (1U << 11)
|
||||
#define NFS_ATTR_FATTR_ATIME (1U << 12)
|
||||
#define NFS_ATTR_FATTR_MTIME (1U << 13)
|
||||
#define NFS_ATTR_FATTR_CTIME (1U << 14)
|
||||
#define NFS_ATTR_FATTR_PREMTIME (1U << 15)
|
||||
#define NFS_ATTR_FATTR_PRECTIME (1U << 16)
|
||||
#define NFS_ATTR_FATTR_CHANGE (1U << 17)
|
||||
#define NFS_ATTR_FATTR_PRECHANGE (1U << 18)
|
||||
#define NFS_ATTR_FATTR_V4_REFERRAL (1U << 19) /* NFSv4 referral */
|
||||
|
||||
#define NFS_ATTR_FATTR (NFS_ATTR_FATTR_TYPE \
|
||||
| NFS_ATTR_FATTR_MODE \
|
||||
| NFS_ATTR_FATTR_NLINK \
|
||||
| NFS_ATTR_FATTR_OWNER \
|
||||
| NFS_ATTR_FATTR_GROUP \
|
||||
| NFS_ATTR_FATTR_RDEV \
|
||||
| NFS_ATTR_FATTR_SIZE \
|
||||
| NFS_ATTR_FATTR_FSID \
|
||||
| NFS_ATTR_FATTR_FILEID \
|
||||
| NFS_ATTR_FATTR_ATIME \
|
||||
| NFS_ATTR_FATTR_MTIME \
|
||||
| NFS_ATTR_FATTR_CTIME)
|
||||
#define NFS_ATTR_FATTR_V2 (NFS_ATTR_FATTR \
|
||||
| NFS_ATTR_FATTR_BLOCKS_USED)
|
||||
#define NFS_ATTR_FATTR_V3 (NFS_ATTR_FATTR \
|
||||
| NFS_ATTR_FATTR_SPACE_USED)
|
||||
#define NFS_ATTR_FATTR_V4 (NFS_ATTR_FATTR \
|
||||
| NFS_ATTR_FATTR_SPACE_USED \
|
||||
| NFS_ATTR_FATTR_CHANGE)
|
||||
|
||||
/*
|
||||
* Info on the file system
|
||||
@@ -836,6 +868,7 @@ struct nfs_rpc_ops {
|
||||
int (*lock)(struct file *, int, struct file_lock *);
|
||||
int (*lock_check_bounds)(const struct file_lock *);
|
||||
void (*clear_acl_cache)(struct inode *);
|
||||
void (*close_context)(struct nfs_open_context *ctx, int);
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
@@ -69,7 +69,6 @@ struct svc_serv {
|
||||
struct list_head sv_tempsocks; /* all temporary sockets */
|
||||
int sv_tmpcnt; /* count of temporary sockets */
|
||||
struct timer_list sv_temptimer; /* timer for aging temporary sockets */
|
||||
sa_family_t sv_family; /* listener's address family */
|
||||
|
||||
char * sv_name; /* service name */
|
||||
|
||||
@@ -385,19 +384,19 @@ struct svc_procedure {
|
||||
/*
|
||||
* Function prototypes.
|
||||
*/
|
||||
struct svc_serv *svc_create(struct svc_program *, unsigned int, sa_family_t,
|
||||
struct svc_serv *svc_create(struct svc_program *, unsigned int,
|
||||
void (*shutdown)(struct svc_serv *));
|
||||
struct svc_rqst *svc_prepare_thread(struct svc_serv *serv,
|
||||
struct svc_pool *pool);
|
||||
void svc_exit_thread(struct svc_rqst *);
|
||||
struct svc_serv * svc_create_pooled(struct svc_program *, unsigned int,
|
||||
sa_family_t, void (*shutdown)(struct svc_serv *),
|
||||
void (*shutdown)(struct svc_serv *),
|
||||
svc_thread_fn, struct module *);
|
||||
int svc_set_num_threads(struct svc_serv *, struct svc_pool *, int);
|
||||
void svc_destroy(struct svc_serv *);
|
||||
int svc_process(struct svc_rqst *);
|
||||
int svc_register(const struct svc_serv *, const unsigned short,
|
||||
const unsigned short);
|
||||
int svc_register(const struct svc_serv *, const int,
|
||||
const unsigned short, const unsigned short);
|
||||
|
||||
void svc_wake_up(struct svc_serv *);
|
||||
void svc_reserve(struct svc_rqst *rqstp, int space);
|
||||
|
||||
@@ -71,7 +71,8 @@ int svc_reg_xprt_class(struct svc_xprt_class *);
|
||||
void svc_unreg_xprt_class(struct svc_xprt_class *);
|
||||
void svc_xprt_init(struct svc_xprt_class *, struct svc_xprt *,
|
||||
struct svc_serv *);
|
||||
int svc_create_xprt(struct svc_serv *, char *, unsigned short, int);
|
||||
int svc_create_xprt(struct svc_serv *, const char *, const int,
|
||||
const unsigned short, int);
|
||||
void svc_xprt_enqueue(struct svc_xprt *xprt);
|
||||
void svc_xprt_received(struct svc_xprt *);
|
||||
void svc_xprt_put(struct svc_xprt *xprt);
|
||||
@@ -80,7 +81,8 @@ void svc_close_xprt(struct svc_xprt *xprt);
|
||||
void svc_delete_xprt(struct svc_xprt *xprt);
|
||||
int svc_port_is_privileged(struct sockaddr *sin);
|
||||
int svc_print_xprts(char *buf, int maxlen);
|
||||
struct svc_xprt *svc_find_xprt(struct svc_serv *, char *, int, int);
|
||||
struct svc_xprt *svc_find_xprt(struct svc_serv *serv, const char *xcl_name,
|
||||
const sa_family_t af, const unsigned short port);
|
||||
int svc_xprt_names(struct svc_serv *serv, char *buf, int buflen);
|
||||
|
||||
static inline void svc_xprt_get(struct svc_xprt *xprt)
|
||||
@@ -88,29 +90,32 @@ static inline void svc_xprt_get(struct svc_xprt *xprt)
|
||||
kref_get(&xprt->xpt_ref);
|
||||
}
|
||||
static inline void svc_xprt_set_local(struct svc_xprt *xprt,
|
||||
struct sockaddr *sa, int salen)
|
||||
const struct sockaddr *sa,
|
||||
const size_t salen)
|
||||
{
|
||||
memcpy(&xprt->xpt_local, sa, salen);
|
||||
xprt->xpt_locallen = salen;
|
||||
}
|
||||
static inline void svc_xprt_set_remote(struct svc_xprt *xprt,
|
||||
struct sockaddr *sa, int salen)
|
||||
const struct sockaddr *sa,
|
||||
const size_t salen)
|
||||
{
|
||||
memcpy(&xprt->xpt_remote, sa, salen);
|
||||
xprt->xpt_remotelen = salen;
|
||||
}
|
||||
static inline unsigned short svc_addr_port(struct sockaddr *sa)
|
||||
static inline unsigned short svc_addr_port(const struct sockaddr *sa)
|
||||
{
|
||||
unsigned short ret = 0;
|
||||
const struct sockaddr_in *sin = (const struct sockaddr_in *)sa;
|
||||
const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)sa;
|
||||
|
||||
switch (sa->sa_family) {
|
||||
case AF_INET:
|
||||
ret = ntohs(((struct sockaddr_in *)sa)->sin_port);
|
||||
break;
|
||||
return ntohs(sin->sin_port);
|
||||
case AF_INET6:
|
||||
ret = ntohs(((struct sockaddr_in6 *)sa)->sin6_port);
|
||||
break;
|
||||
return ntohs(sin6->sin6_port);
|
||||
}
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline size_t svc_addr_len(struct sockaddr *sa)
|
||||
@@ -124,36 +129,39 @@ static inline size_t svc_addr_len(struct sockaddr *sa)
|
||||
return -EAFNOSUPPORT;
|
||||
}
|
||||
|
||||
static inline unsigned short svc_xprt_local_port(struct svc_xprt *xprt)
|
||||
static inline unsigned short svc_xprt_local_port(const struct svc_xprt *xprt)
|
||||
{
|
||||
return svc_addr_port((struct sockaddr *)&xprt->xpt_local);
|
||||
return svc_addr_port((const struct sockaddr *)&xprt->xpt_local);
|
||||
}
|
||||
|
||||
static inline unsigned short svc_xprt_remote_port(struct svc_xprt *xprt)
|
||||
static inline unsigned short svc_xprt_remote_port(const struct svc_xprt *xprt)
|
||||
{
|
||||
return svc_addr_port((struct sockaddr *)&xprt->xpt_remote);
|
||||
return svc_addr_port((const struct sockaddr *)&xprt->xpt_remote);
|
||||
}
|
||||
|
||||
static inline char *__svc_print_addr(struct sockaddr *addr,
|
||||
char *buf, size_t len)
|
||||
static inline char *__svc_print_addr(const struct sockaddr *addr,
|
||||
char *buf, const size_t len)
|
||||
{
|
||||
const struct sockaddr_in *sin = (const struct sockaddr_in *)addr;
|
||||
const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)addr;
|
||||
|
||||
switch (addr->sa_family) {
|
||||
case AF_INET:
|
||||
snprintf(buf, len, "%pI4, port=%u",
|
||||
&((struct sockaddr_in *)addr)->sin_addr,
|
||||
ntohs(((struct sockaddr_in *) addr)->sin_port));
|
||||
snprintf(buf, len, "%pI4, port=%u", &sin->sin_addr,
|
||||
ntohs(sin->sin_port));
|
||||
break;
|
||||
|
||||
case AF_INET6:
|
||||
snprintf(buf, len, "%pI6, port=%u",
|
||||
&((struct sockaddr_in6 *)addr)->sin6_addr,
|
||||
ntohs(((struct sockaddr_in6 *) addr)->sin6_port));
|
||||
&sin6->sin6_addr,
|
||||
ntohs(sin6->sin6_port));
|
||||
break;
|
||||
|
||||
default:
|
||||
snprintf(buf, len, "unknown address type: %d", addr->sa_family);
|
||||
break;
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
||||
#endif /* SUNRPC_SVC_XPRT_H */
|
||||
|
||||
@@ -235,6 +235,7 @@ static inline __be32 *xprt_skip_transport_header(struct rpc_xprt *xprt, __be32 *
|
||||
*/
|
||||
int xprt_register_transport(struct xprt_class *type);
|
||||
int xprt_unregister_transport(struct xprt_class *type);
|
||||
int xprt_load_transport(const char *);
|
||||
void xprt_set_retrans_timeout_def(struct rpc_task *task);
|
||||
void xprt_set_retrans_timeout_rtt(struct rpc_task *task);
|
||||
void xprt_wake_pending_tasks(struct rpc_xprt *xprt, int status);
|
||||
@@ -259,6 +260,7 @@ void xprt_conditional_disconnect(struct rpc_xprt *xprt, unsigned int cookie);
|
||||
#define XPRT_BOUND (4)
|
||||
#define XPRT_BINDING (5)
|
||||
#define XPRT_CLOSING (6)
|
||||
#define XPRT_CONNECTION_ABORT (7)
|
||||
|
||||
static inline void xprt_set_connected(struct rpc_xprt *xprt)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user