vfs: remove SMB_VFS_OPEN()
[amitay/samba.git] / source3 / modules / vfs_streams_xattr.c
index 988d2f1d837e914de07184f3622df69f8c023c21..2e4105fec496ee76d79e8135f694fb20f28b6f08 100644 (file)
@@ -24,9 +24,9 @@
 #include "includes.h"
 #include "smbd/smbd.h"
 #include "system/filesys.h"
-#include "../lib/crypto/md5.h"
 #include "lib/util/tevent_unix.h"
 #include "librpc/gen_ndr/ioctl.h"
+#include "hash_inode.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_VFS
@@ -45,39 +45,6 @@ struct stream_io {
        vfs_handle_struct *handle;
 };
 
-static SMB_INO_T stream_inode(const SMB_STRUCT_STAT *sbuf, const char *sname)
-{
-       MD5_CTX ctx;
-        unsigned char hash[16];
-       SMB_INO_T result;
-       char *upper_sname;
-
-       DEBUG(10, ("stream_inode called for %lu/%lu [%s]\n",
-                  (unsigned long)sbuf->st_ex_dev,
-                  (unsigned long)sbuf->st_ex_ino, sname));
-
-       upper_sname = talloc_strdup_upper(talloc_tos(), sname);
-       SMB_ASSERT(upper_sname != NULL);
-
-        MD5Init(&ctx);
-        MD5Update(&ctx, (const unsigned char *)&(sbuf->st_ex_dev),
-                 sizeof(sbuf->st_ex_dev));
-        MD5Update(&ctx, (const unsigned char *)&(sbuf->st_ex_ino),
-                 sizeof(sbuf->st_ex_ino));
-        MD5Update(&ctx, (unsigned char *)upper_sname,
-                 talloc_get_size(upper_sname)-1);
-        MD5Final(hash, &ctx);
-
-       TALLOC_FREE(upper_sname);
-
-        /* Hopefully all the variation is in the lower 4 (or 8) bytes! */
-       memcpy(&result, hash, sizeof(result));
-
-       DEBUG(10, ("stream_inode returns %lu\n", (unsigned long)result));
-
-       return result;
-}
-
 static ssize_t get_xattr_size(connection_struct *conn,
                                const struct smb_filename *smb_fname,
                                const char *xattr_name)
@@ -190,16 +157,21 @@ static bool streams_xattr_recheck(struct stream_io *sio)
        TALLOC_FREE(sio->base);
        sio->xattr_name = talloc_strdup(VFS_MEMCTX_FSP_EXTENSION(sio->handle, sio->fsp),
                                        xattr_name);
-        sio->base = talloc_strdup(VFS_MEMCTX_FSP_EXTENSION(sio->handle, sio->fsp),
-                                  sio->fsp->fsp_name->base_name);
-       sio->fsp_name_ptr = sio->fsp->fsp_name;
-
+       if (sio->xattr_name == NULL) {
+               DBG_DEBUG("sio->xattr_name==NULL\n");
+               return false;
+       }
        TALLOC_FREE(xattr_name);
 
-       if ((sio->xattr_name == NULL) || (sio->base == NULL)) {
+       sio->base = talloc_strdup(VFS_MEMCTX_FSP_EXTENSION(sio->handle, sio->fsp),
+                                 sio->fsp->fsp_name->base_name);
+       if (sio->base == NULL) {
+               DBG_DEBUG("sio->base==NULL\n");
                return false;
        }
 
+       sio->fsp_name_ptr = sio->fsp->fsp_name;
+
        return true;
 }
 
