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

David Disseldorp ddiss at suse.de
Tue Nov 12 05:36:28 MST 2013


Hi Andreas,

What was the reason for posting two versions of this change? You
mentioned that the wrong version was pushed. Should I revert
29f12e7d5960906935e3af1405e9759a07d64750 and push this one?

Cheers, David

On Fri,  8 Nov 2013 15:41:18 +0100
Andreas Schneider <asn at samba.org> wrote:

> 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;
>  }



More information about the samba-technical mailing list