Merge branch 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[linux-2.6-block.git] / fs / cifs / cifsglob.h
index 94dbdbe5be3458421568200d16d0a19652ae1161..f293e052e351de99e4ebad80cc9805375e5980b4 100644 (file)
@@ -216,6 +216,7 @@ struct cifs_io_parms;
 struct cifs_search_info;
 struct cifsInodeInfo;
 struct cifs_open_parms;
+struct cifs_credits;
 
 struct smb_version_operations {
        int (*send_cancel)(struct TCP_Server_Info *, struct smb_rqst *,
@@ -230,12 +231,15 @@ struct smb_version_operations {
        /* check response: verify signature, map error */
        int (*check_receive)(struct mid_q_entry *, struct TCP_Server_Info *,
                             bool);
-       void (*add_credits)(struct TCP_Server_Info *, const unsigned int,
-                           const int);
+       void (*add_credits)(struct TCP_Server_Info *server,
+                           const struct cifs_credits *credits,
+                           const int optype);
        void (*set_credits)(struct TCP_Server_Info *, const int);
        int * (*get_credits_field)(struct TCP_Server_Info *, const int);
        unsigned int (*get_credits)(struct mid_q_entry *);
        __u64 (*get_next_mid)(struct TCP_Server_Info *);
+       void (*revert_current_mid)(struct TCP_Server_Info *server,
+                                  const unsigned int val);
        /* data offset from read response message */
        unsigned int (*read_data_offset)(char *);
        /*
@@ -383,8 +387,8 @@ struct smb_version_operations {
                         struct cifs_fid *);
        /* calculate a size of SMB message */
        unsigned int (*calc_smb_size)(void *buf, struct TCP_Server_Info *ptcpi);
-       /* check for STATUS_PENDING and process it in a positive case */
-       bool (*is_status_pending)(char *, struct TCP_Server_Info *, int);
+       /* check for STATUS_PENDING and process the response if yes */
+       bool (*is_status_pending)(char *buf, struct TCP_Server_Info *server);
        /* check for STATUS_NETWORK_SESSION_EXPIRED */
        bool (*is_session_expired)(char *);
        /* send oplock break response */
@@ -452,7 +456,11 @@ struct smb_version_operations {
        unsigned int (*wp_retry_size)(struct inode *);
        /* get mtu credits */
        int (*wait_mtu_credits)(struct TCP_Server_Info *, unsigned int,
-                               unsigned int *, unsigned int *);
+                               unsigned int *, struct cifs_credits *);
+       /* adjust previously taken mtu credits to request size */
+       int (*adjust_credits)(struct TCP_Server_Info *server,
+                             struct cifs_credits *credits,
+                             const unsigned int payload_size);
        /* check if we need to issue closedir */
        bool (*dir_needs_close)(struct cifsFileInfo *);
        long (*fallocate)(struct file *, struct cifs_tcon *, int, loff_t,
@@ -557,6 +565,7 @@ struct smb_vol {
        bool resilient:1; /* noresilient not required since not fored for CA */
        bool domainauto:1;
        bool rdma:1;
+       unsigned int bsize;
        unsigned int rsize;
        unsigned int wsize;
        bool sockopt_tcp_nodelay:1;
@@ -710,6 +719,11 @@ struct TCP_Server_Info {
        int nr_targets;
 };
 
+struct cifs_credits {
+       unsigned int value;
+       unsigned int instance;
+};
+
 static inline unsigned int
 in_flight(struct TCP_Server_Info *server)
 {
@@ -731,18 +745,18 @@ has_credits(struct TCP_Server_Info *server, int *credits)
 }
 
 static inline void
-add_credits(struct TCP_Server_Info *server, const unsigned int add,
+add_credits(struct TCP_Server_Info *server, const struct cifs_credits *credits,
            const int optype)
 {
-       server->ops->add_credits(server, add, optype);
+       server->ops->add_credits(server, credits, optype);
 }
 
 static inline void
-add_credits_and_wake_if(struct TCP_Server_Info *server, const unsigned int add,
-                       const int optype)
+add_credits_and_wake_if(struct TCP_Server_Info *server,
+                       const struct cifs_credits *credits, const int optype)
 {
-       if (add) {
-               server->ops->add_credits(server, add, optype);
+       if (credits->value) {
+               server->ops->add_credits(server, credits, optype);
                wake_up(&server->request_q);
        }
 }
@@ -753,6 +767,14 @@ set_credits(struct TCP_Server_Info *server, const int val)
        server->ops->set_credits(server, val);
 }
 
+static inline int
+adjust_credits(struct TCP_Server_Info *server, struct cifs_credits *credits,
+              const unsigned int payload_size)
+{
+       return server->ops->adjust_credits ?
+               server->ops->adjust_credits(server, credits, payload_size) : 0;
+}
+
 static inline __le64
 get_next_mid64(struct TCP_Server_Info *server)
 {
@@ -770,6 +792,22 @@ get_next_mid(struct TCP_Server_Info *server)
        return cpu_to_le16(mid);
 }
 
+static inline void
+revert_current_mid(struct TCP_Server_Info *server, const unsigned int val)
+{
+       if (server->ops->revert_current_mid)
+               server->ops->revert_current_mid(server, val);
+}
+
+static inline void
+revert_current_mid_from_hdr(struct TCP_Server_Info *server,
+                           const struct smb2_sync_hdr *shdr)
+{
+       unsigned int num = le16_to_cpu(shdr->CreditCharge);
+
+       return revert_current_mid(server, num > 0 ? num : 1);
+}
+
 static inline __u16
 get_mid(const struct smb_hdr *smb)
 {
@@ -1234,7 +1272,7 @@ struct cifs_readdata {
        unsigned int                    pagesz;
        unsigned int                    page_offset;
        unsigned int                    tailsz;
-       unsigned int                    credits;
+       struct cifs_credits             credits;
        unsigned int                    nr_pages;
        struct page                     **pages;
 };
@@ -1260,7 +1298,7 @@ struct cifs_writedata {
        unsigned int                    pagesz;
        unsigned int                    page_offset;
        unsigned int                    tailsz;
-       unsigned int                    credits;
+       struct cifs_credits             credits;
        unsigned int                    nr_pages;
        struct page                     **pages;
 };
@@ -1422,6 +1460,7 @@ struct mid_q_entry {
        struct kref refcount;
        struct TCP_Server_Info *server; /* server corresponding to this mid */
        __u64 mid;              /* multiplex id */
+       __u16 credits;          /* number of credits consumed by this mid */
        __u32 pid;              /* process id */
        __u32 sequence_number;  /* for CIFS signing */
        unsigned long when_alloc;  /* when mid was created */