@@ -232,12 +204,12 @@ static int streams_xattr_fstat(vfs_handle_struct *handle, files_struct *fsp,
        struct stream_io *io = (struct stream_io *)
                VFS_FETCH_FSP_EXTENSION(handle, fsp);
 
-       DBG_DEBUG("streams_xattr_fstat called for %s\n", fsp_str_dbg(io->fsp));
-
        if (io == NULL || fsp->base_fsp == NULL) {
                return SMB_VFS_NEXT_FSTAT(handle, fsp, sbuf);
        }
 
+       DBG_DEBUG("streams_xattr_fstat called for %s\n", fsp_str_dbg(io->fsp));
+
        if (!streams_xattr_recheck(io)) {
                return -1;
        }
@@ -247,6 +219,7 @@ static int streams_xattr_fstat(vfs_handle_struct *handle, files_struct *fsp,
                                        io->base,
                                        NULL,
                                        NULL,
+                                       fsp->fsp_name->twrp,
                                        fsp->fsp_name->flags);
        if (smb_fname_base == NULL) {
                errno = ENOMEM;
@@ -275,8 +248,9 @@ static int streams_xattr_fstat(vfs_handle_struct *handle, files_struct *fsp,
 
        DEBUG(10, ("sbuf->st_ex_size = %d\n", (int)sbuf->st_ex_size));
 
-       sbuf->st_ex_ino = stream_inode(sbuf, io->xattr_name);
+       sbuf->st_ex_ino = hash_inode(sbuf, io->xattr_name);
        sbuf->st_ex_mode &= ~S_IFMT;
+       sbuf->st_ex_mode &= ~S_IFDIR;
         sbuf->st_ex_mode |= S_IFREG;
         sbuf->st_ex_blocks = sbuf->st_ex_size / STAT_ST_BLOCKSIZE + 1;
 
@@ -291,20 +265,15 @@ static int streams_xattr_stat(vfs_handle_struct *handle,
        int result = -1;
        char *xattr_name = NULL;
 
-       if (!is_ntfs_stream_smb_fname(smb_fname)) {
+       if (!is_named_stream(smb_fname)) {
                return SMB_VFS_NEXT_STAT(handle, smb_fname);
        }
 
        /* Note if lp_posix_paths() is true, we can never
-        * get here as is_ntfs_stream_smb_fname() is
+        * get here as is_named_stream() is
         * always false. So we never need worry about
         * not following links here. */
 
-       /* If the default stream is requested, just stat the base file. */
-       if (is_ntfs_default_stream_smb_fname(smb_fname)) {
-               return streams_xattr_stat_base(handle, smb_fname, true);
-       }
-
        /* Populate the stat struct with info from the base file. */
        if (streams_xattr_stat_base(handle, smb_fname, true) == -1) {
                return -1;
@@ -329,8 +298,9 @@ static int streams_xattr_stat(vfs_handle_struct *handle,
                goto fail;
        }
 
-       smb_fname->st.st_ex_ino = stream_inode(&smb_fname->st, xattr_name);
+       smb_fname->st.st_ex_ino = hash_inode(&smb_fname->st, xattr_name);
        smb_fname->st.st_ex_mode &= ~S_IFMT;
+       smb_fname->st.st_ex_mode &= ~S_IFDIR;
         smb_fname->st.st_ex_mode |= S_IFREG;
         smb_fname->st.st_ex_blocks =
            smb_fname->st.st_ex_size / STAT_ST_BLOCKSIZE + 1;
@@ -348,15 +318,10 @@ static int streams_xattr_lstat(vfs_handle_struct *handle,
        int result = -1;
        char *xattr_name = NULL;
 
-       if (!is_ntfs_stream_smb_fname(smb_fname)) {
+       if (!is_named_stream(smb_fname)) {
                return SMB_VFS_NEXT_LSTAT(handle, smb_fname);
        }
 
-       /* If the default stream is requested, just stat the base file. */
-       if (is_ntfs_default_stream_smb_fname(smb_fname)) {
-               return streams_xattr_stat_base(handle, smb_fname, false);
-       }
-
        /* Populate the stat struct with info from the base file. */
        if (streams_xattr_stat_base(handle, smb_fname, false) == -1) {
                return -1;
@@ -381,7 +346,7 @@ static int streams_xattr_lstat(vfs_handle_struct *handle,
                goto fail;
        }
 
-       smb_fname->st.st_ex_ino = stream_inode(&smb_fname->st, xattr_name);
+       smb_fname->st.st_ex_ino = hash_inode(&smb_fname->st, xattr_name);
        smb_fname->st.st_ex_mode &= ~S_IFMT;
         smb_fname->st.st_ex_mode |= S_IFREG;
         smb_fname->st.st_ex_blocks =
@@ -394,38 +359,41 @@ static int streams_xattr_lstat(vfs_handle_struct *handle,
        return result;
 }
 
-static int streams_xattr_open(vfs_handle_struct *handle,
-                             struct smb_filename *smb_fname,
-                             files_struct *fsp, int flags, mode_t mode)
+static int streams_xattr_openat(struct vfs_handle_struct *handle,
+                               const struct files_struct *dirfsp,
+                               const struct smb_filename *smb_fname,
+                               files_struct *fsp,
+                               int flags,
+                               mode_t mode)
 {
        NTSTATUS status;
-       struct smb_filename *smb_fname_base = NULL;
-       struct stream_io *sio;
+       struct streams_xattr_config *config = NULL;
+       struct stream_io *sio = NULL;
        struct ea_struct ea;
        char *xattr_name = NULL;
-       int baseflags;
-       int hostfd = -1;
+       int pipe_fds[2];
+       int fakefd = -1;
+       bool set_empty_xattr = false;
        int ret;
 
-       DEBUG(10, ("streams_xattr_open called for %s with flags 0x%x\n",
-                  smb_fname_str_dbg(smb_fname), flags));
-
-       if (!is_ntfs_stream_smb_fname(smb_fname)) {
-               return SMB_VFS_NEXT_OPEN(handle, smb_fname, fsp, flags, mode);
-       }
-
-       /* If the default stream is requested, just open the base file. */
-       if (is_ntfs_default_stream_smb_fname(smb_fname)) {
-               char *tmp_stream_name;
-
-               tmp_stream_name = smb_fname->stream_name;
-               smb_fname->stream_name = NULL;
+       /*
+        * For now assert this, so the below SMB_VFS_SETXATTR() works.
+        */
+       SMB_ASSERT(dirfsp->fh->fd == AT_FDCWD);
 
-               ret = SMB_VFS_NEXT_OPEN(handle, smb_fname, fsp, flags, mode);
+       SMB_VFS_HANDLE_GET_DATA(handle, config, struct streams_xattr_config,
+                               return -1);
 
-               smb_fname->stream_name = tmp_stream_name;
+       DEBUG(10, ("streams_xattr_open called for %s with flags 0x%x\n",
+                  smb_fname_str_dbg(smb_fname), flags));
 
-               return ret;
+       if (!is_named_stream(smb_fname)) {
+               return SMB_VFS_NEXT_OPENAT(handle,
+                                          dirfsp,
+                                          smb_fname,
+                                          fsp,
+                                          flags,
+                                          mode);
        }
 
        status = streams_xattr_get_name(handle, talloc_tos(),
@@ -435,65 +403,37 @@ static int streams_xattr_open(vfs_handle_struct *handle,
                goto fail;
        }
 
-       /* Create an smb_filename with stream_name == NULL. */
-       smb_fname_base = synthetic_smb_fname(talloc_tos(),
-                               smb_fname->base_name,
-                               NULL,
-                               NULL,
-                               smb_fname->flags);
-       if (smb_fname_base == NULL) {
-               errno = ENOMEM;
-               goto fail;
-       }
-
-       /*
-        * 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_NEXT_OPEN(handle, smb_fname_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_NEXT_OPEN(handle, smb_fname_base, fsp, baseflags,
-                                          mode);
-        }
-
-       TALLOC_FREE(smb_fname_base);
-
-        if (hostfd == -1) {
-               goto fail;
-        }
-
        status = get_ea_value(talloc_tos(), handle->conn, NULL,
                              smb_fname, xattr_name, &ea);
 
        DEBUG(10, ("get_ea_value returned %s\n", nt_errstr(status)));
 
-       if (!NT_STATUS_IS_OK(status)
-           && !NT_STATUS_EQUAL(status, NT_STATUS_NOT_FOUND)) {
-               /*
-                * The base file is not there. This is an error even if we got
-                * O_CREAT, the higher levels should have created the base
-                * file for us.
-                */
-               DEBUG(10, ("streams_xattr_open: base file %s not around, "
-                          "returning ENOENT\n", smb_fname->base_name));
-               errno = ENOENT;
-               goto fail;
+       if (!NT_STATUS_IS_OK(status)) {
+               if (!NT_STATUS_EQUAL(status, NT_STATUS_NOT_FOUND)) {
+                       /*
+                        * The base file is not there. This is an error even if
+                        * we got O_CREAT, the higher levels should have created
+                        * the base file for us.
+                        */
+                       DBG_DEBUG("streams_xattr_open: base file %s not around, "
+                                 "returning ENOENT\n", smb_fname->base_name);
+                       errno = ENOENT;
+                       goto fail;
+               }
+
+               if (!(flags & O_CREAT)) {
+                       errno = ENOATTR;
+                       goto fail;
+               }
+
+               set_empty_xattr = true;
+       }
+
+       if (flags & O_TRUNC) {
+               set_empty_xattr = true;
        }
 
-       if ((!NT_STATUS_IS_OK(status) && (flags & O_CREAT)) ||
-           (flags & O_TRUNC)) {
+       if (set_empty_xattr) {
                /*
                 * The attribute does not exist or needs to be truncated
                 */
@@ -516,9 +456,20 @@ static int streams_xattr_open(vfs_handle_struct *handle,
                }
        }
 
-        sio = (struct stream_io *)VFS_ADD_FSP_EXTENSION(handle, fsp,
-                                                       struct stream_io,
-                                                       NULL);
+       /*
+        * Return a valid fd, but ensure any attempt to use it returns an error
+        * (EPIPE).
+        */
+       ret = pipe(pipe_fds);
+       if (ret != 0) {
+               goto fail;
+       }
+
+       close(pipe_fds[1]);
+       pipe_fds[1] = -1;
+       fakefd = pipe_fds[0];
+
+        sio = VFS_ADD_FSP_EXTENSION(handle, fsp, struct stream_io, NULL);
         if (sio == NULL) {
                 errno = ENOMEM;
                 goto fail;
@@ -526,6 +477,11 @@ static int streams_xattr_open(vfs_handle_struct *handle,
 
         sio->xattr_name = talloc_strdup(VFS_MEMCTX_FSP_EXTENSION(handle, fsp),
                                        xattr_name);
+       if (sio->xattr_name == NULL) {
+               errno = ENOMEM;
+               goto fail;
+       }
+
        /*
         * so->base needs to be a copy of fsp->fsp_name->base_name,
         * making it identical to streams_xattr_recheck(). If the
@@ -535,55 +491,61 @@ static int streams_xattr_open(vfs_handle_struct *handle,
         */
         sio->base = talloc_strdup(VFS_MEMCTX_FSP_EXTENSION(handle, fsp),
                                  fsp->fsp_name->base_name);
-       sio->fsp_name_ptr = fsp->fsp_name;
-       sio->handle = handle;
-       sio->fsp = fsp;
-
-       if ((sio->xattr_name == NULL) || (sio->base == NULL)) {
+       if (sio->base == NULL) {
                errno = ENOMEM;
                goto fail;
        }
 
-       return hostfd;
+       sio->fsp_name_ptr = fsp->fsp_name;
+       sio->handle = handle;
+       sio->fsp = fsp;
+
+       return fakefd;
 
  fail:
-       if (hostfd >= 0) {
-               /*
-                * BUGBUGBUG -- we would need to call fd_close_posix here, but
-                * we don't have a full fsp yet
-                */
-               fsp->fh->fd = hostfd;
-               SMB_VFS_NEXT_CLOSE(handle, fsp);
+       if (fakefd >= 0) {
+               close(fakefd);
+               fakefd = -1;
        }
 
        return -1;
 }
 
-static int streams_xattr_unlink(vfs_handle_struct *handle,
-                               const struct smb_filename *smb_fname)
+static int streams_xattr_close(vfs_handle_struct *handle,
+                              files_struct *fsp)
 {
-       NTSTATUS status;
-       int ret = -1;
-       char *xattr_name = NULL;
+       int ret;
+       int fd;
+
+       fd = fsp->fh->fd;
+
+       DBG_DEBUG("streams_xattr_close called [%s] fd [%d]\n",
+                       smb_fname_str_dbg(fsp->fsp_name), fd);
 
-       if (!is_ntfs_stream_smb_fname(smb_fname)) {
-               return SMB_VFS_NEXT_UNLINK(handle, smb_fname);
+       if (!is_named_stream(fsp->fsp_name)) {
+               return SMB_VFS_NEXT_CLOSE(handle, fsp);
        }
 
-       /* If the default stream is requested, just open the base file. */
-       if (is_ntfs_default_stream_smb_fname(smb_fname)) {
-               struct smb_filename *smb_fname_base = NULL;
+       ret = close(fd);
+       fsp->fh->fd = -1;
 
-               smb_fname_base = cp_smb_filename(talloc_tos(), smb_fname);
-               if (smb_fname_base == NULL) {
-                       errno = ENOMEM;
-                       return -1;
-               }
+       return ret;
+}
 
-               ret = SMB_VFS_NEXT_UNLINK(handle, smb_fname_base);
+static int streams_xattr_unlink_internal(vfs_handle_struct *handle,
+                       struct files_struct *dirfsp,
+                       const struct smb_filename *smb_fname,
+                       int flags)
+{
+       NTSTATUS status;
+       int ret = -1;
+       char *xattr_name = NULL;
 
-               TALLOC_FREE(smb_fname_base);
-               return ret;
+       if (!is_named_stream(smb_fname)) {
+               return SMB_VFS_NEXT_UNLINKAT(handle,
+                                       dirfsp,
+                                       smb_fname,
+                                       flags);
        }
 
        status = streams_xattr_get_name(handle, talloc_tos(),
@@ -607,8 +569,30 @@ static int streams_xattr_unlink(vfs_handle_struct *handle,
        return ret;
 }
 
-static int streams_xattr_rename(vfs_handle_struct *handle,
+static int streams_xattr_unlinkat(vfs_handle_struct *handle,
+                       struct files_struct *dirfsp,
+                       const struct smb_filename *smb_fname,
+                       int flags)
+{
+       int ret;
+       if (flags & AT_REMOVEDIR) {
+               ret = SMB_VFS_NEXT_UNLINKAT(handle,
+                               dirfsp,
+                               smb_fname,
+                               flags);
+       } else {
+               ret = streams_xattr_unlink_internal(handle,
+                               dirfsp,
+                               smb_fname,
+                               flags);
+       }
+       return ret;
+}
+
+static int streams_xattr_renameat(vfs_handle_struct *handle,
+                               files_struct *srcfsp,
                                const struct smb_filename *smb_fname_src,
+                               files_struct *dstfsp,
                                const struct smb_filename *smb_fname_dst)
 {
        NTSTATUS status;
@@ -624,8 +608,11 @@ static int streams_xattr_rename(vfs_handle_struct *handle,
        dst_is_stream = is_ntfs_stream_smb_fname(smb_fname_dst);
 
        if (!src_is_stream && !dst_is_stream) {
-               return SMB_VFS_NEXT_RENAME(handle, smb_fname_src,
-                                          smb_fname_dst);
+               return SMB_VFS_NEXT_RENAMEAT(handle,
+                                       srcfsp,
+                                       smb_fname_src,
+                                       dstfsp,
+                                       smb_fname_dst);
        }
 
        /* For now don't allow renames from or to the default stream. */
@@ -966,6 +953,7 @@ static ssize_t streams_xattr_pwrite(vfs_handle_struct *handle,
                                        sio->base,
                                        NULL,
                                        NULL,
+                                       fsp->fsp_name->twrp,
                                        fsp->fsp_name->flags);
        if (smb_fname_base == NULL) {
                errno = ENOMEM;
@@ -1036,6 +1024,7 @@ static ssize_t streams_xattr_pread(vfs_handle_struct *handle,
                                        sio->base,
                                        NULL,
                                        NULL,
+                                       fsp->fsp_name->twrp,
                                        fsp->fsp_name->flags);
        if (smb_fname_base == NULL) {
                errno = ENOMEM;
@@ -1253,6 +1242,7 @@ static int streams_xattr_ftruncate(struct vfs_handle_struct *handle,
                                        sio->base,
                                        NULL,
                                        NULL,
+                                       fsp->fsp_name->twrp,
                                        fsp->fsp_name->flags);
        if (smb_fname_base == NULL) {
                errno = ENOMEM;
@@ -1350,18 +1340,6 @@ static int streams_xattr_fchmod(vfs_handle_struct *handle,
        return 0;
 }
 
-static int streams_xattr_fsync(vfs_handle_struct *handle, files_struct *fsp)
-{
-       struct stream_io *sio =
-               (struct stream_io *)VFS_FETCH_FSP_EXTENSION(handle, fsp);
-
-       if (sio == NULL) {
-               return SMB_VFS_NEXT_FSYNC(handle, fsp);
-       }
-
-       return 0;
-}
-
 static ssize_t streams_xattr_fgetxattr(struct vfs_handle_struct *handle,
                                       struct files_struct *fsp,
                                       const char *name,
@@ -1429,20 +1407,6 @@ static int streams_xattr_fsetxattr(struct vfs_handle_struct *handle,
        return -1;
 }
 
-static int streams_xattr_fchmod_acl(vfs_handle_struct *handle,
-                                   files_struct *fsp,
-                                   mode_t mode)
-{
-       struct stream_io *sio =
-               (struct stream_io *)VFS_FETCH_FSP_EXTENSION(handle, fsp);
-
-       if (sio == NULL) {
-               return SMB_VFS_NEXT_FCHMOD_ACL(handle, fsp, mode);
-       }
-
-       return 0;
-}
-
 static SMB_ACL_T streams_xattr_sys_acl_get_fd(vfs_handle_struct *handle,
                                              files_struct *fsp,
                                              TALLOC_CTX *mem_ctx)
@@ -1506,8 +1470,12 @@ static NTSTATUS streams_xattr_fget_nt_acl(vfs_handle_struct *handle,
                                                mem_ctx, ppdesc);
        }
 
-       return SMB_VFS_NEXT_GET_NT_ACL(handle, fsp->base_fsp->fsp_name,
-                                      security_info, mem_ctx, ppdesc);
+       return SMB_VFS_NEXT_GET_NT_ACL_AT(handle,
+                                       handle->conn->cwd_fsp,
+                                       fsp->base_fsp->fsp_name,
+                                       security_info,
+                                       mem_ctx,
+                                       ppdesc);
 }
 
 static NTSTATUS streams_xattr_fset_nt_acl(vfs_handle_struct *handle,
@@ -1638,7 +1606,7 @@ static bool streams_xattr_getlock(vfs_handle_struct *handle,
 
 static int streams_xattr_kernel_flock(vfs_handle_struct *handle,
                                      files_struct *fsp,
-                                     uint32_t share_mode,
+                                     uint32_t share_access,
                                      uint32_t access_mask)
 {
        struct stream_io *sio =
@@ -1646,7 +1614,7 @@ static int streams_xattr_kernel_flock(vfs_handle_struct *handle,
 
        if (sio == NULL) {
                return SMB_VFS_NEXT_KERNEL_FLOCK(handle, fsp,
-                                                share_mode, access_mask);
+                                                share_access, access_mask);
        }
 
        return 0;
@@ -1680,44 +1648,11 @@ static bool streams_xattr_strict_lock_check(struct vfs_handle_struct *handle,
        return true;
 }
 
-static NTSTATUS streams_xattr_get_compression(struct vfs_handle_struct *handle,
-                                             TALLOC_CTX *mem_ctx,
-                                             struct files_struct *fsp,
-                                             struct smb_filename *smb_fname,
-                                             uint16_t *_compression_fmt)
-{
-       struct stream_io *sio =
-               (struct stream_io *)VFS_FETCH_FSP_EXTENSION(handle, fsp);
-
-       if (sio == NULL) {
-               return SMB_VFS_NEXT_GET_COMPRESSION(handle, mem_ctx, fsp,
-                                                   smb_fname, _compression_fmt);
-       }
-
-       *_compression_fmt = COMPRESSION_FORMAT_NONE;
-       return NT_STATUS_OK;
-}
-
-static NTSTATUS streams_xattr_set_compression(struct vfs_handle_struct *handle,
-                                             TALLOC_CTX *mem_ctx,
-                                             struct files_struct *fsp,
-                                             uint16_t compression_fmt)
-{
-       struct stream_io *sio =
-               (struct stream_io *)VFS_FETCH_FSP_EXTENSION(handle, fsp);
-
-       if (sio == NULL) {
-               return SMB_VFS_NEXT_SET_COMPRESSION(handle, mem_ctx, fsp,
-                                                   compression_fmt);
-       }
-
-       return NT_STATUS_NOT_SUPPORTED;
-}
-
 static struct vfs_fn_pointers vfs_streams_xattr_fns = {
        .fs_capabilities_fn = streams_xattr_fs_capabilities,
        .connect_fn = streams_xattr_connect,
-       .open_fn = streams_xattr_open,
+       .openat_fn = streams_xattr_openat,
+       .close_fn = streams_xattr_close,
        .stat_fn = streams_xattr_stat,
        .fstat_fn = streams_xattr_fstat,
        .lstat_fn = streams_xattr_lstat,
@@ -1727,8 +1662,8 @@ static struct vfs_fn_pointers vfs_streams_xattr_fns = {
        .pread_recv_fn = streams_xattr_pread_recv,
        .pwrite_send_fn = streams_xattr_pwrite_send,
        .pwrite_recv_fn = streams_xattr_pwrite_recv,
-       .unlink_fn = streams_xattr_unlink,
-       .rename_fn = streams_xattr_rename,
+       .unlinkat_fn = streams_xattr_unlinkat,
+       .renameat_fn = streams_xattr_renameat,
        .ftruncate_fn = streams_xattr_ftruncate,
        .fallocate_fn = streams_xattr_fallocate,
        .streaminfo_fn = streams_xattr_streaminfo,
@@ -1742,20 +1677,14 @@ static struct vfs_fn_pointers vfs_streams_xattr_fns = {
        .linux_setlease_fn = streams_xattr_linux_setlease,
        .strict_lock_check_fn = streams_xattr_strict_lock_check,
 
-       .get_compression_fn = streams_xattr_get_compression,
-       .set_compression_fn = streams_xattr_set_compression,
-
        .fchown_fn = streams_xattr_fchown,
        .fchmod_fn = streams_xattr_fchmod,
-       .fsync_fn = streams_xattr_fsync,
 
        .fgetxattr_fn = streams_xattr_fgetxattr,
        .flistxattr_fn = streams_xattr_flistxattr,
        .fremovexattr_fn = streams_xattr_fremovexattr,
        .fsetxattr_fn = streams_xattr_fsetxattr,
 
-       .fchmod_acl_fn = streams_xattr_fchmod_acl,
-
        .sys_acl_get_fd_fn = streams_xattr_sys_acl_get_fd,
        .sys_acl_blob_get_fd_fn = streams_xattr_sys_acl_blob_get_fd,
        .sys_acl_set_fd_fn = streams_xattr_sys_acl_set_fd,
@@ -1764,7 +1693,7 @@ static struct vfs_fn_pointers vfs_streams_xattr_fns = {
        .fset_nt_acl_fn = streams_xattr_fset_nt_acl,
 };
 
-NTSTATUS vfs_streams_xattr_init(TALLOC_CTX *);
+static_decl_vfs;
 NTSTATUS vfs_streams_xattr_init(TALLOC_CTX *ctx)
 {
        return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "streams_xattr",