All callers except rename_open_files() can ignore non FSA fsps.
Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
/* Ensure we have this file open with DELETE access. */
id = vfs_file_id_from_sbuf(conn, &local_fname->st);
- for (fsp = file_find_di_first(conn->sconn, id); fsp;
- fsp = file_find_di_next(fsp)) {
+ for (fsp = file_find_di_first(conn->sconn, id, true); fsp;
+ fsp = file_find_di_next(fsp, true)) {
if (fsp->access_mask & DELETE_ACCESS &&
fsp->fsp_flags.delete_on_close)
{
file_id = vfs_file_id_from_sbuf(conn, &smb_fname->st);
- for(fsp = file_find_di_first(conn->sconn, file_id);
+ for(fsp = file_find_di_first(conn->sconn, file_id, true);
fsp;
- fsp = file_find_di_next(fsp)) {
+ fsp = file_find_di_next(fsp, true)) {
if (fsp_get_io_fd(fsp) != -1) {
*ret_fsp = fsp;
return NT_STATUS_OK;
****************************************************************************/
files_struct *file_find_di_first(struct smbd_server_connection *sconn,
- struct file_id id)
+ struct file_id id,
+ bool need_fsa)
{
files_struct *fsp;
sconn->fsp_fi_cache.id = id;
for (fsp=sconn->files;fsp;fsp=fsp->next) {
+ if (need_fsa && !fsp->fsp_flags.is_fsa) {
+ continue;
+ }
if (file_id_equal(&fsp->file_id, &id)) {
/* Setup positive cache. */
sconn->fsp_fi_cache.fsp = fsp;
Find the next fsp having the same device and inode.
****************************************************************************/
-files_struct *file_find_di_next(files_struct *start_fsp)
+files_struct *file_find_di_next(files_struct *start_fsp,
+ bool need_fsa)
{
files_struct *fsp;
for (fsp = start_fsp->next;fsp;fsp=fsp->next) {
+ if (need_fsa && !fsp->fsp_flags.is_fsa) {
+ continue;
+ }
if (file_id_equal(&fsp->file_id, &start_fsp->file_id)) {
return fsp;
}
* handles...
*/
- for (fsp = file_find_di_first(new_fsp->conn->sconn, new_fsp->file_id);
+ for (fsp = file_find_di_first(new_fsp->conn->sconn, new_fsp->file_id, true);
fsp != NULL;
- fsp = file_find_di_next(fsp)) {
+ fsp = file_find_di_next(fsp, true)) {
if (fsp == new_fsp) {
continue;
files_struct *file_find_dif(struct smbd_server_connection *sconn,
struct file_id id, unsigned long gen_id);
files_struct *file_find_di_first(struct smbd_server_connection *sconn,
- struct file_id id);
-files_struct *file_find_di_next(files_struct *start_fsp);
+ struct file_id id,
+ bool need_fsa);
+files_struct *file_find_di_next(files_struct *start_fsp,
+ bool need_fsa);
struct files_struct *file_find_one_fsp_from_lease_key(
struct smbd_server_connection *sconn,
const struct smb2_lease_key *lease_key);
NTSTATUS status;
uint32_t new_name_hash = 0;
- for(fsp = file_find_di_first(conn->sconn, id); fsp;
- fsp = file_find_di_next(fsp)) {
+ for(fsp = file_find_di_first(conn->sconn, id, false); fsp;
+ fsp = file_find_di_next(fsp, false)) {
struct file_id_buf idbuf;
/* fsp_name is a relative path under the fsp. To change this for other
sharepaths we need to manipulate relative paths. */
*/
id = vfs_file_id_from_sbuf(conn, &smb_fname_parent->st);
- for (fsp = file_find_di_first(conn->sconn, id); fsp;
- fsp = file_find_di_next(fsp)) {
+ for (fsp = file_find_di_first(conn->sconn, id, true); fsp;
+ fsp = file_find_di_next(fsp, true)) {
if (fsp->access_mask & DELETE_ACCESS) {
return NT_STATUS_SHARING_VIOLATION;
}
struct file_id fileid = vfs_file_id_from_sbuf(conn,
&smb_fname_dst->st);
files_struct *dst_fsp = file_find_di_first(conn->sconn,
- fileid);
+ fileid, true);
/* The file can be open when renaming a stream */
if (dst_fsp && !new_is_stream) {
DEBUG(3, ("rename_internals_fsp: Target file open\n"));
return NULL;
}
- for(fsp = file_find_di_first(conn->sconn, id);
+ for(fsp = file_find_di_first(conn->sconn, id, true);
fsp != NULL;
- fsp = file_find_di_next(fsp)) {
+ fsp = file_find_di_next(fsp, true)) {
DBG_DEBUG("Checking file %s, fd = %d, vuid = %"PRIu64", "
"file_pid = %"PRIu16", "
/* Do we have this path open ? */
files_struct *fsp1;
struct file_id fileid = vfs_file_id_from_sbuf(conn, psbuf);
- fsp1 = file_find_di_first(conn->sconn, fileid);
+ fsp1 = file_find_di_first(conn->sconn, fileid, true);
if (fsp1 && fsp1->initial_allocation_size) {
allocation_size = SMB_VFS_GET_ALLOC_SIZE(conn, fsp1, psbuf);
}
}
id = vfs_file_id_from_sbuf(conn, &sbuf);
- for(all_fsps = file_find_di_first(conn->sconn, id); all_fsps;
- all_fsps = file_find_di_next(all_fsps)) {
+ for(all_fsps = file_find_di_first(conn->sconn, id, true); all_fsps;
+ all_fsps = file_find_di_next(all_fsps, true)) {
/*
* We're setting the time explicitly for UNIX.
* Cancel any pending changes over all handles.