|
@@ -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);
|