[PATCH] s3-vfs: Fix stream_depot vfs module on btrfs.

Andreas Schneider asn at samba.org
Fri Nov 8 07:41:18 MST 2013


Checking if the directory is empty using 'nlink == 2' only checks if
there are no subdirectories. It doesn't indicate if there are files in
the directory. However checking link count for no subdirectories is
wrong and applications shouldn't rely on it, see:

https://lkml.org/lkml/2012/2/1/756

Signed-off-by: Andreas Schneider <asn at samba.org>
---
 source3/modules/vfs_streams_depot.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/source3/modules/vfs_streams_depot.c b/source3/modules/vfs_streams_depot.c
index 3ada92e..ae1af24 100644
--- a/source3/modules/vfs_streams_depot.c
+++ b/source3/modules/vfs_streams_depot.c
@@ -646,7 +646,8 @@ static int streams_depot_unlink(vfs_handle_struct *handle,
 		return -1;
 	}
 
-	if (smb_fname_base->st.st_ex_nlink == 1) {
+	ret = SMB_VFS_NEXT_UNLINK(handle, smb_fname);
+	if (ret == 0) {
 		char *dirname = stream_dir(handle, smb_fname_base,
 					   &smb_fname_base->st, false);
 
@@ -656,8 +657,6 @@ static int streams_depot_unlink(vfs_handle_struct *handle,
 		TALLOC_FREE(dirname);
 	}
 
-	ret = SMB_VFS_NEXT_UNLINK(handle, smb_fname);
-
 	TALLOC_FREE(smb_fname_base);
 	return ret;
 }
@@ -690,7 +689,8 @@ static int streams_depot_rmdir(vfs_handle_struct *handle, const char *path)
 		return -1;
 	}
 
-	if (smb_fname_base->st.st_ex_nlink == 2) {
+	ret = SMB_VFS_NEXT_RMDIR(handle, path);
+	if (ret == 0) {
 		char *dirname = stream_dir(handle, smb_fname_base,
 					   &smb_fname_base->st, false);
 
@@ -700,8 +700,6 @@ static int streams_depot_rmdir(vfs_handle_struct *handle, const char *path)
 		TALLOC_FREE(dirname);
 	}
 
-	ret = SMB_VFS_NEXT_RMDIR(handle, path);
-
 	TALLOC_FREE(smb_fname_base);
 	return ret;
 }
-- 
1.8.4




More information about the samba-technical mailing list