X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=device-src%2Fvfs-device.c;h=122a6efb8e479cdf21713b93c31a13af2d9e5d7c;hb=377e15b597bafb8e7c2a100f11a0166f7220fe1c;hp=71387c6b08ce61dd6c388c04776b8ff3b546099c;hpb=42ff24f2a525d5965e1841b2ebe3ee0f4b918ac6;p=debian%2Famanda diff --git a/device-src/vfs-device.c b/device-src/vfs-device.c index 71387c6..122a6ef 100644 --- a/device-src/vfs-device.c +++ b/device-src/vfs-device.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2008, 2009, 2010 Zmanda, Inc. All Rights Reserved. + * Copyright (c) 2007, 2008, 2009, 2010, 2011 Zmanda, Inc. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published @@ -99,6 +99,9 @@ static gboolean file_number_to_file_name_functor(const char * filename, static gboolean vfs_device_set_max_volume_usage_fn(Device *p_self, DevicePropertyBase *base, GValue *val, PropertySurety surety, PropertySource source); +static gboolean vfs_device_set_enforce_max_volume_usage_fn(Device *p_self, + DevicePropertyBase *base, GValue *val, + PropertySurety surety, PropertySource source); static gboolean property_get_monitor_free_space_fn(Device *p_self, DevicePropertyBase *base, GValue *val, PropertySurety *surety, PropertySource *source); @@ -187,6 +190,7 @@ vfs_device_init (VfsDevice * self) { self->volume_bytes = 0; self->volume_limit = 0; self->leom = TRUE; + self->enforce_volume_limit = TRUE; self->monitor_free_space = TRUE; self->checked_fs_free_bytes = G_MAXUINT64; @@ -227,11 +231,17 @@ vfs_device_init (VfsDevice * self) { g_value_unset(&response); g_value_init(&response, G_TYPE_BOOLEAN); - g_value_set_boolean(&response, FALSE); + g_value_set_boolean(&response, TRUE); device_set_simple_property(dself, PROPERTY_LEOM, &response, PROPERTY_SURETY_GOOD, PROPERTY_SOURCE_DETECTED); g_value_unset(&response); + g_value_init(&response, G_TYPE_BOOLEAN); + g_value_set_boolean(&response, TRUE); + device_set_simple_property(dself, PROPERTY_ENFORCE_MAX_VOLUME_USAGE, + &response, PROPERTY_SURETY_GOOD, PROPERTY_SOURCE_DETECTED); + g_value_unset(&response); + g_value_init(&response, G_TYPE_BOOLEAN); g_value_set_boolean(&response, FALSE); device_set_simple_property(dself, PROPERTY_COMPRESSION, @@ -285,6 +295,12 @@ vfs_device_base_init (VfsDeviceClass * c) device_simple_property_get_fn, vfs_device_set_max_volume_usage_fn); + device_class_register_property(device_class, PROPERTY_ENFORCE_MAX_VOLUME_USAGE, + (PROPERTY_ACCESS_GET_MASK | PROPERTY_ACCESS_SET_MASK) & + (~ PROPERTY_ACCESS_SET_INSIDE_FILE_WRITE), + device_simple_property_get_fn, + vfs_device_set_enforce_max_volume_usage_fn); + device_class_register_property(device_class, PROPERTY_COMPRESSION, PROPERTY_ACCESS_GET_MASK, device_simple_property_get_fn, @@ -309,6 +325,18 @@ vfs_device_set_max_volume_usage_fn(Device *p_self, return device_simple_property_set_fn(p_self, base, val, surety, source); } +static gboolean +vfs_device_set_enforce_max_volume_usage_fn(Device *p_self, + DevicePropertyBase *base, GValue *val, + PropertySurety surety, PropertySource source) +{ + VfsDevice *self = VFS_DEVICE(p_self); + + self->enforce_volume_limit = g_value_get_boolean(val); + + return device_simple_property_set_fn(p_self, base, val, surety, source); +} + static gboolean property_get_monitor_free_space_fn(Device *p_self, DevicePropertyBase *base G_GNUC_UNUSED, GValue *val, PropertySurety *surety, PropertySource *source) @@ -557,11 +585,9 @@ vfs_device_open_device (Device * pself, char * device_name, char * device_type, static gboolean delete_vfs_files_functor(const char * filename, gpointer user_data) { VfsDevice * self; - Device * d_self; char * path_name; self = VFS_DEVICE(user_data); - d_self = DEVICE(self); /* Skip the volume lock. */ if (strcmp(filename, VOLUME_LOCKFILE_NAME) == 0) @@ -663,6 +689,7 @@ static gboolean clear_and_prepare_label(VfsDevice * self, char * label, return FALSE; } dumpfile_free(d_self->volume_header); + d_self->header_block_size = VFS_DEVICE_LABEL_SIZE; d_self->volume_header = label_header; self->volume_bytes = VFS_DEVICE_LABEL_SIZE; return TRUE; @@ -1202,6 +1229,9 @@ vfs_device_seek_file (Device * dself, guint requested_file) { } /* update our state */ + if (requested_file == 0) { + dself->header_block_size = header_buffer_size; + } dself->in_file = TRUE; dself->file = file; @@ -1257,7 +1287,7 @@ check_at_leom(VfsDevice *self, guint64 size) return FALSE; /* handle VOLUME_LIMIT */ - if (self->volume_limit && + if (self->enforce_volume_limit && self->volume_limit && self->volume_bytes + size + eom_warning_buffer > self->volume_limit) { return TRUE; } @@ -1302,7 +1332,7 @@ check_at_leom(VfsDevice *self, guint64 size) static gboolean check_at_peom(VfsDevice *self, guint64 size) { - if (self->volume_limit > 0) { + if (self->enforce_volume_limit && (self->volume_limit > 0)) { guint64 newtotal = self->volume_bytes + size; if (newtotal > self->volume_limit) { return TRUE; @@ -1369,13 +1399,18 @@ static gboolean vfs_device_erase (Device * dself) { VfsDevice *self = VFS_DEVICE(dself); - if (!open_lock(self, 0, true)) - return false; + if (!open_lock(self, 0, TRUE)) + return FALSE; delete_vfs_files(self); release_file(self); + dumpfile_free(dself->volume_header); + dself->volume_header = NULL; + device_set_error(dself, g_strdup("Unlabeled volume"), + DEVICE_STATUS_VOLUME_UNLABELED); + return TRUE; }