Bug in dazukofs_open()

Lino Sanfilippo <[email protected]> Thu, 27 Nov 2008 17:14:53 +0100
Newsgroups gmane.linux.dazuko.devel
Message-ID <[email protected]>

Hi John,

while I was working with dazukoFS I encountered some strange problems 
with files that had been blocked by an application via dazuko before.
If such a file has been deleted it was not possible to create a file 
(i.e. by touching it) with the same name where it has been located before.
The error message was :"File exists", though an "ls" did not show it 
anymore.

It was also impossible to unmount the underlying device (i.e. a usb 
stick). The error message was:
"device is busy".

I found out that the reason for these problems is a bug in dazukofs_open():

If dazuko_check_access() returns with an error code, the usage counters 
of lower_dentry and lower_mnt that had been incremented before, are not 
decremented again. This prevents the underlaying filesystem from 
removing the corresponding dentry and inode.
I created a patch (for 3.00-rc3 with linux-2.6.26 patch) that resolves 
that problem. It also eliminates a bug in the error handling part of 
init_events().
The patch is applied to this mail.

Yet another thing:
Will dazukoFS support additional file access events in future, i.e. for 
"on close"?


Greetings,
Lino Sanfilippo

GeschÀftsfÌhrender Gesellschafter: Tjark Auerbach
Sitz der Gesellschaft: Tettnang
Handelsregister: Amtsgericht Ulm, HRB 630992
ALLGEMEINE GESCHÄFTSBEDINGUNGEN
Es gelten unsere Allgemeinen GeschÀftsbedingungen
(AGB). Sie finden sie in der jeweils gÃŒltigen Fassung
im Internet unter http://www.avira.de/agb
***************************************************

_______________________________________________
Dazuko-devel mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/dazuko-devel
patch-proper-cleanup-dazukofs-3.0.0-rc3-kernel-2.6.26 (text/plain, 1.7 KB)
diff -ru dazukofs-3.0.0-rc3/event.c dazukofs-3.0.0-rc3PATCH/event.c
--- dazukofs-3.0.0-rc3/event.c	2008-10-25 00:07:07.000000000 +0200
+++ dazukofs-3.0.0-rc3PATCH/event.c	2008-11-27 15:38:03.000000000 +0100
@@ -124,11 +124,11 @@
 	return 0;
 
 error_out:
-	if (!dazukofs_group_cachep)
+	if (dazukofs_group_cachep)
 		kmem_cache_destroy(dazukofs_group_cachep);
-	if (!dazukofs_event_container_cachep)
+	if (dazukofs_event_container_cachep)
 		kmem_cache_destroy(dazukofs_event_container_cachep);
-	if (!dazukofs_event_cachep)
+	if (dazukofs_event_cachep)
 		kmem_cache_destroy(dazukofs_event_cachep);
 	return -ENOMEM;
 }
diff -ru dazukofs-3.0.0-rc3/file.c dazukofs-3.0.0-rc3PATCH/file.c
--- dazukofs-3.0.0-rc3/file.c	2008-10-09 21:35:26.000000000 +0200
+++ dazukofs-3.0.0-rc3PATCH/file.c	2008-11-27 15:42:12.000000000 +0100
@@ -233,27 +233,33 @@
 	struct dentry *lower_dentry = dget(GET_LOWER_DENTRY(dentry));
 	struct vfsmount *lower_mnt = mntget(GET_LOWER_MNT(dentry));
 	struct file *lower_file;
-	int err = 0;
+	int err;
 
 	err = dazukofs_check_access(file->f_dentry, file->f_vfsmnt);
 	if (err)
-		goto out;
+		goto out_put;
 
 	SET_FILE_INFO(file, kmem_cache_zalloc(dazukofs_file_info_cachep,
 		      GFP_KERNEL));
 	if (!GET_FILE_INFO(file)) {
 		err = -ENOMEM;
-		goto out;
+		goto out_put;
 	}
 
 	lower_file = dentry_open(lower_dentry, lower_mnt, file->f_flags);
 	if (IS_ERR(lower_file)) {
+		/* dput() and mntput() already done by dentry_open() */
 		err = PTR_ERR(lower_file);
-		goto out;
+		goto out_err;
 	}
 
 	SET_LOWER_FILE(file, lower_file);
-out:
+
+	return 0;
+out_put:
+	mntput(lower_mnt);
+	dput(lower_dentry);
+out_err:
 	return err;
 }
 
Nur in dazukofs-3.0.0-rc3PATCH/: modules.order.