diff options
Diffstat (limited to 'source4/ntvfs/posix')
-rw-r--r-- | source4/ntvfs/posix/pvfs_fsinfo.c | 54 | ||||
-rw-r--r-- | source4/ntvfs/posix/vfs_posix.c | 3 | ||||
-rw-r--r-- | source4/ntvfs/posix/vfs_posix.h | 14 |
3 files changed, 52 insertions, 19 deletions
diff --git a/source4/ntvfs/posix/pvfs_fsinfo.c b/source4/ntvfs/posix/pvfs_fsinfo.c index 6046ecb6f8..3a95ed3ff5 100644 --- a/source4/ntvfs/posix/pvfs_fsinfo.c +++ b/source4/ntvfs/posix/pvfs_fsinfo.c @@ -26,9 +26,13 @@ /* We use libblkid out of e2fsprogs to identify UUID of a volume */ #ifdef HAVE_LIBBLKID -#include <blkid/blkid.h> +static int blkid_cache_destructor(void * cache_wrap) { + blkid_cache_wrap_t * cache = (blkid_cache_wrap_t *)cache_wrap; + blkid_put_cache(cache->cache); + if(cache->devname) free((void *)cache->devname); + return 0; +} #endif - /* return filesystem space info */ @@ -141,28 +145,40 @@ NTSTATUS pvfs_fsinfo(struct ntvfs_module_context *ntvfs, return NT_STATUS_OK; case RAW_QFS_OBJECTID_INFORMATION: - { + { #ifdef HAVE_LIBBLKID - NTSTATUS status; - blkid_cache blk_cache = NULL; - const char *uuid_value; - const char *blkid_devname; - + NTSTATUS status; + const char *uuid_value; #endif - ZERO_STRUCT(fs->objectid_information.out); + ZERO_STRUCT(fs->objectid_information.out); #ifdef HAVE_LIBBLKID - blkid_devname = blkid_devno_to_devname(st.st_dev); - if (!blk_cache && blkid_get_cache(&blk_cache,NULL) < 0 ) { - return NT_STATUS_DEVICE_CONFIGURATION_ERROR; + if (!pvfs->blkid_cache) { + pvfs->blkid_cache = talloc(ntvfs, blkid_cache_wrap_t); + + if (!pvfs->blkid_cache) { + return NT_STATUS_NO_MEMORY; } - if ((uuid_value = blkid_get_tag_value(blk_cache, "UUID", blkid_devname))) { - GUID_from_string(uuid_value, &fs->objectid_information.out.guid); - free(uuid_value); - } -#endif - return NT_STATUS_OK; + + pvfs->blkid_cache->cache = NULL; + pvfs->blkid_cache->devname = blkid_devno_to_devname(st.st_dev); + + talloc_set_destructor(pvfs->blkid_cache, blkid_cache_destructor); + + if (blkid_get_cache(&pvfs->blkid_cache->cache,NULL) < 0 ) { + return NT_STATUS_DEVICE_CONFIGURATION_ERROR; + } + } + + if ((uuid_value = blkid_get_tag_value(pvfs->blkid_cache->cache, + "UUID", pvfs->blkid_cache->devname))) { + GUID_from_string(uuid_value, &fs->objectid_information.out.guid); + free((void*)uuid_value); } +#endif + return NT_STATUS_OK; + } + default: + break; } - return NT_STATUS_INVALID_LEVEL; } diff --git a/source4/ntvfs/posix/vfs_posix.c b/source4/ntvfs/posix/vfs_posix.c index ec8db07d01..1d3979aabf 100644 --- a/source4/ntvfs/posix/vfs_posix.c +++ b/source4/ntvfs/posix/vfs_posix.c @@ -88,6 +88,9 @@ static void pvfs_setup_options(struct pvfs_state *pvfs) pvfs->sid_cache.creator_owner = dom_sid_parse_talloc(pvfs, SID_CREATOR_OWNER); pvfs->sid_cache.creator_group = dom_sid_parse_talloc(pvfs, SID_CREATOR_GROUP); +#ifdef HAVE_BLKID + pvfs->blkid_cache = NULL; +#endif } diff --git a/source4/ntvfs/posix/vfs_posix.h b/source4/ntvfs/posix/vfs_posix.h index f779936bf9..a55674d69a 100644 --- a/source4/ntvfs/posix/vfs_posix.h +++ b/source4/ntvfs/posix/vfs_posix.h @@ -26,6 +26,16 @@ #include "system/filesys.h" #include "smb_server/smb_server.h" +/* We use libblkid out of e2fsprogs to identify UUID of a volume */ +#ifdef HAVE_LIBBLKID +#include <blkid/blkid.h> + +typedef struct { + blkid_cache cache; + const char *devname; +} blkid_cache_wrap_t; +#endif + /* this is the private structure for the posix vfs backend. It is used to hold per-connection (per tree connect) state information */ struct pvfs_state { @@ -67,6 +77,10 @@ struct pvfs_state { const struct dom_sid *creator_owner; const struct dom_sid *creator_group; } sid_cache; + +#ifdef HAVE_LIBBLKID + blkid_cache_wrap_t *blkid_cache; +#endif }; /* this is the basic information needed about a file from the filesystem */ |