-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hi together,
please find the attached patch for unionfs with 2.6.16RC2 kernel.
The patch is untested so far however it compiles cleanly.
Cheers
Ulrich
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org
iD8DBQFD6HuU22t2oTuElzoRAk1NAKCHtO13lMwBhBR6pb3mCO1OZwssuQCglWEY
ky+zVEvobjEjTWUd5laRL8I=
=jYcl
-----END PGP SIGNATURE-----
diff -Nru unionfs-1.1.2/copyup.c unionfs-1.1.2.mod/copyup.c
--- unionfs-1.1.2/copyup.c 2006-01-25 22:58:11.000000000 +0100
+++ unionfs-1.1.2.mod/copyup.c 2006-02-07 11:41:30.000000000 +0100
@@ -64,7 +64,8 @@
name_list_orig = name_list;
while (*name_list) {
ssize_t size;
- down(&old_hidden_dentry->d_inode->i_sem);
+// down(&old_hidden_dentry->d_inode->i_sem);
+ mutex_lock(&old_hidden_dentry->d_inode->i_mutex);
err = security_inode_getxattr(old_hidden_dentry, name_list);
if (err)
size = err;
@@ -73,7 +74,8 @@
old_hidden_dentry->d_inode->i_op->
getxattr(old_hidden_dentry, name_list, attr_value,
XATTR_SIZE_MAX);
- up(&old_hidden_dentry->d_inode->i_sem);
+// up(&old_hidden_dentry->d_inode->i_sem);
+ mutex_unlock(&old_hidden_dentry->d_inode->i_mutex);
if (size < 0) {
err = size;
goto out;
@@ -84,7 +86,8 @@
goto out;
}
- down(&new_hidden_dentry->d_inode->i_sem);
+// down(&new_hidden_dentry->d_inode->i_sem);
+ mutex_lock(&new_hidden_dentry->d_inode->i_mutex);
err =
security_inode_setxattr(old_hidden_dentry, name_list,
@@ -101,7 +104,8 @@
attr_value, size,
0);
}
- up(&new_hidden_dentry->d_inode->i_sem);
+// up(&new_hidden_dentry->d_inode->i_sem);
+ mutex_unlock(&new_hidden_dentry->d_inode->i_mutex);
if (err < 0)
goto out;
diff -Nru unionfs-1.1.2/dentry.c unionfs-1.1.2.mod/dentry.c
--- unionfs-1.1.2/dentry.c 2006-01-25 22:58:11.000000000 +0100
+++ unionfs-1.1.2.mod/dentry.c 2006-02-07 11:41:30.000000000 +0100
@@ -106,7 +106,8 @@
set_dbend(dentry, -1);
if (positive) {
- down(&dentry->d_inode->i_sem);
+// down(&dentry->d_inode->i_sem);
+ mutex_lock(&dentry->d_inode->i_mutex);
bstart = ibstart(dentry->d_inode);
bend = ibend(dentry->d_inode);
if (bstart >= 0) {
@@ -124,7 +125,8 @@
itohi_ptr(dentry->d_inode) = NULL;
ibstart(dentry->d_inode) = -1;
ibend(dentry->d_inode) = -1;
- up(&dentry->d_inode->i_sem);
+// up(&dentry->d_inode->i_sem);
+ mutex_unlock(&dentry->d_inode->i_mutex);
}
result =
diff -Nru unionfs-1.1.2/dirhelper.c unionfs-1.1.2.mod/dirhelper.c
--- unionfs-1.1.2/dirhelper.c 2006-01-25 22:58:11.000000000 +0100
+++ unionfs-1.1.2.mod/dirhelper.c 2006-02-07 11:41:30.000000000 +0100
@@ -78,11 +78,13 @@
continue;
}
- down(&hidden_dir_dentry->d_inode->i_sem);
+// down(&hidden_dir_dentry->d_inode->i_sem);
+ mutex_lock(&hidden_dir_dentry->d_inode->i_mutex);
err =
vfs_unlink(hidden_dir_dentry->d_inode,
hidden_dentry);
- up(&hidden_dir_dentry->d_inode->i_sem);
+// up(&hidden_dir_dentry->d_inode->i_sem);
+ mutex_unlock(&hidden_dir_dentry->d_inode->i_mutex);
DPUT(hidden_dentry);
if (err && !IS_COPYUP_ERR(err))
diff -Nru unionfs-1.1.2/file.c unionfs-1.1.2.mod/file.c
--- unionfs-1.1.2/file.c 2006-01-25 22:58:11.000000000 +0100
+++ unionfs-1.1.2.mod/file.c 2006-02-07 11:41:30.000000000 +0100
@@ -264,10 +264,12 @@
if (!hidden_file->f_op || !hidden_file->f_op->fsync)
goto out;
- down(&hidden_file->f_dentry->d_inode->i_sem);
+// down(&hidden_file->f_dentry->d_inode->i_sem);
+ mutex_lock(&hidden_file->f_dentry->d_inode->i_mutex);
err = hidden_file->f_op->fsync(hidden_file, hidden_file->f_dentry,
datasync);
- up(&hidden_file->f_dentry->d_inode->i_sem);
+// up(&hidden_file->f_dentry->d_inode->i_sem);
+ mutex_unlock(&hidden_file->f_dentry->d_inode->i_mutex);
out:
print_exit_status(err);
diff -Nru unionfs-1.1.2/inode.c unionfs-1.1.2.mod/inode.c
--- unionfs-1.1.2/inode.c 2006-01-25 22:58:11.000000000 +0100
+++ unionfs-1.1.2.mod/inode.c 2006-02-07 11:41:30.000000000 +0100
@@ -81,7 +81,8 @@
struct dentry *hidden_dir_dentry;
struct iattr newattrs;
- down(&whiteout_dentry->d_inode->i_sem);
+// down(&whiteout_dentry->d_inode->i_sem);
+ mutex_lock(&whiteout_dentry->d_inode->i_mutex);
newattrs.ia_valid = ATTR_CTIME | ATTR_MODE;
newattrs.ia_mode = mode;
if (whiteout_dentry->d_inode->i_size != 0) {
@@ -89,7 +90,8 @@
newattrs.ia_size = 0;
}
err = notify_change(whiteout_dentry, &newattrs);
- up(&whiteout_dentry->d_inode->i_sem);
+// up(&whiteout_dentry->d_inode->i_sem);
+ mutex_unlock(&whiteout_dentry->d_inode->i_mutex);
new_hidden_dentry = dtohd(dentry);
DGET(new_hidden_dentry);
@@ -581,10 +583,12 @@
err = PTR_ERR(whiteout_dentry);
goto out;
}
- down(&hidden_dentry->d_inode->i_sem);
+// down(&hidden_dentry->d_inode->i_sem);
+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
err = vfs_create(hidden_dentry->d_inode,
whiteout_dentry, 0600, NULL);
- up(&hidden_dentry->d_inode->i_sem);
+// up(&hidden_dentry->d_inode->i_sem);
+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
DPUT(whiteout_dentry);
if (err) {
diff -Nru unionfs-1.1.2/main.c unionfs-1.1.2.mod/main.c
--- unionfs-1.1.2/main.c 2006-01-25 22:58:11.000000000 +0100
+++ unionfs-1.1.2.mod/main.c 2006-02-07 11:41:30.000000000 +0100
@@ -99,7 +99,8 @@
}
}
- down(&inode->i_sem);
+// down(&inode->i_sem);
+ mutex_lock(&inode->i_mutex);
if (atomic_read(&inode->i_count) > 1)
goto skip;
@@ -168,7 +169,8 @@
fist_print_dentry("Leaving unionfs_interpose", dentry);
fist_print_inode("Leaving unionfs_interpose", inode);
- up(&inode->i_sem);
+ mutex_unlock(&inode->i_mutex);
+// up(&inode->i_sem);
out:
print_exit_status(err);
diff -Nru unionfs-1.1.2/persistent_inode.c unionfs-1.1.2.mod/persistent_inode.c
--- unionfs-1.1.2/persistent_inode.c 2006-01-25 22:58:11.000000000 +0100
+++ unionfs-1.1.2.mod/persistent_inode.c 2006-02-07 11:41:30.000000000 +0100
@@ -554,11 +554,13 @@
* create a new entry write it out to the file and return its index
*/
ino = spd->usi_next_avail++;
- down(&sb->s_lock);
+// down(&sb->s_lock);
+ mutex_lock(&sb->s_lock);
err = __write_uin(spd, ino, branchnum, inode_number);
if (err)
spd->usi_next_avail--;
- up(&sb->s_lock);
+// up(&sb->s_lock);
+ mutex_unlock(&sb->s_lock);
out:
print_exit_status((int)err);
if (!err)
diff -Nru unionfs-1.1.2/unionfs.h unionfs-1.1.2.mod/unionfs.h
--- unionfs-1.1.2/unionfs.h 2006-01-25 22:58:11.000000000 +0100
+++ unionfs-1.1.2.mod/unionfs.h 2006-02-07 11:41:30.000000000 +0100
@@ -811,13 +811,15 @@
{
struct dentry *dir = DGET(dentry->d_parent);
- down(&dir->d_inode->i_sem);
+// down(&dir->d_inode->i_sem);
+ mutex_lock(&dir->d_inode->i_mutex);
return dir;
}
static inline void unlock_dir(struct dentry *dir)
{
- up(&dir->d_inode->i_sem);
+// up(&dir->d_inode->i_sem);
+ mutex_unlock(&dir->d_inode->i_mutex);
DPUT(dir);
}
diff -Nru unionfs-1.1.2/unlink.c unionfs-1.1.2.mod/unlink.c
--- unionfs-1.1.2/unlink.c 2006-01-25 22:58:11.000000000 +0100
+++ unionfs-1.1.2.mod/unlink.c 2006-02-07 11:41:30.000000000 +0100
@@ -159,7 +159,8 @@
err = PTR_ERR(hidden_wh_dentry);
goto out;
}
- down(&hidden_wh_dentry->d_inode->i_sem);
+// down(&hidden_wh_dentry->d_inode->i_sem);
+ mutex_lock(&hidden_wh_dentry->d_inode->i_mutex);
newattrs.ia_valid = ATTR_CTIME;
if (hidden_wh_dentry->d_inode->i_size != 0) {
newattrs.ia_valid |= ATTR_SIZE;
@@ -176,7 +177,8 @@
/* We discard this error, because the entry is whited out
* even if we fail here. */
notify_change(hidden_wh_dentry, &newattrs);
- up(&hidden_wh_dentry->d_inode->i_sem);
+// up(&hidden_wh_dentry->d_inode->i_sem);
+ mutex_unlock(&hidden_wh_dentry->d_inode->i_mutex);
DPUT(hidden_wh_dentry);
}
diff -Nru unionfs-1.1.2/xattr.c unionfs-1.1.2.mod/xattr.c
--- unionfs-1.1.2/xattr.c 2006-01-25 22:58:11.000000000 +0100
+++ unionfs-1.1.2.mod/xattr.c 2006-02-07 11:41:30.000000000 +0100
@@ -77,14 +77,16 @@
encoded_value = (char *)value;
- down(&hidden_dentry->d_inode->i_sem);
+// down(&hidden_dentry->d_inode->i_sem);
+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
/* lock_kernel() already done by caller. */
err =
hidden_dentry->d_inode->i_op->getxattr(hidden_dentry,
encoded_name,
encoded_value, size);
/* unlock_kernel() will be done by caller. */
- up(&hidden_dentry->d_inode->i_sem);
+// up(&hidden_dentry->d_inode->i_sem);
+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
}
@@ -112,12 +114,14 @@
name, (unsigned long)size, flags);
if (hidden_dentry->d_inode->i_op->setxattr) {
- down(&hidden_dentry->d_inode->i_sem);
+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
+// down(&hidden_dentry->d_inode->i_sem);
/* lock_kernel() already done by caller. */
err = hidden_dentry->d_inode->i_op->
setxattr(hidden_dentry, name, value, size, flags);
/* unlock_kernel() will be done by caller. */
- up(&hidden_dentry->d_inode->i_sem);
+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
+// up(&hidden_dentry->d_inode->i_sem);
}
unlock_dentry(dentry);
@@ -143,13 +147,15 @@
if (hidden_dentry->d_inode->i_op->removexattr) {
encoded_name = (char *)name;
- down(&hidden_dentry->d_inode->i_sem);
+// down(&hidden_dentry->d_inode->i_sem);
+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
/* lock_kernel() already done by caller. */
err =
hidden_dentry->d_inode->i_op->removexattr(hidden_dentry,
encoded_name);
/* unlock_kernel() will be done by caller. */
- up(&hidden_dentry->d_inode->i_sem);
+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
+// up(&hidden_dentry->d_inode->i_sem);
}
unlock_dentry(dentry);
@@ -173,13 +179,15 @@
if (hidden_dentry->d_inode->i_op->listxattr) {
encoded_list = list;
- down(&hidden_dentry->d_inode->i_sem);
+// down(&hidden_dentry->d_inode->i_sem);
+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
/* lock_kernel() already done by caller. */
err =
hidden_dentry->d_inode->i_op->listxattr(hidden_dentry,
encoded_list, size);
/* unlock_kernel() will be done by caller. */
- up(&hidden_dentry->d_inode->i_sem);
+// up(&hidden_dentry->d_inode->i_sem);
+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
}
unlock_dentry(dentry);
_______________________________________________
unionfs mailing list
[email protected]
http://www.fsl.cs.sunysb.edu/mailman/listinfo/unionfs