Index: source/smbd/dosmode.c =================================================================== --- source/smbd/dosmode.c (revision 7349) +++ source/smbd/dosmode.c (working copy) @@ -20,6 +20,16 @@ #include "includes.h" +static inline void +set_sparse_flag(const SMB_STRUCT_STAT * const sbuf, int * result) +{ +#if defined (HAVE_STAT_ST_BLOCKS) && defined(STAT_ST_BLOCKSIZE) + if (sbuf->st_size > sbuf->st_blocks * (SMB_OFF_T)STAT_ST_BLOCKSIZE) { + *result |= FILE_ATTRIBUTE_SPARSE; + } +#endif +} + /**************************************************************************** Change a dos mode to a unix mode. Base permission for files: @@ -140,11 +150,7 @@ if (S_ISDIR(sbuf->st_mode)) result = aDIR | (result & aRONLY); -#if defined (HAVE_STAT_ST_BLOCKS) && defined(STAT_ST_BLOCKSIZE) - if (sbuf->st_size > sbuf->st_blocks * (SMB_OFF_T)STAT_ST_BLOCKSIZE) { - result |= FILE_ATTRIBUTE_SPARSE; - } -#endif + set_sparse_flag(sbuf, &result); #ifdef S_ISLNK #if LINKS_READ_ONLY @@ -293,6 +299,7 @@ /* Get the DOS attributes from an EA by preference. */ if (get_ea_dos_attribute(conn, path, sbuf, &result)) { + set_sparse_flag(sbuf, &result); return result; }