ksmbd: don't increment epoch if current state and request state are same
authorNamjae Jeon <linkinjeon@kernel.org>
Thu, 14 Dec 2023 23:35:00 +0000 (08:35 +0900)
committerSteve French <stfrench@microsoft.com>
Tue, 9 Jan 2024 18:52:33 +0000 (12:52 -0600)
If existing lease state and request state are same, don't increment
epoch in create context.

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

index 9a19d8b06c8c8007fe9c80a36eb3c472a0c7521b..77f20d34ed9ae316a784669e4ee9737b962029b3 100644 (file)
@@ -105,7 +105,7 @@ static int alloc_lease(struct oplock_info *opinfo, struct lease_ctx_info *lctx)
        lease->is_dir = lctx->is_dir;
        memcpy(lease->parent_lease_key, lctx->parent_lease_key, SMB2_LEASE_KEY_SIZE);
        lease->version = lctx->version;
-       lease->epoch = le16_to_cpu(lctx->epoch);
+       lease->epoch = le16_to_cpu(lctx->epoch) + 1;
        INIT_LIST_HEAD(&opinfo->lease_entry);
        opinfo->o_lease = lease;
 
@@ -541,6 +541,9 @@ static struct oplock_info *same_client_has_lease(struct ksmbd_inode *ci,
                                continue;
                        }
 
+                       if (lctx->req_state != lease->state)
+                               lease->epoch++;
+
                        /* upgrading lease */
                        if ((atomic_read(&ci->op_count) +
                             atomic_read(&ci->sop_count)) == 1) {
@@ -1035,7 +1038,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++;
+       lease2->epoch = lease1->epoch;
        lease2->version = lease1->version;
 }
 
@@ -1448,7 +1451,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.Epoch = cpu_to_le16(lease->epoch);
                buf->lcontext.LeaseState = lease->state;
                memcpy(buf->lcontext.ParentLeaseKey, lease->parent_lease_key,
                       SMB2_LEASE_KEY_SIZE);