video: tegra: host: Access nvhost_master via drvdata
[linux-2.6.git] / include / linux / nfs_xdr.h
index ca643aa..8475f34 100644 (file)
@@ -2,6 +2,8 @@
 #define _LINUX_NFS_XDR_H
 
 #include <linux/nfsacl.h>
+#include <linux/nfs3.h>
+#include <linux/sunrpc/gss_api.h>
 
 /*
  * To change the maximum rsize and wsize supported by the NFS client, adjust
@@ -13,6 +15,9 @@
 #define NFS_DEF_FILE_IO_SIZE   (4096U)
 #define NFS_MIN_FILE_IO_SIZE   (1024U)
 
+/* Forward declaration for NFS v3 */
+struct nfs4_secinfo_flavors;
+
 struct nfs_fsid {
        uint64_t                major;
        uint64_t                minor;
@@ -45,6 +50,7 @@ struct nfs_fattr {
        } du;
        struct nfs_fsid         fsid;
        __u64                   fileid;
+       __u64                   mounted_on_fileid;
        struct timespec         atime;
        struct timespec         mtime;
        struct timespec         ctime;
@@ -77,6 +83,8 @@ struct nfs_fattr {
 #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_MOUNTPOINT      (1U << 20)      /* Treat as mountpoint */
+#define NFS_ATTR_FATTR_MOUNTED_ON_FILEID               (1U << 21)
 
 #define NFS_ATTR_FATTR (NFS_ATTR_FATTR_TYPE \
                | NFS_ATTR_FATTR_MODE \
@@ -111,7 +119,10 @@ struct nfs_fsinfo {
        __u32                   wtmult; /* writes should be multiple of this */
        __u32                   dtpref; /* pref. readdir transfer size */
        __u64                   maxfilesize;
+       struct timespec         time_delta; /* server time granularity */
        __u32                   lease_time; /* in seconds */
+       __u32                   layouttype; /* supported pnfs layout driver */
+       __u32                   blksize; /* preferred pnfs io block size */
 };
 
 struct nfs_fsstat {
@@ -148,7 +159,6 @@ struct nfs_seqid;
 
 /* nfs41 sessions channel attributes */
 struct nfs4_channel_attrs {
-       u32                     headerpadsz;
        u32                     max_rqst_sz;
        u32                     max_resp_sz;
        u32                     max_resp_sz_cached;
@@ -169,9 +179,10 @@ struct nfs4_sequence_args {
 
 struct nfs4_sequence_res {
        struct nfs4_session     *sr_session;
-       u8                      sr_slotid;      /* slot used to send request */
-       unsigned long           sr_renewal_time;
+       struct nfs4_slot        *sr_slot;       /* slot used to send request */
        int                     sr_status;      /* sequence operation status */
+       unsigned long           sr_renewal_time;
+       u32                     sr_status_flags;
 };
 
 struct nfs4_get_lease_time_args {
@@ -183,6 +194,115 @@ struct nfs4_get_lease_time_res {
        struct nfs4_sequence_res        lr_seq_res;
 };
 
+#define PNFS_LAYOUT_MAXSIZE 4096
+
+struct nfs4_layoutdriver_data {
+       struct page **pages;
+       __u32 pglen;
+       __u32 len;
+};
+
+struct pnfs_layout_range {
+       u32 iomode;
+       u64 offset;
+       u64 length;
+};
+
+struct nfs4_layoutget_args {
+       __u32 type;
+       struct pnfs_layout_range range;
+       __u64 minlength;
+       __u32 maxcount;
+       struct inode *inode;
+       struct nfs_open_context *ctx;
+       struct nfs4_sequence_args seq_args;
+       nfs4_stateid stateid;
+       struct nfs4_layoutdriver_data layout;
+};
+
+struct nfs4_layoutget_res {
+       __u32 return_on_close;
+       struct pnfs_layout_range range;
+       __u32 type;
+       nfs4_stateid stateid;
+       struct nfs4_sequence_res seq_res;
+       struct nfs4_layoutdriver_data *layoutp;
+};
+
+struct nfs4_layoutget {
+       struct nfs4_layoutget_args args;
+       struct nfs4_layoutget_res res;
+       struct pnfs_layout_segment **lsegpp;
+       gfp_t gfp_flags;
+};
+
+struct nfs4_getdevicelist_args {
+       const struct nfs_fh *fh;
+       u32 layoutclass;
+       struct nfs4_sequence_args seq_args;
+};
+
+struct nfs4_getdevicelist_res {
+       struct pnfs_devicelist *devlist;
+       struct nfs4_sequence_res seq_res;
+};
+
+struct nfs4_getdeviceinfo_args {
+       struct pnfs_device *pdev;
+       struct nfs4_sequence_args seq_args;
+};
+
+struct nfs4_getdeviceinfo_res {
+       struct pnfs_device *pdev;
+       struct nfs4_sequence_res seq_res;
+};
+
+struct nfs4_layoutcommit_args {
+       nfs4_stateid stateid;
+       __u64 lastbytewritten;
+       struct inode *inode;
+       const u32 *bitmask;
+       struct nfs4_sequence_args seq_args;
+};
+
+struct nfs4_layoutcommit_res {
+       struct nfs_fattr *fattr;
+       const struct nfs_server *server;
+       struct nfs4_sequence_res seq_res;
+       int status;
+};
+
+struct nfs4_layoutcommit_data {
+       struct rpc_task task;
+       struct nfs_fattr fattr;
+       struct list_head lseg_list;
+       struct rpc_cred *cred;
+       struct nfs4_layoutcommit_args args;
+       struct nfs4_layoutcommit_res res;
+};
+
+struct nfs4_layoutreturn_args {
+       struct pnfs_layout_hdr *layout;
+       struct inode *inode;
+       nfs4_stateid stateid;
+       __u32   layout_type;
+       struct nfs4_sequence_args seq_args;
+};
+
+struct nfs4_layoutreturn_res {
+       struct nfs4_sequence_res seq_res;
+       u32 lrs_present;
+       nfs4_stateid stateid;
+};
+
+struct nfs4_layoutreturn {
+       struct nfs4_layoutreturn_args args;
+       struct nfs4_layoutreturn_res res;
+       struct rpc_cred *cred;
+       struct nfs_client *clp;
+       int rpc_status;
+};
+
 /*
  * Arguments to the open call.
  */
@@ -194,8 +314,10 @@ struct nfs_openargs {
        __u64                   clientid;
        __u64                   id;
        union {
-               struct iattr *  attrs;    /* UNCHECKED, GUARDED */
-               nfs4_verifier   verifier; /* EXCLUSIVE */
+               struct {
+                       struct iattr *  attrs;    /* UNCHECKED, GUARDED */
+                       nfs4_verifier   verifier; /* EXCLUSIVE */
+               };
                nfs4_stateid    delegation;             /* CLAIM_DELEGATE_CUR */
                fmode_t         delegation_type;        /* CLAIM_PREVIOUS */
        } u;
@@ -262,6 +384,7 @@ struct nfs_closeres {
 struct nfs_lowner {
        __u64                   clientid;
        __u64                   id;
+       dev_t                   s_dev;
 };
 
 struct nfs_lock_args {
@@ -311,6 +434,10 @@ struct nfs_lockt_res {
        struct nfs4_sequence_res        seq_res;
 };
 
+struct nfs_release_lockowner_args {
+       struct nfs_lowner       lock_owner;
+};
+
 struct nfs4_delegreturnargs {
        const struct nfs_fh *fhandle;
        const nfs4_stateid *stateid;
@@ -330,6 +457,7 @@ struct nfs4_delegreturnres {
 struct nfs_readargs {
        struct nfs_fh *         fh;
        struct nfs_open_context *context;
+       struct nfs_lock_context *lock_context;
        __u64                   offset;
        __u32                   count;
        unsigned int            pgbase;
@@ -350,6 +478,7 @@ struct nfs_readres {
 struct nfs_writeargs {
        struct nfs_fh *         fh;
        struct nfs_open_context *context;
+       struct nfs_lock_context *lock_context;
        __u64                   offset;
        __u32                   count;
        enum nfs3_stable_how    stable;
@@ -384,12 +513,33 @@ struct nfs_removeargs {
 
 struct nfs_removeres {
        const struct nfs_server *server;
+       struct nfs_fattr        *dir_attr;
        struct nfs4_change_info cinfo;
-       struct nfs_fattr        dir_attr;
        struct nfs4_sequence_res        seq_res;
 };
 
 /*
+ * Common arguments to the rename call
+ */
+struct nfs_renameargs {
+       const struct nfs_fh             *old_dir;
+       const struct nfs_fh             *new_dir;
+       const struct qstr               *old_name;
+       const struct qstr               *new_name;
+       const u32                       *bitmask;
+       struct nfs4_sequence_args       seq_args;
+};
+
+struct nfs_renameres {
+       const struct nfs_server         *server;
+       struct nfs4_change_info         old_cinfo;
+       struct nfs_fattr                *old_fattr;
+       struct nfs4_change_info         new_cinfo;
+       struct nfs_fattr                *new_fattr;
+       struct nfs4_sequence_res        seq_res;
+};
+
+/*
  * Argument struct for decode_entry function
  */
 struct nfs_entry {
@@ -401,6 +551,8 @@ struct nfs_entry {
        int                     eof;
        struct nfs_fh *         fh;
        struct nfs_fattr *      fattr;
+       unsigned char           d_type;
+       struct nfs_server *     server;
 };
 
 /*
@@ -424,15 +576,6 @@ struct nfs_createargs {
        struct iattr *          sattr;
 };
 
-struct nfs_renameargs {
-       struct nfs_fh *         fromfh;
-       const char *            fromname;
-       unsigned int            fromlen;
-       struct nfs_fh *         tofh;
-       const char *            toname;
-       unsigned int            tolen;
-};
-
 struct nfs_setattrargs {
        struct nfs_fh *                 fh;
        nfs4_stateid                    stateid;
@@ -576,15 +719,6 @@ struct nfs3_mknodargs {
        dev_t                   rdev;
 };
 
-struct nfs3_renameargs {
-       struct nfs_fh *         fromfh;
-       const char *            fromname;
-       unsigned int            fromlen;
-       struct nfs_fh *         tofh;
-       const char *            toname;
-       unsigned int            tolen;
-};
-
 struct nfs3_linkargs {
        struct nfs_fh *         fromfh;
        struct nfs_fh *         tofh;
@@ -619,11 +753,6 @@ struct nfs3_readlinkargs {
        struct page **          pages;
 };
 
-struct nfs3_renameres {
-       struct nfs_fattr *      fromattr;
-       struct nfs_fattr *      toattr;
-};
-
 struct nfs3_linkres {
        struct nfs_fattr *      dir_attr;
        struct nfs_fattr *      fattr;
@@ -644,6 +773,11 @@ struct nfs3_getaclres {
        struct posix_acl *      acl_default;
 };
 
+struct nfs4_string {
+       unsigned int len;
+       char *data;
+};
+
 #ifdef CONFIG_NFS_V4
 
 typedef u64 clientid4;
@@ -770,6 +904,7 @@ struct nfs4_readdir_arg {
        struct page **                  pages;  /* zero-copy data */
        unsigned int                    pgbase; /* zero-copy data */
        const u32 *                     bitmask;
+       int                             plus;
        struct nfs4_sequence_args       seq_args;
 };
 
@@ -791,24 +926,6 @@ struct nfs4_readlink_res {
        struct nfs4_sequence_res        seq_res;
 };
 
-struct nfs4_rename_arg {
-       const struct nfs_fh *           old_dir;
-       const struct nfs_fh *           new_dir;
-       const struct qstr *             old_name;
-       const struct qstr *             new_name;
-       const u32 *                     bitmask;
-       struct nfs4_sequence_args       seq_args;
-};
-
-struct nfs4_rename_res {
-       const struct nfs_server *       server;
-       struct nfs4_change_info         old_cinfo;
-       struct nfs_fattr *              old_fattr;
-       struct nfs4_change_info         new_cinfo;
-       struct nfs_fattr *              new_fattr;
-       struct nfs4_sequence_res        seq_res;
-};
-
 #define NFS4_SETCLIENTID_NAMELEN       (127)
 struct nfs4_setclientid {
        const nfs4_verifier *           sc_verifier;
@@ -822,6 +939,11 @@ struct nfs4_setclientid {
        u32                             sc_cb_ident;
 };
 
+struct nfs4_setclientid_res {
+       u64                             clientid;
+       nfs4_verifier                   confirm;
+};
+
 struct nfs4_statfs_arg {
        const struct nfs_fh *           fh;
        const u32 *                     bitmask;
@@ -839,18 +961,13 @@ struct nfs4_server_caps_arg {
 };
 
 struct nfs4_server_caps_res {
-       u32                             attr_bitmask[2];
+       u32                             attr_bitmask[3];
        u32                             acl_bitmask;
        u32                             has_links;
        u32                             has_symlinks;
        struct nfs4_sequence_res        seq_res;
 };
 
-struct nfs4_string {
-       unsigned int len;
-       char *data;
-};
-
 #define NFS4_PATHNAME_MAXCOMPONENTS 512
 struct nfs4_pathname {
        unsigned int ncomponents;
@@ -886,6 +1003,38 @@ struct nfs4_fs_locations_res {
        struct nfs4_sequence_res        seq_res;
 };
 
+struct nfs4_secinfo_oid {
+       unsigned int len;
+       char data[GSS_OID_MAX_LEN];
+};
+
+struct nfs4_secinfo_gss {
+       struct nfs4_secinfo_oid sec_oid4;
+       unsigned int qop4;
+       unsigned int service;
+};
+
+struct nfs4_secinfo_flavor {
+       unsigned int            flavor;
+       struct nfs4_secinfo_gss gss;
+};
+
+struct nfs4_secinfo_flavors {
+       unsigned int num_flavors;
+       struct nfs4_secinfo_flavor flavors[0];
+};
+
+struct nfs4_secinfo_arg {
+       const struct nfs_fh             *dir_fh;
+       const struct qstr               *name;
+       struct nfs4_sequence_args       seq_args;
+};
+
+struct nfs4_secinfo_res {
+       struct nfs4_secinfo_flavors     *flavors;
+       struct nfs4_sequence_res        seq_res;
+};
+
 #endif /* CONFIG_NFS_V4 */
 
 struct nfstime4 {
@@ -925,7 +1074,58 @@ struct server_scope {
 struct nfs41_exchange_id_res {
        struct nfs_client               *client;
        u32                             flags;
+       struct server_scope             *server_scope;
+};
+
+struct nfs41_create_session_args {
+       struct nfs_client              *client;
+       uint32_t                        flags;
+       uint32_t                        cb_program;
+       struct nfs4_channel_attrs       fc_attrs;       /* Fore Channel */
+       struct nfs4_channel_attrs       bc_attrs;       /* Back Channel */
+};
+
+struct nfs41_create_session_res {
+       struct nfs_client              *client;
+};
+
+struct nfs41_reclaim_complete_args {
+       /* In the future extend to include curr_fh for use with migration */
+       unsigned char                   one_fs:1;
+       struct nfs4_sequence_args       seq_args;
+};
+
+struct nfs41_reclaim_complete_res {
+       struct nfs4_sequence_res        seq_res;
+};
+
+#define SECINFO_STYLE_CURRENT_FH 0
+#define SECINFO_STYLE_PARENT 1
+struct nfs41_secinfo_no_name_args {
+       int                             style;
+       struct nfs4_sequence_args       seq_args;
+};
+
+struct nfs41_test_stateid_args {
+       nfs4_stateid                    *stateid;
+       struct nfs4_sequence_args       seq_args;
 };
+
+struct nfs41_test_stateid_res {
+       unsigned int                    status;
+       struct nfs4_sequence_res        seq_res;
+};
+
+struct nfs41_free_stateid_args {
+       nfs4_stateid                    *stateid;
+       struct nfs4_sequence_args       seq_args;
+};
+
+struct nfs41_free_stateid_res {
+       unsigned int                    status;
+       struct nfs4_sequence_res        seq_res;
+};
+
 #endif /* CONFIG_NFS_V4_1 */
 
 struct nfs_page;
@@ -939,14 +1139,19 @@ struct nfs_read_data {
        struct rpc_cred         *cred;
        struct nfs_fattr        fattr;  /* fattr storage */
        struct list_head        pages;  /* Coalesced read requests */
+       struct list_head        list;   /* lists of struct nfs_read_data */
        struct nfs_page         *req;   /* multi ops per nfs_page */
        struct page             **pagevec;
        unsigned int            npages; /* Max length of pagevec */
        struct nfs_readargs args;
        struct nfs_readres  res;
-#ifdef CONFIG_NFS_V4
        unsigned long           timestamp;      /* For lease renewal */
-#endif
+       struct pnfs_layout_segment *lseg;
+       struct nfs_client       *ds_clp;        /* pNFS data server */
+       const struct rpc_call_ops *mds_ops;
+       int (*read_done_cb) (struct rpc_task *task, struct nfs_read_data *data);
+       __u64                   mds_offset;
+       int                     pnfs_error;
        struct page             *page_array[NFS_PAGEVEC_SIZE];
 };
 
@@ -958,18 +1163,28 @@ struct nfs_write_data {
        struct nfs_fattr        fattr;
        struct nfs_writeverf    verf;
        struct list_head        pages;          /* Coalesced requests we wish to flush */
+       struct list_head        list;           /* lists of struct nfs_write_data */
        struct nfs_page         *req;           /* multi ops per nfs_page */
        struct page             **pagevec;
        unsigned int            npages;         /* Max length of pagevec */
        struct nfs_writeargs    args;           /* argument struct */
        struct nfs_writeres     res;            /* result struct */
+       struct pnfs_layout_segment *lseg;
+       struct nfs_client       *ds_clp;        /* pNFS data server */
+       int                     ds_commit_index;
+       const struct rpc_call_ops *mds_ops;
+       int (*write_done_cb) (struct rpc_task *task, struct nfs_write_data *data);
 #ifdef CONFIG_NFS_V4
        unsigned long           timestamp;      /* For lease renewal */
 #endif
+       __u64                   mds_offset;     /* Filelayout dense stripe */
+       int                     pnfs_error;
        struct page             *page_array[NFS_PAGEVEC_SIZE];
 };
 
 struct nfs_access_entry;
+struct nfs_client;
+struct rpc_timeout;
 
 /*
  * RPC procedure vector for NFSv2/NFSv3 demuxing
@@ -979,6 +1194,7 @@ struct nfs_rpc_ops {
        const struct dentry_operations *dentry_ops;
        const struct inode_operations *dir_inode_ops;
        const struct inode_operations *file_inode_ops;
+       const struct file_operations *file_ops;
 
        int     (*getroot) (struct nfs_server *, struct nfs_fh *,
                            struct nfs_fsinfo *);
@@ -989,25 +1205,27 @@ struct nfs_rpc_ops {
                            struct nfs_fattr *);
        int     (*setattr) (struct dentry *, struct nfs_fattr *,
                            struct iattr *);
-       int     (*lookup)  (struct inode *, struct qstr *,
+       int     (*lookup)  (struct rpc_clnt *clnt, struct inode *, struct qstr *,
                            struct nfs_fh *, struct nfs_fattr *);
        int     (*access)  (struct inode *, struct nfs_access_entry *);
        int     (*readlink)(struct inode *, struct page *, unsigned int,
                            unsigned int);
        int     (*create)  (struct inode *, struct dentry *,
-                           struct iattr *, int, struct nameidata *);
+                           struct iattr *, int, struct nfs_open_context *);
        int     (*remove)  (struct inode *, struct qstr *);
        void    (*unlink_setup)  (struct rpc_message *, struct inode *dir);
        int     (*unlink_done) (struct rpc_task *, struct inode *);
        int     (*rename)  (struct inode *, struct qstr *,
                            struct inode *, struct qstr *);
+       void    (*rename_setup)  (struct rpc_message *msg, struct inode *dir);
+       int     (*rename_done) (struct rpc_task *task, struct inode *old_dir, struct inode *new_dir);
        int     (*link)    (struct inode *, struct inode *, struct qstr *);
        int     (*symlink) (struct inode *, struct dentry *, struct page *,
                            unsigned int, struct iattr *);
        int     (*mkdir)   (struct inode *, struct dentry *, struct iattr *);
        int     (*rmdir)   (struct inode *, struct qstr *);
        int     (*readdir) (struct dentry *, struct rpc_cred *,
-                           u64, struct page *, unsigned int, int);
+                           u64, struct page **, unsigned int, int);
        int     (*mknod)   (struct inode *, struct dentry *, struct iattr *,
                            dev_t);
        int     (*statfs)  (struct nfs_server *, struct nfs_fh *,
@@ -1017,7 +1235,7 @@ struct nfs_rpc_ops {
        int     (*pathconf) (struct nfs_server *, struct nfs_fh *,
                             struct nfs_pathconf *);
        int     (*set_capabilities)(struct nfs_server *, struct nfs_fh *);
-       __be32 *(*decode_dirent)(__be32 *, struct nfs_entry *, int plus);
+       int     (*decode_dirent)(struct xdr_stream *, struct nfs_entry *, int);
        void    (*read_setup)   (struct nfs_read_data *, struct rpc_message *);
        int     (*read_done)  (struct rpc_task *, struct nfs_read_data *);
        void    (*write_setup)  (struct nfs_write_data *, struct rpc_message *);
@@ -1028,6 +1246,13 @@ struct nfs_rpc_ops {
        int     (*lock_check_bounds)(const struct file_lock *);
        void    (*clear_acl_cache)(struct inode *);
        void    (*close_context)(struct nfs_open_context *ctx, int);
+       struct inode * (*open_context) (struct inode *dir,
+                               struct nfs_open_context *ctx,
+                               int open_flags,
+                               struct iattr *iattr);
+       int     (*init_client) (struct nfs_client *, const struct rpc_timeout *,
+                               const char *, rpc_authflavor_t, int);
+       int     (*secinfo)(struct inode *, const struct qstr *, struct nfs4_secinfo_flavors *);
 };
 
 /*