summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorTrond Myklebust <trond.myklebust@fys.uio.no>2004-08-23 11:30:42 -0400
committerTrond Myklebust <trond.myklebust@fys.uio.no>2004-08-23 11:30:42 -0400
commit477d40b4f634495287c5b717c9c7b99e212681de (patch)
treee78f4c466172f85d6d913e25020d588f493908c8 /include
parentfec0073263e320b129ec2f4b12405436bf8188f7 (diff)
parent60fa4cfb6897d8adf096c667905a53d848e57e72 (diff)
Merge fys.uio.no:/home/linux/bitkeeper/nfsclient-2.6
into fys.uio.no:/home/linux/bitkeeper/work/nfsclient-2.6
Diffstat (limited to 'include')
-rw-r--r--include/linux/nfs_fs.h68
-rw-r--r--include/linux/nfs_page.h29
-rw-r--r--include/linux/nfs_xdr.h25
3 files changed, 64 insertions, 58 deletions
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h
index 1b9154d67afa..0b9fb290b1b2 100644
--- a/include/linux/nfs_fs.h
+++ b/include/linux/nfs_fs.h
@@ -83,6 +83,20 @@ struct nfs_access_entry {
int mask;
};
+struct nfs4_state;
+struct nfs_open_context {
+ atomic_t count;
+ struct dentry *dentry;
+ struct rpc_cred *cred;
+ struct nfs4_state *state;
+ fl_owner_t lockowner;
+ int mode;
+ int error;
+
+ struct list_head list;
+ wait_queue_head_t waitq;
+};
+
/*
* nfs fs inode data in memory
*/
@@ -156,8 +170,8 @@ struct nfs_inode {
ncommit,
npages;
- /* Credentials for shared mmap */
- struct rpc_cred *mm_cred;
+ /* Open contexts for shared mmap writes */
+ struct list_head open_files;
wait_queue_head_t nfs_i_wait;
@@ -268,7 +282,6 @@ extern struct inode *nfs_fhget(struct super_block *, struct nfs_fh *,
extern int nfs_refresh_inode(struct inode *, struct nfs_fattr *);
extern int nfs_getattr(struct vfsmount *, struct dentry *, struct kstat *);
extern int nfs_permission(struct inode *, int, struct nameidata *);
-extern void nfs_set_mmcred(struct inode *, struct rpc_cred *);
extern int nfs_open(struct inode *, struct file *);
extern int nfs_release(struct inode *, struct file *);
extern int __nfs_revalidate_inode(struct nfs_server *, struct inode *);
@@ -278,6 +291,12 @@ extern void nfs_end_attr_update(struct inode *);
extern void nfs_begin_data_update(struct inode *);
extern void nfs_end_data_update(struct inode *);
extern void nfs_end_data_update_defer(struct inode *);
+extern struct nfs_open_context *alloc_nfs_open_context(struct dentry *dentry, struct rpc_cred *cred);
+extern struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ctx);
+extern void put_nfs_open_context(struct nfs_open_context *ctx);
+extern void nfs_file_set_open_context(struct file *filp, struct nfs_open_context *ctx);
+extern struct nfs_open_context *nfs_find_open_context(struct inode *inode, int mode);
+extern void nfs_file_clear_open_context(struct file *filp);
/* linux/net/ipv4/ipconfig.c: trims ip addr off front of name, too. */
extern u32 root_nfs_parse_addr(char *name); /*__init*/
@@ -289,16 +308,15 @@ extern struct inode_operations nfs_file_inode_operations;
extern struct file_operations nfs_file_operations;
extern struct address_space_operations nfs_file_aops;
-static __inline__ struct rpc_cred *
-nfs_file_cred(struct file *file)
+static inline struct rpc_cred *nfs_file_cred(struct file *file)
{
- struct rpc_cred *cred = NULL;
- if (file)
- cred = (struct rpc_cred *)file->private_data;
-#ifdef RPC_DEBUG
- BUG_ON(cred && cred->cr_magic != RPCAUTH_CRED_MAGIC);
-#endif
- return cred;
+ if (file != NULL) {
+ struct nfs_open_context *ctx;
+
+ ctx = (struct nfs_open_context*)file->private_data;
+ return ctx->cred;
+ }
+ return NULL;
}
/*
@@ -507,8 +525,6 @@ struct idmap;
enum nfs4_client_state {
NFS4CLNT_OK = 0,
- NFS4CLNT_NEW,
- NFS4CLNT_SETUP_STATE,
};
/*
@@ -520,7 +536,6 @@ struct nfs4_client {
u64 cl_clientid; /* constant */
nfs4_verifier cl_confirm;
unsigned long cl_state;
- long cl_generation;
u32 cl_lockowner_id;
@@ -573,9 +588,7 @@ struct nfs4_state_owner {
u32 so_id; /* 32-bit identifier, unique */
struct semaphore so_sema;
u32 so_seqid; /* protected by so_sema */
- unsigned int so_flags; /* protected by so_sema */
atomic_t so_count;
- long so_generation;
struct rpc_cred *so_cred; /* Associated cred */
struct list_head so_states;
@@ -596,7 +609,8 @@ struct nfs4_state_owner {
struct nfs4_lock_state {
struct list_head ls_locks; /* Other lock stateids */
fl_owner_t ls_owner; /* POSIX lock owner */
- struct nfs4_state * ls_parent; /* Parent nfs4_state */
+#define NFS_LOCK_INITIALIZED 1
+ int ls_flags;
u32 ls_seqid;
u32 ls_id;
nfs4_stateid ls_stateid;
@@ -629,6 +643,11 @@ struct nfs4_state {
};
+struct nfs4_exception {
+ long timeout;
+ int retry;
+};
+
extern struct dentry_operations nfs4_dentry_operations;
extern struct inode_operations nfs4_dir_inode_operations;
@@ -639,10 +658,12 @@ extern int nfs4_open_reclaim(struct nfs4_state_owner *, struct nfs4_state *);
extern int nfs4_proc_async_renew(struct nfs4_client *);
extern int nfs4_proc_renew(struct nfs4_client *);
extern int nfs4_do_close(struct inode *, struct nfs4_state *);
-int nfs4_do_downgrade(struct inode *inode, struct nfs4_state *state, mode_t mode);
+extern int nfs4_do_downgrade(struct inode *inode, struct nfs4_state *state, mode_t mode);
extern int nfs4_wait_clnt_recover(struct rpc_clnt *, struct nfs4_client *);
extern struct inode *nfs4_atomic_open(struct inode *, struct dentry *, struct nameidata *);
extern int nfs4_open_revalidate(struct inode *, struct dentry *, int);
+extern int nfs4_handle_exception(struct nfs_server *, int, struct nfs4_exception *);
+extern int nfs4_lock_reclaim(struct nfs4_state *state, struct file_lock *request);
/* nfs4renewd.c */
extern void nfs4_schedule_state_renewal(struct nfs4_client *);
@@ -654,6 +675,7 @@ extern void init_nfsv4_state(struct nfs_server *);
extern void destroy_nfsv4_state(struct nfs_server *);
extern struct nfs4_client *nfs4_get_client(struct in_addr *);
extern void nfs4_put_client(struct nfs4_client *clp);
+extern int nfs4_init_client(struct nfs4_client *clp);
extern u32 nfs4_alloc_lockowner_id(struct nfs4_client *);
extern struct nfs4_state_owner * nfs4_get_state_owner(struct nfs_server *, struct rpc_cred *);
@@ -663,14 +685,13 @@ extern void nfs4_put_open_state(struct nfs4_state *);
extern void nfs4_close_state(struct nfs4_state *, mode_t);
extern struct nfs4_state *nfs4_find_state(struct inode *, struct rpc_cred *, mode_t mode);
extern void nfs4_increment_seqid(int status, struct nfs4_state_owner *sp);
-extern int nfs4_handle_error(struct nfs_server *, int);
extern void nfs4_schedule_state_recovery(struct nfs4_client *);
extern struct nfs4_lock_state *nfs4_find_lock_state(struct nfs4_state *state, fl_owner_t);
-extern struct nfs4_lock_state *nfs4_alloc_lock_state(struct nfs4_state *state, fl_owner_t);
+extern struct nfs4_lock_state *nfs4_get_lock_state(struct nfs4_state *state, fl_owner_t);
extern void nfs4_put_lock_state(struct nfs4_lock_state *state);
extern void nfs4_increment_lock_seqid(int status, struct nfs4_lock_state *ls);
-extern void nfs4_notify_setlk(struct inode *, struct file_lock *, struct nfs4_lock_state *);
-extern void nfs4_notify_unlck(struct inode *, struct file_lock *, struct nfs4_lock_state *);
+extern void nfs4_notify_setlk(struct nfs4_state *, struct file_lock *, struct nfs4_lock_state *);
+extern void nfs4_notify_unlck(struct nfs4_state *, struct file_lock *, struct nfs4_lock_state *);
extern void nfs4_copy_stateid(nfs4_stateid *, struct nfs4_state *, fl_owner_t);
@@ -681,6 +702,7 @@ struct nfs4_mount_data;
#define destroy_nfsv4_state(server) do { } while (0)
#define nfs4_put_state_owner(inode, owner) do { } while (0)
#define nfs4_put_open_state(state) do { } while (0)
+#define nfs4_close_state(a, b) do { } while (0)
#define nfs4_renewd_prepare_shutdown(server) do { } while (0)
#endif
diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h
index 12a6758cc859..39e4895bcdb4 100644
--- a/include/linux/nfs_page.h
+++ b/include/linux/nfs_page.h
@@ -29,14 +29,9 @@
struct nfs_page {
struct list_head wb_list, /* Defines state of page: */
*wb_list_head; /* read/write/commit */
- struct file *wb_file;
- fl_owner_t wb_lockowner;
- struct inode *wb_inode;
- struct rpc_cred *wb_cred;
- struct nfs4_state *wb_state;
struct page *wb_page; /* page to read in/write out */
+ struct nfs_open_context *wb_context; /* File state context info */
atomic_t wb_complete; /* i/os we're waiting for */
- wait_queue_head_t wb_wait; /* wait queue */
unsigned long wb_index; /* Offset >> PAGE_CACHE_SHIFT */
unsigned int wb_offset, /* Offset & ~PAGE_CACHE_MASK */
wb_pgbase, /* Start of page data */
@@ -50,9 +45,11 @@ struct nfs_page {
#define NFS_NEED_COMMIT(req) (test_bit(PG_NEED_COMMIT,&(req)->wb_flags))
#define NFS_NEED_RESCHED(req) (test_bit(PG_NEED_RESCHED,&(req)->wb_flags))
-extern struct nfs_page *nfs_create_request(struct file *, struct inode *,
- struct page *,
- unsigned int, unsigned int);
+extern struct nfs_page *nfs_create_request(struct nfs_open_context *ctx,
+ struct inode *inode,
+ struct page *page,
+ unsigned int offset,
+ unsigned int count);
extern void nfs_clear_request(struct nfs_page *req);
extern void nfs_release_request(struct nfs_page *req);
@@ -64,6 +61,7 @@ extern int nfs_scan_list(struct list_head *, struct list_head *,
extern int nfs_coalesce_requests(struct list_head *, struct list_head *,
unsigned int);
extern int nfs_wait_on_request(struct nfs_page *);
+extern void nfs_unlock_request(struct nfs_page *req);
/*
* Lock the page of an asynchronous request without incrementing the wb_count
@@ -88,19 +86,6 @@ nfs_lock_request(struct nfs_page *req)
return 1;
}
-static inline void
-nfs_unlock_request(struct nfs_page *req)
-{
- if (!NFS_WBACK_BUSY(req)) {
- printk(KERN_ERR "NFS: Invalid unlock attempted\n");
- BUG();
- }
- smp_mb__before_clear_bit();
- clear_bit(PG_BUSY, &req->wb_flags);
- smp_mb__after_clear_bit();
- wake_up_all(&req->wb_wait);
- nfs_release_request(req);
-}
/**
* nfs_list_remove_request - Remove a request from its wb_list
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
index 2c7f4617e650..15f1c41b4f7a 100644
--- a/include/linux/nfs_xdr.h
+++ b/include/linux/nfs_xdr.h
@@ -235,8 +235,7 @@ struct nfs_lockres {
struct nfs_readargs {
struct nfs_fh * fh;
- fl_owner_t lockowner;
- struct nfs4_state * state;
+ struct nfs_open_context *context;
__u64 offset;
__u32 count;
unsigned int pgbase;
@@ -259,8 +258,7 @@ struct nfs_readres {
struct nfs_writeargs {
struct nfs_fh * fh;
- fl_owner_t lockowner;
- struct nfs4_state * state;
+ struct nfs_open_context *context;
__u64 offset;
__u32 count;
enum nfs3_stable_how stable;
@@ -597,13 +595,15 @@ struct nfs4_rename_res {
};
struct nfs4_setclientid {
- nfs4_verifier sc_verifier; /* request */
- char * sc_name; /* request */
+ const nfs4_verifier * sc_verifier; /* request */
+ unsigned int sc_name_len;
+ char sc_name[32]; /* request */
u32 sc_prog; /* request */
+ unsigned int sc_netid_len;
char sc_netid[4]; /* request */
+ unsigned int sc_uaddr_len;
char sc_uaddr[24]; /* request */
u32 sc_cb_ident; /* request */
- struct nfs4_client * sc_state; /* response */
};
struct nfs4_statfs_arg {
@@ -669,16 +669,17 @@ struct nfs_rpc_ops {
int (*getroot) (struct nfs_server *, struct nfs_fh *,
struct nfs_fsinfo *);
- int (*getattr) (struct inode *, struct nfs_fattr *);
+ int (*getattr) (struct nfs_server *, struct nfs_fh *,
+ struct nfs_fattr *);
int (*setattr) (struct dentry *, struct nfs_fattr *,
struct iattr *);
int (*lookup) (struct inode *, struct qstr *,
struct nfs_fh *, struct nfs_fattr *);
int (*access) (struct inode *, struct nfs_access_entry *);
int (*readlink)(struct inode *, struct page *);
- int (*read) (struct nfs_read_data *, struct file *);
- int (*write) (struct nfs_write_data *, struct file *);
- int (*commit) (struct nfs_write_data *, struct file *);
+ int (*read) (struct nfs_read_data *);
+ int (*write) (struct nfs_write_data *);
+ int (*commit) (struct nfs_write_data *);
struct inode * (*create) (struct inode *, struct qstr *,
struct iattr *, int);
int (*remove) (struct inode *, struct qstr *);
@@ -710,8 +711,6 @@ struct nfs_rpc_ops {
void (*commit_setup) (struct nfs_write_data *, int how);
int (*file_open) (struct inode *, struct file *);
int (*file_release) (struct inode *, struct file *);
- void (*request_init)(struct nfs_page *, struct file *);
- int (*request_compatible)(struct nfs_page *, struct file *, struct page *);
int (*lock)(struct file *, int, struct file_lock *);
};