[BUG] extfs bug

Pavel Roskin proski at gnu.org
Sat Dec 7 03:35:32 UTC 2002


> One possible solution would be to mark the archive as dirty whenever any
> command is issued to change it.  That flag would go to struct archive in
> extfs.h.

I'm attaching an implementation of the above.  I wrote it in 10 minites
and the testing shows that it doesn't work properly.  But it can be a good
starting point if you want to work on this.

-- 
Regards,
Pavel Roskin
-------------- next part --------------
--- extfs.c
+++ extfs.c
@@ -82,6 +82,7 @@ static struct entry *
 find_entry (struct entry *dir, char *name, int make_dirs, int make_file);
 static int extfs_which (vfs *me, char *path);
 static void remove_entry (struct entry *e);
+static void extfs_free (vfsid id);
 
 static struct archive *first_archive = NULL;
 static int my_errno = 0;
@@ -414,7 +415,8 @@ get_path_mangle (char *inname, struct ar
 {
     char *local, *archive_name, *op;
     int result = -1;
-    struct archive *parc;
+    struct archive *p;
+    struct archive *parc = NULL;
     struct vfs_stamping *parent;
     vfs *v;
     int fstype;
@@ -437,32 +439,42 @@ get_path_mangle (char *inname, struct ar
      * All filesystems should have some local archive, at least
      * it can be '/'.
      */
-    for (parc = first_archive; parc != NULL; parc = parc->next)
-	if (parc->name) {
-	    if (!strcmp (parc->name, archive_name)) {
-		vfs_stamp (&vfs_extfs_ops, (vfsid) parc);
-		goto return_success;
+    for (p = first_archive; p != NULL; p = p->next)
+	if (p->name) {
+	    if (!strcmp (p->name, archive_name)) {
+		vfs_stamp (&vfs_extfs_ops, (vfsid) p);
+		parc = p;
 	    }
 	}
 
-    result = do_not_open ? -1 : read_archive (fstype, archive_name, &parc);
-    if (result == -1)
-	ERRNOR (EIO, NULL);
-
-    if (archive_name) {
-	v = vfs_type (archive_name);
-	if (v == &vfs_local_ops) {
-	    parent = NULL;
-	} else {
-	    parent = g_new (struct vfs_stamping, 1);
-	    parent->v = v;
-	    parent->next = 0;
-	    parent->id = (*v->getid) (v, archive_name, &(parent->parent));
+    if (parc && parc->dirty) {
+	extfs_free ((vfsid) parc);
+	parc = NULL;
+    }
+
+    if (!parc) {
+	result =
+	    do_not_open ? -1 : read_archive (fstype, archive_name, &parc);
+	if (result == -1)
+	    ERRNOR (EIO, NULL);
+
+	if (archive_name) {
+	    v = vfs_type (archive_name);
+	    if (v == &vfs_local_ops) {
+		parent = NULL;
+	    } else {
+		parent = g_new (struct vfs_stamping, 1);
+		parent->v = v;
+		parent->next = 0;
+		parent->id =
+		    (*v->getid) (v, archive_name, &(parent->parent));
+	    }
+	    vfs_add_noncurrent_stamps (&vfs_extfs_ops, (vfsid) parc,
+				       parent);
+	    vfs_rm_parents (parent);
 	}
-	vfs_add_noncurrent_stamps (&vfs_extfs_ops, (vfsid) parc, parent);
-	vfs_rm_parents (parent);
     }
-  return_success:
+
     *archive = parc;
     return local;
 }
@@ -702,6 +714,7 @@ static int extfs_close (void *data)
 
     /* Commit the file if it has changed */
     if (file->has_changed) {
+	file->archive->dirty = 1;
 	if (extfs_cmd (" copyin ", file->archive, file->entry,
 		       file->entry->inode->local_filename))
 	    errno_code = EIO;
@@ -1028,6 +1041,7 @@ static int extfs_unlink (vfs *me, char *
 	return -1;
     if (S_ISDIR (entry->inode->mode)) ERRNOR (EISDIR, -1);
 
+    archive->dirty = 1;
     if (extfs_cmd (" rm ", archive, entry, "")){
         my_errno = EIO;
         return -1;
@@ -1054,6 +1068,7 @@ static int extfs_mkdir (vfs *me, char *p
 	return -1;
     if (!S_ISDIR (entry->inode->mode)) ERRNOR (ENOTDIR, -1);
 
+    archive->dirty = 1;
     if (extfs_cmd (" mkdir ", archive, entry, "")){
 	my_errno = EIO;
 	remove_entry (entry);
@@ -1078,6 +1093,7 @@ static int extfs_rmdir (vfs *me, char *p
 	return -1;
     if (!S_ISDIR (entry->inode->mode)) ERRNOR (ENOTDIR, -1);
 
+    archive->dirty = 1;
     if (extfs_cmd (" rmdir ", archive, entry, "")){
         my_errno = EIO;
         return -1;
--- extfs.h
+++ extfs.h
@@ -25,6 +25,7 @@
     struct stat local_stat;
     dev_t rdev;
     int fd_usage;
+    int dirty;
     ino_t __inode_counter;
     struct entry *root_entry;
     struct entry *current_dir;


More information about the mc-devel mailing list