Re: [PATCH 1/2] ksmbd: avoid reclaiming expired durable opens by the client

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 5/21/2024 9:57 AM, Namjae Jeon wrote:
The expired durable opens should not be reclaimed by client.
This patch add ->durable_scavenger_timeout to fp and check it in
ksmbd_lookup_durable_fd().

Signed-off-by: Namjae Jeon <linkinjeon@xxxxxxxxxx>
---
  fs/smb/server/vfs_cache.c | 9 ++++++++-
  fs/smb/server/vfs_cache.h | 1 +
  2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/fs/smb/server/vfs_cache.c b/fs/smb/server/vfs_cache.c
index 6cb599cd287e..a6804545db28 100644
--- a/fs/smb/server/vfs_cache.c
+++ b/fs/smb/server/vfs_cache.c
@@ -476,7 +476,10 @@ struct ksmbd_file *ksmbd_lookup_durable_fd(unsigned long long id)
  	struct ksmbd_file *fp;
fp = __ksmbd_lookup_fd(&global_ft, id);
-	if (fp && fp->conn) {
+	if (fp && (fp->conn ||
+		   (fp->durable_scavenger_timeout &&
+		    (fp->durable_scavenger_timeout <
+		     jiffies_to_msecs(jiffies))))) {

Do I understand correctly that this case means the fd is valid,
and only the durable timeout has been exceeded?

If so, I believe it is overly strict behavior. MS-SMB2 specifically
states that the timer is a lower bound:

3.3.2.2 Durable Open Scavenger Timer This timer controls the amount
of time the server keeps a durable handle active after the
underlying transport connection to the client is lost.<210> The
server MUST keep the durable handle active for at least this amount
of time, except in the cases of an oplock break indicated by the
object store as specified in section 3.3.4.6, administrative actions,
or resource constraints.
What defect does this patch fix?

Tom.


  		ksmbd_put_durable_fd(fp);
  		fp = NULL;
  	}
@@ -717,6 +720,10 @@ static bool session_fd_check(struct ksmbd_tree_connect *tcon,
  	fp->tcon = NULL;
  	fp->volatile_id = KSMBD_NO_FID;
+ if (fp->durable_timeout)
+		fp->durable_scavenger_timeout =
+			jiffies_to_msecs(jiffies) + fp->durable_timeout;
+
  	return true;
  }
diff --git a/fs/smb/server/vfs_cache.h b/fs/smb/server/vfs_cache.h
index 5a225e7055f1..f2ab1514e81a 100644
--- a/fs/smb/server/vfs_cache.h
+++ b/fs/smb/server/vfs_cache.h
@@ -101,6 +101,7 @@ struct ksmbd_file {
  	struct list_head		lock_list;
int durable_timeout;
+	int				durable_scavenger_timeout;
/* if ls is happening on directory, below is valid*/
  	struct ksmbd_readdir_data	readdir_data;




[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux