Revert "Fix bug #7781 (Samba transforms "ShareName" to lowercase when adding new...
[samba.git] / source3 / modules / vfs_xattr_tdb.c
index e805fbcb2c17543f8caabfe718e7e3990906ee04..f7fbfce4cb979f2232d9c301a78faab41996e5b1 100644 (file)
@@ -620,6 +620,7 @@ static int xattr_tdb_unlink(vfs_handle_struct *handle,
        struct db_record *rec;
        NTSTATUS status;
        int ret = -1;
+       bool remove_record = false;
 
        SMB_VFS_HANDLE_GET_DATA(handle, db, struct db_context, return -1);
 
@@ -629,16 +630,30 @@ static int xattr_tdb_unlink(vfs_handle_struct *handle,
                return -1;
        }
 
-       if (SMB_VFS_STAT(handle->conn, smb_fname_tmp) == -1) {
+       if (lp_posix_pathnames()) {
+               ret = SMB_VFS_LSTAT(handle->conn, smb_fname_tmp);
+       } else {
+               ret = SMB_VFS_STAT(handle->conn, smb_fname_tmp);
+       }
+       if (ret == -1) {
                goto out;
        }
 
+       if (smb_fname_tmp->st.st_ex_nlink == 1) {
+               /* Only remove record on last link to file. */
+               remove_record = true;
+       }
+
        ret = SMB_VFS_NEXT_UNLINK(handle, smb_fname_tmp);
 
        if (ret == -1) {
                goto out;
        }
 
+       if (!remove_record) {
+               goto out;
+       }
+
        id = SMB_VFS_FILE_ID_CREATE(handle->conn, &smb_fname_tmp->st);
 
        rec = xattr_tdb_lock_attrs(talloc_tos(), db, &id);
@@ -741,37 +756,23 @@ static int xattr_tdb_connect(vfs_handle_struct *handle, const char *service,
        return 0;
 }
 
-/* VFS operations structure */
-
-static const vfs_op_tuple xattr_tdb_ops[] = {
-       {SMB_VFS_OP(xattr_tdb_getxattr), SMB_VFS_OP_GETXATTR,
-        SMB_VFS_LAYER_TRANSPARENT},
-       {SMB_VFS_OP(xattr_tdb_fgetxattr), SMB_VFS_OP_FGETXATTR,
-        SMB_VFS_LAYER_TRANSPARENT},
-       {SMB_VFS_OP(xattr_tdb_setxattr), SMB_VFS_OP_SETXATTR,
-        SMB_VFS_LAYER_TRANSPARENT},
-       {SMB_VFS_OP(xattr_tdb_fsetxattr), SMB_VFS_OP_FSETXATTR,
-        SMB_VFS_LAYER_TRANSPARENT},
-       {SMB_VFS_OP(xattr_tdb_listxattr), SMB_VFS_OP_LISTXATTR,
-        SMB_VFS_LAYER_TRANSPARENT},
-       {SMB_VFS_OP(xattr_tdb_flistxattr), SMB_VFS_OP_FLISTXATTR,
-        SMB_VFS_LAYER_TRANSPARENT},
-       {SMB_VFS_OP(xattr_tdb_removexattr), SMB_VFS_OP_REMOVEXATTR,
-        SMB_VFS_LAYER_TRANSPARENT},
-       {SMB_VFS_OP(xattr_tdb_fremovexattr), SMB_VFS_OP_FREMOVEXATTR,
-        SMB_VFS_LAYER_TRANSPARENT},
-       {SMB_VFS_OP(xattr_tdb_unlink), SMB_VFS_OP_UNLINK,
-        SMB_VFS_LAYER_TRANSPARENT},
-       {SMB_VFS_OP(xattr_tdb_rmdir), SMB_VFS_OP_RMDIR,
-        SMB_VFS_LAYER_TRANSPARENT},
-       {SMB_VFS_OP(xattr_tdb_connect), SMB_VFS_OP_CONNECT,
-        SMB_VFS_LAYER_TRANSPARENT},
-       {SMB_VFS_OP(NULL), SMB_VFS_OP_NOOP, SMB_VFS_LAYER_NOOP}
+static struct vfs_fn_pointers vfs_xattr_tdb_fns = {
+       .getxattr = xattr_tdb_getxattr,
+       .fgetxattr = xattr_tdb_fgetxattr,
+       .setxattr = xattr_tdb_setxattr,
+       .fsetxattr = xattr_tdb_fsetxattr,
+       .listxattr = xattr_tdb_listxattr,
+       .flistxattr = xattr_tdb_flistxattr,
+       .removexattr = xattr_tdb_removexattr,
+       .fremovexattr = xattr_tdb_fremovexattr,
+       .unlink = xattr_tdb_unlink,
+       .rmdir = xattr_tdb_rmdir,
+       .connect_fn = xattr_tdb_connect,
 };
 
 NTSTATUS vfs_xattr_tdb_init(void);
 NTSTATUS vfs_xattr_tdb_init(void)
 {
        return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "xattr_tdb",
-                               xattr_tdb_ops);
+                               &vfs_xattr_tdb_fns);
 }