From: Ralph Boehme Date: Mon, 4 Nov 2024 17:48:14 +0000 (+0100) Subject: smbd: pass lease, if any, to notify_fname() X-Git-Tag: tdb-1.4.13~711 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c1ac9e6532b8ea5fca07287cd4ee614617b3df4e;p=thirdparty%2Fsamba.git smbd: pass lease, if any, to notify_fname() notify_fname() for NOTIFY_ACTION_DIRLEASE_BREAK will soon need the lease of the current open and to implement "MS-FSA 2.1.4.12 Algorithm to Check for an Oplock Break" with flags=PARENT_OBJECT. No change in behaviour for now, all callers pass lease=NULL; Also change path arg to struct smb_filename. Signed-off-by: Ralph Boehme Reviewed-by: Stefan Metzmacher --- diff --git a/source3/modules/vfs_gpfs.c b/source3/modules/vfs_gpfs.c index a8b4e38ff88..0f7ef45e3ee 100644 --- a/source3/modules/vfs_gpfs.c +++ b/source3/modules/vfs_gpfs.c @@ -2335,9 +2335,11 @@ static ssize_t vfs_gpfs_pread(vfs_handle_struct *handle, files_struct *fsp, ret = SMB_VFS_NEXT_PREAD(handle, fsp, data, n, offset); if ((ret != -1) && was_offline) { - notify_fname(handle->conn, NOTIFY_ACTION_MODIFIED, + notify_fname(handle->conn, + NOTIFY_ACTION_MODIFIED, FILE_NOTIFY_CHANGE_ATTRIBUTES, - fsp->fsp_name->base_name); + fsp->fsp_name, + NULL); } return ret; @@ -2403,9 +2405,11 @@ static ssize_t vfs_gpfs_pread_recv(struct tevent_req *req, if ((state->ret != -1) && state->was_offline) { DEBUG(10, ("sending notify\n")); - notify_fname(fsp->conn, NOTIFY_ACTION_MODIFIED, + notify_fname(fsp->conn, + NOTIFY_ACTION_MODIFIED, FILE_NOTIFY_CHANGE_ATTRIBUTES, - fsp->fsp_name->base_name); + fsp->fsp_name, + NULL); } return state->ret; @@ -2422,9 +2426,11 @@ static ssize_t vfs_gpfs_pwrite(vfs_handle_struct *handle, files_struct *fsp, ret = SMB_VFS_NEXT_PWRITE(handle, fsp, data, n, offset); if ((ret != -1) && was_offline) { - notify_fname(handle->conn, NOTIFY_ACTION_MODIFIED, + notify_fname(handle->conn, + NOTIFY_ACTION_MODIFIED, FILE_NOTIFY_CHANGE_ATTRIBUTES, - fsp->fsp_name->base_name); + fsp->fsp_name, + NULL); } return ret; @@ -2491,9 +2497,11 @@ static ssize_t vfs_gpfs_pwrite_recv(struct tevent_req *req, if ((state->ret != -1) && state->was_offline) { DEBUG(10, ("sending notify\n")); - notify_fname(fsp->conn, NOTIFY_ACTION_MODIFIED, + notify_fname(fsp->conn, + NOTIFY_ACTION_MODIFIED, FILE_NOTIFY_CHANGE_ATTRIBUTES, - fsp->fsp_name->base_name); + fsp->fsp_name, + NULL); } return state->ret; diff --git a/source3/modules/vfs_tsmsm.c b/source3/modules/vfs_tsmsm.c index 89191f7e3ae..cc32996a122 100644 --- a/source3/modules/vfs_tsmsm.c +++ b/source3/modules/vfs_tsmsm.c @@ -357,9 +357,11 @@ static ssize_t tsmsm_pread_recv(struct tevent_req *req, } if (state->ret >= 0 && state->was_offline) { struct files_struct *fsp = state->fsp; - notify_fname(fsp->conn, NOTIFY_ACTION_MODIFIED, + notify_fname(fsp->conn, + NOTIFY_ACTION_MODIFIED, FILE_NOTIFY_CHANGE_ATTRIBUTES, - fsp->fsp_name->base_name); + fsp->fsp_name, + NULL); } *vfs_aio_state = state->vfs_aio_state; return state->ret; @@ -422,9 +424,11 @@ static ssize_t tsmsm_pwrite_recv(struct tevent_req *req, } if (state->ret >= 0 && state->was_offline) { struct files_struct *fsp = state->fsp; - notify_fname(fsp->conn, NOTIFY_ACTION_MODIFIED, + notify_fname(fsp->conn, + NOTIFY_ACTION_MODIFIED, FILE_NOTIFY_CHANGE_ATTRIBUTES, - fsp->fsp_name->base_name); + fsp->fsp_name, + NULL); } *vfs_aio_state = state->vfs_aio_state; return state->ret; @@ -456,9 +460,11 @@ static ssize_t tsmsm_pread(struct vfs_handle_struct *handle, struct files_struct /* We can't actually force AIO at this point (came here not from reply_read_and_X) what we can do is to send notification that file became online */ - notify_fname(handle->conn, NOTIFY_ACTION_MODIFIED, - FILE_NOTIFY_CHANGE_ATTRIBUTES, - fsp->fsp_name->base_name); + notify_fname(handle->conn, + NOTIFY_ACTION_MODIFIED, + FILE_NOTIFY_CHANGE_ATTRIBUTES, + fsp->fsp_name, + NULL); } return result; @@ -474,9 +480,11 @@ static ssize_t tsmsm_pwrite(struct vfs_handle_struct *handle, struct files_struc /* We can't actually force AIO at this point (came here not from reply_read_and_X) what we can do is to send notification that file became online */ - notify_fname(handle->conn, NOTIFY_ACTION_MODIFIED, - FILE_NOTIFY_CHANGE_ATTRIBUTES, - fsp->fsp_name->base_name); + notify_fname(handle->conn, + NOTIFY_ACTION_MODIFIED, + FILE_NOTIFY_CHANGE_ATTRIBUTES, + fsp->fsp_name, + NULL); } return result; diff --git a/source3/smbd/close.c b/source3/smbd/close.c index 8909cd99c44..436b1cc876e 100644 --- a/source3/smbd/close.c +++ b/source3/smbd/close.c @@ -648,9 +648,11 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp, } if (lck_state.delete_object) { - notify_fname(conn, NOTIFY_ACTION_REMOVED, + notify_fname(conn, + NOTIFY_ACTION_REMOVED, FILE_NOTIFY_CHANGE_FILE_NAME, - fsp->fsp_name->base_name); + fsp->fsp_name, + NULL); } return status; @@ -1596,7 +1598,8 @@ done: notify_fname(conn, NOTIFY_ACTION_REMOVED, FILE_NOTIFY_CHANGE_DIR_NAME, - fsp->fsp_name->base_name); + fsp->fsp_name, + NULL); } status1 = fd_close(fsp); diff --git a/source3/smbd/dosmode.c b/source3/smbd/dosmode.c index 1b68f10c86f..26356bc721b 100644 --- a/source3/smbd/dosmode.c +++ b/source3/smbd/dosmode.c @@ -1071,9 +1071,11 @@ int file_set_dosmode(connection_struct *conn, done: if (!newfile) { - notify_fname(conn, NOTIFY_ACTION_MODIFIED, + notify_fname(conn, + NOTIFY_ACTION_MODIFIED, FILE_NOTIFY_CHANGE_ATTRIBUTES, - smb_fname->base_name); + smb_fname, + NULL); } if (ret == 0) { smb_fname->st.st_ex_mode = unixmode; @@ -1173,9 +1175,11 @@ NTSTATUS file_set_sparse(connection_struct *conn, return status; } - notify_fname(conn, NOTIFY_ACTION_MODIFIED, + notify_fname(conn, + NOTIFY_ACTION_MODIFIED, FILE_NOTIFY_CHANGE_ATTRIBUTES, - fsp->fsp_name->base_name); + fsp->fsp_name, + NULL); fsp->fsp_name->st.cached_dos_attributes = new_dosmode; fsp->fsp_flags.is_sparse = sparse; diff --git a/source3/smbd/notify.c b/source3/smbd/notify.c index c6710a84b93..569e089dea8 100644 --- a/source3/smbd/notify.c +++ b/source3/smbd/notify.c @@ -577,10 +577,14 @@ void remove_pending_change_notify_requests_by_fid(files_struct *fsp, } } -void notify_fname(connection_struct *conn, uint32_t action, uint32_t filter, - const char *path) +void notify_fname(struct connection_struct *conn, + uint32_t action, + uint32_t filter, + const struct smb_filename *smb_fname, + const struct smb2_lease *lease) { struct notify_context *notify_ctx = conn->sconn->notify_ctx; + const char *path = smb_fname->base_name; if (path[0] == '.' && path[1] == '/') { path += 2; diff --git a/source3/smbd/open.c b/source3/smbd/open.c index ddce4fa58b5..9285c851c05 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -4650,14 +4650,16 @@ unlock: notify_fname(conn, NOTIFY_ACTION_ADDED, FILE_NOTIFY_CHANGE_FILE_NAME, - smb_fname->base_name); + smb_fname, + NULL); } if (truncated) { notify_fname(fsp->conn, NOTIFY_ACTION_MODIFIED, FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_ATTRIBUTES, - fsp->fsp_name->base_name); + fsp->fsp_name, + NULL); } if (!NT_STATUS_IS_OK(status)) { fd_close(fsp); @@ -5531,7 +5533,8 @@ unlock: notify_fname(conn, NOTIFY_ACTION_ADDED, FILE_NOTIFY_CHANGE_DIR_NAME, - smb_dname->base_name); + smb_dname, + NULL); } if (!NT_STATUS_IS_OK(status)) { diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h index 5fffa34cd72..f70cc224e88 100644 --- a/source3/smbd/proto.h +++ b/source3/smbd/proto.h @@ -558,8 +558,11 @@ bool remove_pending_change_notify_requests_by_mid( struct smbd_server_connection *sconn, uint64_t mid); void remove_pending_change_notify_requests_by_fid(files_struct *fsp, NTSTATUS status); -void notify_fname(connection_struct *conn, uint32_t action, uint32_t filter, - const char *path); +void notify_fname(struct connection_struct *conn, + uint32_t action, + uint32_t filter, + const struct smb_filename *smb_fname, + const struct smb2_lease *lease); char *notify_filter_string(TALLOC_CTX *mem_ctx, uint32_t filter); struct sys_notify_context *sys_notify_context_create(TALLOC_CTX *mem_ctx, struct tevent_context *ev); diff --git a/source3/smbd/smb1_trans2.c b/source3/smbd/smb1_trans2.c index 3413ffbf6d5..f4fa85c728d 100644 --- a/source3/smbd/smb1_trans2.c +++ b/source3/smbd/smb1_trans2.c @@ -4170,8 +4170,11 @@ static NTSTATUS smb_set_file_unix_basic(connection_struct *conn, &ft, false); if (modify_mtime) { - notify_fname(conn, NOTIFY_ACTION_MODIFIED, - FILE_NOTIFY_CHANGE_LAST_WRITE, smb_fname->base_name); + notify_fname(conn, + NOTIFY_ACTION_MODIFIED, + FILE_NOTIFY_CHANGE_LAST_WRITE, + smb_fname, + NULL); } return status; } diff --git a/source3/smbd/smb2_reply.c b/source3/smbd/smb2_reply.c index 043be186612..16c70eda337 100644 --- a/source3/smbd/smb2_reply.c +++ b/source3/smbd/smb2_reply.c @@ -1300,26 +1300,40 @@ static void notify_rename(struct connection_struct *conn, } if (strcmp(parent_dir_src, parent_dir_dst) == 0) { - notify_fname(conn, NOTIFY_ACTION_OLD_NAME, mask, - smb_fname_src->base_name); - notify_fname(conn, NOTIFY_ACTION_NEW_NAME, mask, - smb_fname_dst->base_name); + notify_fname(conn, + NOTIFY_ACTION_OLD_NAME, + mask, + smb_fname_src, + NULL); + notify_fname(conn, + NOTIFY_ACTION_NEW_NAME, + mask, + smb_fname_dst, + NULL); } else { - notify_fname(conn, NOTIFY_ACTION_REMOVED, mask, - smb_fname_src->base_name); - notify_fname(conn, NOTIFY_ACTION_ADDED, mask, - smb_fname_dst->base_name); + notify_fname(conn, + NOTIFY_ACTION_REMOVED, + mask, + smb_fname_src, + NULL); + notify_fname(conn, + NOTIFY_ACTION_ADDED, + mask, + smb_fname_dst, + NULL); } /* this is a strange one. w2k3 gives an additional event for CHANGE_ATTRIBUTES and CHANGE_CREATION on the new file when renaming files, but not directories */ if (!is_dir) { - notify_fname(conn, NOTIFY_ACTION_MODIFIED, - FILE_NOTIFY_CHANGE_ATTRIBUTES - |FILE_NOTIFY_CHANGE_CREATION, - smb_fname_dst->base_name); + notify_fname(conn, + NOTIFY_ACTION_MODIFIED, + FILE_NOTIFY_CHANGE_ATTRIBUTES | + FILE_NOTIFY_CHANGE_CREATION, + smb_fname_dst, + NULL); } out: TALLOC_FREE(parent_dir_src); diff --git a/source3/smbd/smb2_trans2.c b/source3/smbd/smb2_trans2.c index c0e3b1f5410..0a97493280b 100644 --- a/source3/smbd/smb2_trans2.c +++ b/source3/smbd/smb2_trans2.c @@ -3907,8 +3907,11 @@ NTSTATUS smb_set_file_time(connection_struct *conn, return map_nt_error_from_unix(errno); } - notify_fname(conn, NOTIFY_ACTION_MODIFIED, action, - smb_fname->base_name); + notify_fname(conn, + NOTIFY_ACTION_MODIFIED, + action, + smb_fname, + NULL); return NT_STATUS_OK; } diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c index 16c084dda51..baeb20cdeb0 100644 --- a/source3/smbd/vfs.c +++ b/source3/smbd/vfs.c @@ -649,10 +649,12 @@ int vfs_set_filelen(files_struct *fsp, off_t len) DEBUG(10,("vfs_set_filelen: ftruncate %s to len %.0f\n", fsp_str_dbg(fsp), (double)len)); if ((ret = SMB_VFS_FTRUNCATE(fsp, len)) != -1) { - notify_fname(fsp->conn, NOTIFY_ACTION_MODIFIED, - FILE_NOTIFY_CHANGE_SIZE - | FILE_NOTIFY_CHANGE_ATTRIBUTES, - fsp->fsp_name->base_name); + notify_fname(fsp->conn, + NOTIFY_ACTION_MODIFIED, + FILE_NOTIFY_CHANGE_SIZE | + FILE_NOTIFY_CHANGE_ATTRIBUTES, + fsp->fsp_name, + NULL); } contend_level2_oplocks_end(fsp, LEVEL2_CONTEND_SET_FILE_LEN);