You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/sys-fs/copyfs/files/copyfs-1.0-unlink.patch

159 lines
4.3 KiB

diff -u --recursive copyfs-1.0-orig/cache.c copyfs-1.0/cache.c
--- copyfs-1.0-orig/cache.c 2004-12-10 13:34:08.000000000 +0000
+++ copyfs-1.0/cache.c 2004-12-18 20:30:17.945445677 +0000
@@ -94,6 +94,61 @@
}
/*
+ * Remove metadata from the cache
+ */
+void cache_remove_metadata(metadata_t *metadata)
+{
+ version_t * version;
+
+ int atHead = 1;
+ int atTail = 1;
+
+ if (NULL == metadata)
+ return ;
+
+ /* Disconnect it from the list */
+ if (metadata->md_previous)
+ {
+ metadata->md_previous->md_next = metadata->md_next;
+ atHead = 0;
+ }
+
+ if (metadata->md_next)
+ {
+ metadata->md_next->md_previous = metadata->md_previous;
+ atTail = 0;
+ }
+
+ if (atHead)
+ {
+ metadata->md_bucket->b_contents = metadata->md_next;
+ if (metadata->md_next != NULL)
+ metadata->md_next->md_previous = NULL;
+ }
+
+ metadata->md_bucket->b_count--;
+ if (metadata->md_bucket->b_count == 0)
+ metadata->md_bucket->b_contents = NULL;
+
+ version = metadata->md_versions;
+
+ while (NULL != version)
+ {
+ metadata->md_versions = version->v_next;
+ free(version);
+ version = metadata->md_versions;
+ }
+
+ if (metadata->md_vfile != NULL)
+ free (metadata->md_vfile);
+
+ if (metadata->md_vpath != NULL)
+ free (metadata->md_vpath);
+
+ free(metadata);
+}
+
+/*
* Clean the older items out of the cache to free space. The goal is to
* half the number of items, so that we don't get called constantly.
*/
@@ -122,6 +177,7 @@
bucket = &cache_hash_table[CACHE_HASH(metadata->md_vfile)];
metadata->md_previous = NULL;
metadata->md_next = bucket->b_contents;
+ metadata->md_bucket = bucket;
if (bucket->b_contents)
bucket->b_contents->md_previous = metadata;
bucket->b_contents = metadata;
diff -u --recursive copyfs-1.0-orig/cache.h copyfs-1.0/cache.h
--- copyfs-1.0-orig/cache.h 2004-12-10 13:34:08.000000000 +0000
+++ copyfs-1.0/cache.h 2004-12-18 20:04:32.072307652 +0000
@@ -11,6 +11,7 @@
void cache_initialize(void);
void cache_finalize(void);
metadata_t *cache_get_metadata(const char *vpath);
+void cache_remove_metadata(metadata_t *metadata);
void cache_add_metadata(metadata_t *metadata);
int cache_find_maximal_match(char **array, metadata_t **result);
diff -u --recursive copyfs-1.0-orig/interface.c copyfs-1.0/interface.c
--- copyfs-1.0-orig/interface.c 2004-12-18 20:04:21.560474299 +0000
+++ copyfs-1.0/interface.c 2004-12-18 20:17:22.367357210 +0000
@@ -137,6 +137,7 @@
file = helper_build_composite("-S", "/", entry->d_name +
strlen(METADATA_PREFIX));
metadata = rcs_translate_to_metadata(file, rcs_version_path);
+
free(file);
if (metadata && !metadata->md_deleted)
{
@@ -176,18 +177,42 @@
metadata = rcs_translate_to_metadata(path, rcs_version_path);
if (!metadata || metadata->md_deleted)
return -ENOENT;
- version = rcs_find_version(metadata, LATEST, LATEST);
- if (lstat(version->v_rfile, &st_rfile) == -1)
- return -errno;
- if (S_ISDIR(st_rfile.st_mode))
- return -EISDIR;
+
+ /* remove all of the versions that we know about */
+
+ version = metadata->md_versions;
+
+ while (NULL != version)
+ {
+ /* if we can't stat the file, we assume it's already toast */
+
+ if (lstat(version->v_rfile, &st_rfile) == 0)
+ {
+ if (S_ISDIR(st_rfile.st_mode))
+ {
+ return -EISDIR;
+ }
+
+ if (unlink(version->v_rfile) == -1)
+ return -errno;
+ }
+
+ /* move on to the next version */
+ metadata->md_versions = version->v_next;
+ free(version);
+
+ version = metadata->md_versions;
+ }
+
+ /* if we get to here, we've released all the versions */
metadata->md_deleted = 1;
metafile = create_meta_name(metadata->md_vfile, "metadata");
- if (write_metadata_file(metafile, metadata) == -1) {
- free(metafile);
+ if (unlink(metafile) == -1)
return -errno;
- }
free(metafile);
+
+ cache_remove_metadata(metadata);
+
return 0;
}
diff -u --recursive copyfs-1.0-orig/structs.h copyfs-1.0/structs.h
--- copyfs-1.0-orig/structs.h 2004-12-10 13:34:08.000000000 +0000
+++ copyfs-1.0/structs.h 2004-12-18 20:04:32.073307446 +0000
@@ -38,6 +38,8 @@
metadata_t *md_next; /* Next file in bucket */
metadata_t *md_previous; /* Previous " */
+
+ bucket_t *md_bucket; /* Our container */
};
struct bucket_t