cifs: store the leaseKey in the fid on SMB2_open
authorRonnie Sahlberg <lsahlber@redhat.com>
Thu, 26 Apr 2018 14:10:18 +0000 (08:10 -0600)
committerSteve French <stfrench@microsoft.com>
Sun, 27 May 2018 22:56:35 +0000 (17:56 -0500)
In SMB2_open(), if we got a lease we need to store this in the fid structure
or else we will never be able to map a lease break back to which file/fid
it applies to.

Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
Reviewed-by: Pavel Shilovsky <pshilov@microsoft.com>
Signed-off-by: Steve French <smfrench@gmail.com>
fs/cifs/cifsglob.h
fs/cifs/smb2ops.c
fs/cifs/smb2pdu.c

index d71585025ef63a336f56d2dbd3cd89ed33dd0be3..4f674b75bbc87df10a00593ec29d914e77ef8439 100644 (file)
@@ -417,7 +417,7 @@ struct smb_version_operations {
        /* create lease context buffer for CREATE request */
        char * (*create_lease_buf)(u8 *, u8);
        /* parse lease context buffer and return oplock/epoch info */
-       __u8 (*parse_lease_buf)(void *, unsigned int *);
+       __u8 (*parse_lease_buf)(void *buf, unsigned int *epoch, char *lkey);
        ssize_t (*copychunk_range)(const unsigned int,
                        struct cifsFileInfo *src_file,
                        struct cifsFileInfo *target_file,
index 718dbe22528b5fdbb847501f4c555f0257049429..ceaa358723f077ad412a612d4676edbca0e5b21e 100644 (file)
@@ -2079,7 +2079,7 @@ smb3_create_lease_buf(u8 *lease_key, u8 oplock)
 }
 
 static __u8
-smb2_parse_lease_buf(void *buf, unsigned int *epoch)
+smb2_parse_lease_buf(void *buf, unsigned int *epoch, char *lease_key)
 {
        struct create_lease *lc = (struct create_lease *)buf;
 
@@ -2090,13 +2090,16 @@ smb2_parse_lease_buf(void *buf, unsigned int *epoch)
 }
 
 static __u8
-smb3_parse_lease_buf(void *buf, unsigned int *epoch)
+smb3_parse_lease_buf(void *buf, unsigned int *epoch, char *lease_key)
 {
        struct create_lease_v2 *lc = (struct create_lease_v2 *)buf;
 
        *epoch = le16_to_cpu(lc->lcontext.Epoch);
        if (lc->lcontext.LeaseFlags & SMB2_LEASE_FLAG_BREAK_IN_PROGRESS)
                return SMB2_OPLOCK_LEVEL_NOCHANGE;
+       if (lease_key)
+               memcpy(lease_key, &lc->lcontext.LeaseKeyLow,
+                      SMB2_LEASE_KEY_SIZE);
        return le32_to_cpu(lc->lcontext.LeaseState);
 }
 
index 0f48741a0130d35286fec1e031b5eea45e367699..ef77df4ebdf311df5b806dcdd9a31156c64a3f65 100644 (file)
@@ -1575,7 +1575,7 @@ create_reconnect_durable_buf(struct cifs_fid *fid)
 
 static __u8
 parse_lease_state(struct TCP_Server_Info *server, struct smb2_create_rsp *rsp,
-                 unsigned int *epoch)
+                 unsigned int *epoch, char *lease_key)
 {
        char *data_offset;
        struct create_context *cc;
@@ -1590,7 +1590,8 @@ parse_lease_state(struct TCP_Server_Info *server, struct smb2_create_rsp *rsp,
                name = le16_to_cpu(cc->NameOffset) + (char *)cc;
                if (le16_to_cpu(cc->NameLength) == 4 &&
                    strncmp(name, "RqLs", 4) == 0)
-                       return server->ops->parse_lease_buf(cc, epoch);
+                       return server->ops->parse_lease_buf(cc, epoch,
+                                                           lease_key);
 
                next = le32_to_cpu(cc->Next);
                if (!next)
@@ -1972,7 +1973,8 @@ SMB2_open(const unsigned int xid, struct cifs_open_parms *oparms, __le16 *path,
        }
 
        if (rsp->OplockLevel == SMB2_OPLOCK_LEVEL_LEASE)
-               *oplock = parse_lease_state(server, rsp, &oparms->fid->epoch);
+               *oplock = parse_lease_state(server, rsp, &oparms->fid->epoch,
+                                           oparms->fid->lease_key);
        else
                *oplock = rsp->OplockLevel;
 creat_exit: