ksmbd: set epoch in create context v2 lease
authorNamjae Jeon <linkinjeon@kernel.org>
Sun, 31 Dec 2023 07:19:14 +0000 (16:19 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 5 Jan 2024 14:19:39 +0000 (15:19 +0100)
[ Upstream commit d045850b628aaf931fc776c90feaf824dca5a1cf ]

To support v2 lease(directory lease), ksmbd set epoch in create context
v2 lease response.

Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/smb/server/oplock.c
fs/smb/server/oplock.h

index 50c68be..ff5c83b 100644 (file)
@@ -104,7 +104,7 @@ static int alloc_lease(struct oplock_info *opinfo, struct lease_ctx_info *lctx)
        lease->duration = lctx->duration;
        memcpy(lease->parent_lease_key, lctx->parent_lease_key, SMB2_LEASE_KEY_SIZE);
        lease->version = lctx->version;
-       lease->epoch = 0;
+       lease->epoch = le16_to_cpu(lctx->epoch);
        INIT_LIST_HEAD(&opinfo->lease_entry);
        opinfo->o_lease = lease;
 
@@ -1032,6 +1032,7 @@ static void copy_lease(struct oplock_info *op1, struct oplock_info *op2)
               SMB2_LEASE_KEY_SIZE);
        lease2->duration = lease1->duration;
        lease2->flags = lease1->flags;
+       lease2->epoch = lease1->epoch++;
 }
 
 static int add_lease_global_list(struct oplock_info *opinfo)
@@ -1364,6 +1365,7 @@ void create_lease_buf(u8 *rbuf, struct lease *lease)
                memcpy(buf->lcontext.LeaseKey, lease->lease_key,
                       SMB2_LEASE_KEY_SIZE);
                buf->lcontext.LeaseFlags = lease->flags;
+               buf->lcontext.Epoch = cpu_to_le16(++lease->epoch);
                buf->lcontext.LeaseState = lease->state;
                memcpy(buf->lcontext.ParentLeaseKey, lease->parent_lease_key,
                       SMB2_LEASE_KEY_SIZE);
@@ -1423,6 +1425,7 @@ struct lease_ctx_info *parse_lease_state(void *open_req)
                memcpy(lreq->lease_key, lc->lcontext.LeaseKey, SMB2_LEASE_KEY_SIZE);
                lreq->req_state = lc->lcontext.LeaseState;
                lreq->flags = lc->lcontext.LeaseFlags;
+               lreq->epoch = lc->lcontext.Epoch;
                lreq->duration = lc->lcontext.LeaseDuration;
                memcpy(lreq->parent_lease_key, lc->lcontext.ParentLeaseKey,
                                SMB2_LEASE_KEY_SIZE);
index 4b0fe6d..ad31439 100644 (file)
@@ -34,6 +34,7 @@ struct lease_ctx_info {
        __le32                  flags;
        __le64                  duration;
        __u8                    parent_lease_key[SMB2_LEASE_KEY_SIZE];
+       __le16                  epoch;
        int                     version;
 };