This hides the pending close fds from the outside. Call order
of SMB_VFS_CLOSE is reversed. Originally, it was:
fd_close -> fd_close_posix -> SMB_VFS_CLOSE -> close
And now it is:
fd_close -> SMB_VFS_CLOSE -> fd_close_posix -> close
This is in preparation of removing the fd parameter
from the SMB_VFS_CLOSE function. But it is also the right
place for the pending close calls anyways.
Michael
(This used to be commit
3cf56b124a2886c6260455bba4bf77d08e9a4f77)
* which will lose all locks on all fd's open on this dev/inode,
* just close.
*/
- ret = SMB_VFS_CLOSE(fsp,fsp->fh->fd);
+ ret = close(fsp->fh->fd);
fsp->fh->fd = -1;
if (ret == -1) {
return map_nt_error_from_unix(errno);
DEBUG(10,("fd_close_posix: doing close on %u fd's.\n", (unsigned int)count ));
for(i = 0; i < count; i++) {
- if (SMB_VFS_CLOSE(fsp,fd_array[i]) == -1) {
+ if (close(fd_array[i]) == -1) {
saved_errno = errno;
}
}
* Finally close the fd associated with this fsp.
*/
- ret = SMB_VFS_CLOSE(fsp,fsp->fh->fd);
+ ret = close(fsp->fh->fd);
if (ret == 0 && saved_errno != 0) {
errno = saved_errno;
static int vfswrap_close(vfs_handle_struct *handle, files_struct *fsp, int fd)
{
- int result;
+ NTSTATUS result;
START_PROFILE(syscall_close);
-
- result = close(fd);
+ result = fd_close_posix(fsp);
END_PROFILE(syscall_close);
- return result;
+
+ return NT_STATUS_IS_OK(result) ? 0 : -1;
}
static ssize_t vfswrap_read(vfs_handle_struct *handle, files_struct *fsp, void *data, size_t n)
NTSTATUS fd_close(files_struct *fsp)
{
+ int ret;
+
if (fsp->fh->fd == -1) {
return NT_STATUS_OK; /* What we used to call a stat open. */
}
if (fsp->fh->ref_count > 1) {
return NT_STATUS_OK; /* Shared handle. Only close last reference. */
}
- return fd_close_posix(fsp);
+
+ ret = SMB_VFS_CLOSE(fsp, fsp->fh->fd);
+ fsp->fh->fd = -1;
+ if (ret == -1) {
+ return map_nt_error_from_unix(errno);
+ }
+ return NT_STATUS_OK;
}
/****************************************************************************