]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3/locking: add and use fsp_[get|apply]_share_entry_flags()
authorRalph Boehme <slow@samba.org>
Thu, 3 Apr 2025 20:01:09 +0000 (22:01 +0200)
committerVolker Lendecke <vl@samba.org>
Wed, 9 Apr 2025 13:40:36 +0000 (13:40 +0000)
Prepares for converting private_options to flags.

Fixes Durable Handle reconnect of POSIX opens which weren't setting the fsp_flags
when reconnecting, so fsp_flags.posix_open wasn't set.

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
source3/locking/share_mode_lock.c
source3/locking/share_mode_lock.h
source3/smbd/durable.c

index 43886937119a976adab1ad0449deafd2d86bf6b5..e3dacbc636a1a04f1955d1aecf48c0b50804d6e4 100644 (file)
@@ -2080,8 +2080,7 @@ bool set_share_mode(struct share_mode_lock *lck,
                .time.tv_usec = fsp->open_time.tv_usec,
                .share_file_id = fh_get_gen_id(fsp->fh),
                .uid = (uint32_t)uid,
-               .flags = fsp->fsp_flags.posix_open ?
-                       SHARE_ENTRY_FLAG_POSIX_OPEN : 0,
+               .flags = fsp_get_share_entry_flags(fsp),
                .name_hash = fsp->name_hash,
        };
 
@@ -3513,3 +3512,21 @@ NTSTATUS _share_mode_entry_prepare_unlock(
 
        return state.status;
 }
+
+
+uint16_t fsp_get_share_entry_flags(const struct files_struct *fsp)
+{
+       uint16_t flags = 0;
+
+       if (fsp->fsp_flags.posix_open) {
+               flags |= SHARE_ENTRY_FLAG_POSIX_OPEN;
+       }
+       return flags;
+}
+
+void fsp_apply_share_entry_flags(struct files_struct *fsp, uint16_t flags)
+{
+       if (flags & SHARE_ENTRY_FLAG_POSIX_OPEN) {
+               fsp->fsp_flags.posix_open = true;
+       }
+}
index 0a2696d38a2f5ef09342558e42712940b8b53f32..82668cd977a6afab501971e41cab49971cade0ad 100644 (file)
@@ -205,3 +205,6 @@ NTSTATUS _share_mode_entry_prepare_unlock(
                __fn, __private_data, __location__);
 
 #endif
+
+uint16_t fsp_get_share_entry_flags(const struct files_struct *fsp);
+void fsp_apply_share_entry_flags(struct files_struct *fsp, uint16_t flags);
index 1c36f552c72151f2ff34c6d98c2ff64b0c03ba74..71cd3a01f990ff7473ae4ad0c4fa63b080e85806 100644 (file)
@@ -596,6 +596,7 @@ static void vfs_default_durable_reconnect_fn(struct share_mode_lock *lck,
        }
 
        fh_set_private_options(fsp->fh, e.private_options);
+       fsp_apply_share_entry_flags(fsp, e.flags);
        fsp->open_time = e.time;
        fsp->access_mask = e.access_mask;
        fsp->fsp_flags.can_read = ((fsp->access_mask & FILE_READ_DATA) != 0);