CIFS: Simplify SMB2 create context handling
authorPavel Shilovsky <pshilovsky@samba.org>
Thu, 4 Jul 2013 15:10:00 +0000 (19:10 +0400)
committerSteve French <smfrench@gmail.com>
Wed, 10 Jul 2013 18:08:39 +0000 (13:08 -0500)
to make it easier to add other create context further.

Signed-off-by: Pavel Shilovsky <pshilovsky@samba.org>
Signed-off-by: Steven French <steven@steven-GA-970A-DS3.(none)>
fs/cifs/smb2pdu.c

index 9a35dcda9099731ae242cdb89f0bfe22ff9ee71d..e65ccdb528cf05343ff1a9d9f2bb3de6deb5c673 100644 (file)
@@ -878,6 +878,29 @@ parse_lease_state(struct smb2_create_rsp *rsp)
        return smb2_map_lease_to_oplock(lc->lcontext.LeaseState);
 }
 
+static int
+add_lease_context(struct kvec *iov, unsigned int *num_iovec, __u8 *oplock)
+{
+       struct smb2_create_req *req = iov[0].iov_base;
+       unsigned int num = *num_iovec;
+
+       iov[num].iov_base = create_lease_buf(oplock+1, *oplock);
+       if (iov[num].iov_base == NULL)
+               return -ENOMEM;
+       iov[num].iov_len = sizeof(struct create_lease);
+       req->RequestedOplockLevel = SMB2_OPLOCK_LEVEL_LEASE;
+       if (!req->CreateContextsOffset)
+               req->CreateContextsOffset = cpu_to_le32(
+                               sizeof(struct smb2_create_req) - 4 +
+                               iov[num - 1].iov_len);
+       req->CreateContextsLength = cpu_to_le32(
+                               le32_to_cpu(req->CreateContextsLength) +
+                               sizeof(struct create_lease));
+       inc_rfc1001_len(&req->hdr, sizeof(struct create_lease));
+       *num_iovec = num + 1;
+       return 0;
+}
+
 int
 SMB2_open(const unsigned int xid, struct cifs_tcon *tcon, __le16 *path,
          u64 *persistent_fid, u64 *volatile_fid, __u32 desired_access,
@@ -956,21 +979,12 @@ SMB2_open(const unsigned int xid, struct cifs_tcon *tcon, __le16 *path,
            *oplock == SMB2_OPLOCK_LEVEL_NONE)
                req->RequestedOplockLevel = *oplock;
        else {
-               iov[num_iovecs].iov_base = create_lease_buf(oplock+1, *oplock);
-               if (iov[num_iovecs].iov_base == NULL) {
+               rc = add_lease_context(iov, &num_iovecs, oplock);
+               if (rc) {
                        cifs_small_buf_release(req);
                        kfree(copy_path);
-                       return -ENOMEM;
+                       return rc;
                }
-               iov[num_iovecs].iov_len = sizeof(struct create_lease);
-               req->RequestedOplockLevel = SMB2_OPLOCK_LEVEL_LEASE;
-               req->CreateContextsOffset = cpu_to_le32(
-                       sizeof(struct smb2_create_req) - 4 +
-                       iov[num_iovecs-1].iov_len);
-               req->CreateContextsLength = cpu_to_le32(
-                       sizeof(struct create_lease));
-               inc_rfc1001_len(&req->hdr, sizeof(struct create_lease));
-               num_iovecs++;
        }
 
        rc = SendReceive2(xid, ses, iov, num_iovecs, &resp_buftype, 0);