summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2008-11-21 22:48:37 -0800
committerJeremy Allison <jra@samba.org>2008-11-21 22:48:37 -0800
commit338303eb379320411829ee3dd1621e490f8d7fe1 (patch)
treed9a7f39cecad48e2ead374e8a7ef20f1feb8c38a /source3
parent83ff6979f504d50caf725ee62549604630b69be7 (diff)
downloadsamba-338303eb379320411829ee3dd1621e490f8d7fe1.tar.gz
samba-338303eb379320411829ee3dd1621e490f8d7fe1.tar.bz2
samba-338303eb379320411829ee3dd1621e490f8d7fe1.zip
Rever 83ff6979f504d50caf725ee62549604630b69be7 - "Fix the logic bug that caused us to
run into kernel oplocks on an open for a stream inside a file with stream_xattr module. On opening the base_fsp we must break existing oplocks." as it broke make test. Jeremy.
Diffstat (limited to 'source3')
-rw-r--r--source3/modules/vfs_streams_xattr.c68
-rw-r--r--source3/smbd/open.c8
2 files changed, 35 insertions, 41 deletions
diff --git a/source3/modules/vfs_streams_xattr.c b/source3/modules/vfs_streams_xattr.c
index 3555654dac..2ea5336295 100644
--- a/source3/modules/vfs_streams_xattr.c
+++ b/source3/modules/vfs_streams_xattr.c
@@ -102,7 +102,7 @@ static int streams_xattr_fstat(vfs_handle_struct *handle, files_struct *fsp,
return -1;
}
- sbuf->st_size = get_xattr_size(handle->conn, fsp,
+ sbuf->st_size = get_xattr_size(handle->conn, fsp->base_fsp,
io->base, io->xattr_name);
if (sbuf->st_size == -1) {
return -1;
@@ -249,29 +249,29 @@ static int streams_xattr_open(vfs_handle_struct *handle, const char *fname,
/*
* We use baseflags to turn off nasty side-effects when opening the
* underlying file.
- */
- baseflags = flags;
- baseflags &= ~O_TRUNC;
- baseflags &= ~O_EXCL;
- baseflags &= ~O_CREAT;
-
- hostfd = SMB_VFS_OPEN(handle->conn, base, fsp, baseflags, mode);
-
- /* It is legit to open a stream on a directory, but the base
- * fd has to be read-only.
- */
- if ((hostfd == -1) && (errno == EISDIR)) {
- baseflags &= ~O_ACCMODE;
- baseflags |= O_RDONLY;
- hostfd = SMB_VFS_OPEN(handle->conn, fname, fsp, baseflags,
- mode);
- }
+ */
+ baseflags = flags;
+ baseflags &= ~O_TRUNC;
+ baseflags &= ~O_EXCL;
+ baseflags &= ~O_CREAT;
+
+ hostfd = SMB_VFS_OPEN(handle->conn, base, fsp, baseflags, mode);
+
+ /* It is legit to open a stream on a directory, but the base
+ * fd has to be read-only.
+ */
+ if ((hostfd == -1) && (errno == EISDIR)) {
+ baseflags &= ~O_ACCMODE;
+ baseflags |= O_RDONLY;
+ hostfd = SMB_VFS_OPEN(handle->conn, fname, fsp, baseflags,
+ mode);
+ }
- if (hostfd == -1) {
+ if (hostfd == -1) {
goto fail;
- }
+ }
- status = get_ea_value(talloc_tos(), handle->conn, fsp, base,
+ status = get_ea_value(talloc_tos(), handle->conn, NULL, base,
xattr_name, &ea);
DEBUG(10, ("get_ea_value returned %s\n", nt_errstr(status)));
@@ -303,9 +303,9 @@ static int streams_xattr_open(vfs_handle_struct *handle, const char *fname,
DEBUG(10, ("creating attribute %s on file %s\n",
xattr_name, base));
- if (fsp->fh->fd != -1) {
+ if (fsp->base_fsp->fh->fd != -1) {
if (SMB_VFS_FSETXATTR(
- fsp, xattr_name,
+ fsp->base_fsp, xattr_name,
&null, sizeof(null),
flags & O_EXCL ? XATTR_CREATE : 0) == -1) {
goto fail;
@@ -323,9 +323,9 @@ static int streams_xattr_open(vfs_handle_struct *handle, const char *fname,
if (flags & O_TRUNC) {
char null = '\0';
- if (fsp->fh->fd != -1) {
+ if (fsp->base_fsp->fh->fd != -1) {
if (SMB_VFS_FSETXATTR(
- fsp, xattr_name,
+ fsp->base_fsp, xattr_name,
&null, sizeof(null),
flags & O_EXCL ? XATTR_CREATE : 0) == -1) {
goto fail;
@@ -600,7 +600,7 @@ static ssize_t streams_xattr_pwrite(vfs_handle_struct *handle,
return SMB_VFS_NEXT_PWRITE(handle, fsp, data, n, offset);
}
- status = get_ea_value(talloc_tos(), handle->conn, fsp,
+ status = get_ea_value(talloc_tos(), handle->conn, fsp->base_fsp,
sio->base, sio->xattr_name, &ea);
if (!NT_STATUS_IS_OK(status)) {
return -1;
@@ -624,12 +624,12 @@ static ssize_t streams_xattr_pwrite(vfs_handle_struct *handle,
memcpy(ea.value.data + offset, data, n);
- if (fsp->fh->fd != -1) {
- ret = SMB_VFS_FSETXATTR(fsp,
+ if (fsp->base_fsp->fh->fd != -1) {
+ ret = SMB_VFS_FSETXATTR(fsp->base_fsp,
sio->xattr_name,
ea.value.data, ea.value.length, 0);
} else {
- ret = SMB_VFS_SETXATTR(fsp->conn, sio->base,
+ ret = SMB_VFS_SETXATTR(fsp->conn, fsp->base_fsp->fsp_name,
sio->xattr_name,
ea.value.data, ea.value.length, 0);
}
@@ -656,7 +656,7 @@ static ssize_t streams_xattr_pread(vfs_handle_struct *handle,
return SMB_VFS_NEXT_PREAD(handle, fsp, data, n, offset);
}
- status = get_ea_value(talloc_tos(), handle->conn, fsp,
+ status = get_ea_value(talloc_tos(), handle->conn, fsp->base_fsp,
sio->base, sio->xattr_name, &ea);
if (!NT_STATUS_IS_OK(status)) {
return -1;
@@ -696,7 +696,7 @@ static int streams_xattr_ftruncate(struct vfs_handle_struct *handle,
return SMB_VFS_NEXT_FTRUNCATE(handle, fsp, offset);
}
- status = get_ea_value(talloc_tos(), handle->conn, fsp,
+ status = get_ea_value(talloc_tos(), handle->conn, fsp->base_fsp,
sio->base, sio->xattr_name, &ea);
if (!NT_STATUS_IS_OK(status)) {
return -1;
@@ -721,12 +721,12 @@ static int streams_xattr_ftruncate(struct vfs_handle_struct *handle,
ea.value.length = offset + 1;
ea.value.data[offset] = 0;
- if (fsp->fh->fd != -1) {
- ret = SMB_VFS_FSETXATTR(fsp,
+ if (fsp->base_fsp->fh->fd != -1) {
+ ret = SMB_VFS_FSETXATTR(fsp->base_fsp,
sio->xattr_name,
ea.value.data, ea.value.length, 0);
} else {
- ret = SMB_VFS_SETXATTR(fsp->conn, sio->base,
+ ret = SMB_VFS_SETXATTR(fsp->conn, fsp->base_fsp->fsp_name,
sio->xattr_name,
ea.value.data, ea.value.length, 0);
}
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index 018d104d0b..a6867e077c 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -2830,13 +2830,7 @@ NTSTATUS create_file_unixpath(connection_struct *conn,
break;
}
- DEBUG(10, ("Recursing into create_file_unixpath for "
- "base %s\n", base));
-
- /* This call will break any oplock on the base file,
- * but will not actually open an underlying fd. */
-
- status = create_file_unixpath(conn, req, base, 0,
+ status = create_file_unixpath(conn, NULL, base, 0,
FILE_SHARE_READ
| FILE_SHARE_WRITE
| FILE_SHARE_DELETE,