Skip to contentSkip to conversation

VFS locking patch fails on 2.4.4

linux-lvm Ed Tomlinson 2 participants 3 messages Apr 28, 2001 – Apr 30, 2001 VFS

lore
Share & tools
lore
#0 lore raw

Hi,

The VFS locking patch fails on 2.4.4

oscar% cat ../LVM/linux-2.4.2-VFS-lock.patch | patch -p1 patching file drivers/md/lvm.c
Hunk #1 succeeded at 207 with fuzz 1 (offset 48 lines). patching file fs/buffer.c
Hunk #1 succeeded at 331 (offset 17 lines).
patching file fs/super.c
patching file include/linux/fs.h
Hunk #1 FAILED at 1093.
1 out of 1 hunk FAILED -- saving rejects to file include/linux/fs.h.rej patching file kernel/ksyms.c
Hunk #1 succeeded at 177 (offset 2 lines).

This worked with 2.4.4-pre8. This is not too important (yet) since reiserfs snapshots also have problems. They do not work with pre8. I get the same messages as previously reported (using debian sid).

I know the lvm is going thru a major paradyne shift but hope to be able to snapshot my reiserfs partn again soon.

TIA
Ed Tomlinson <[email protected]>

#1 lore raw
Quoted 16 lines · On Saturday, April 28, 2001 10:38:53 AM -0400 Ed Tomlinson <[email protected]>…

Hi,

The VFS locking patch fails on 2.4.4

oscar% cat ../LVM/linux-2.4.2-VFS-lock.patch | patch -p1 patching file drivers/md/lvm.c
Hunk #1 succeeded at 207 with fuzz 1 (offset 48 lines). patching file fs/buffer.c
Hunk #1 succeeded at 331 (offset 17 lines).
patching file fs/super.c
patching file include/linux/fs.h
Hunk #1 FAILED at 1093.
1 out of 1 hunk FAILED -- saving rejects to file include/linux/fs.h.rej patching file kernel/ksyms.c
Hunk #1 succeeded at 177 (offset 2 lines).

Quoted 3 lines

This worked with 2.4.4-pre8. This is not too important (yet) since reiserfs snapshots also have problems. They do not work with pre8. I get the same messages as previously reported (using debian sid).

Viro fixed some races in buffer.c. I'm updating the vfs locking patch now.

(just fyi so the the lvm guys don't duplicate effort ;-)

-chris

#2 lore raw
In reply to Ed Tomlinson

The only rejects were in fs.h, but here is a new patch against 2.4.4

drivers/md/lvm.c +1 -1
diff -Nru a/drivers/md/lvm.c b/drivers/md/lvm.c
@@ -207,7 +207,7 @@
 #define LOCAL_END_REQUEST
 
 /* lvm_do_lv_create calls fsync_dev_lockfs()/unlockfs() */
-/* #define	LVM_VFS_ENHANCEMENT */
+#define	LVM_VFS_ENHANCEMENT
 
 #include <linux/config.h>
 #include <linux/module.h>
fs/buffer.c +22 -0
diff -Nru a/fs/buffer.c b/fs/buffer.c
@@ -331,6 +331,28 @@
 	return sync_buffers(dev, 1);
 }
 
+int fsync_dev_lockfs(kdev_t dev)
+{
+	sync_buffers(dev, 0);
+
+	lock_kernel();
+	sync_supers(dev);
+	/* note, the FS might need to start transactions to 
+	** sync the inodes, or the quota, no locking until
+	** after these are done
+	*/
+	sync_inodes(dev);
+	DQUOT_SYNC(dev);
+	/* if inodes or quotas could be dirtied during the
+	** sync_supers_lockfs call, the FS is responsible for getting
+	** them on disk, without deadlocking against the lock
+	*/
+	sync_supers_lockfs(dev) ;
+	unlock_kernel();
+
+	return sync_buffers(dev, 1) ;
+}
+
 asmlinkage long sys_sync(void)
 {
 	fsync_dev(0);
fs/super.c +40 -0
diff -Nru a/fs/super.c b/fs/super.c
@@ -630,6 +630,46 @@
 	}
 }
 
+/*
+ * Note: don't check the dirty flag before waiting, we want the lock
+ * to happen every time this is called.
+ */
+void sync_supers_lockfs(kdev_t dev)
+{
+	struct super_block * sb;
+
+	for (sb = sb_entry(super_blocks.next);
+	     sb != sb_entry(&super_blocks); 
+	     sb = sb_entry(sb->s_list.next)) {
+		if (!sb->s_dev)
+			continue;
+		if (dev && sb->s_dev != dev)
+			continue;
+		lock_super(sb);
+		if (sb->s_dev && (!dev || dev == sb->s_dev))
+			if (sb->s_op && sb->s_op->write_super_lockfs)
+				sb->s_op->write_super_lockfs(sb);
+		unlock_super(sb);
+	}
+}
+
+void unlockfs(kdev_t dev)
+{
+	struct super_block * sb;
+
+	for (sb = sb_entry(super_blocks.next);
+	     sb != sb_entry(&super_blocks); 
+	     sb = sb_entry(sb->s_list.next)) {
+		if (!sb->s_dev)
+			continue;
+		if (dev && sb->s_dev != dev)
+			continue;
+		if (sb->s_dev && (!dev || dev == sb->s_dev))
+			if (sb->s_op && sb->s_op->unlockfs)
+				sb->s_op->unlockfs(sb);
+	}
+}
+
 /**
  *	get_super	-	get the superblock of a device
  *	@dev: device to get the superblock for
include/linux/fs.h +3 -0
diff -Nru a/include/linux/fs.h b/include/linux/fs.h
@@ -1107,6 +1107,7 @@
 extern void write_inode_now(struct inode *, int);
 extern void sync_dev(kdev_t);
 extern int fsync_dev(kdev_t);
+extern int fsync_dev_lockfs(kdev_t);
 extern int fsync_super(struct super_block *);
 extern void sync_inodes_sb(struct super_block *);
 extern int osync_inode_buffers(struct inode *);
@@ -1117,6 +1118,8 @@
 extern void filemap_fdatasync(struct address_space *);
 extern void filemap_fdatawait(struct address_space *);
 extern void sync_supers(kdev_t);
+extern void sync_supers_lockfs(kdev_t);
+extern void unlockfs(kdev_t);
 extern int bmap(struct inode *, int);
 extern int notify_change(struct dentry *, struct iattr *);
 extern int permission(struct inode *, int);
kernel/ksyms.c +2 -0
diff -Nru a/kernel/ksyms.c b/kernel/ksyms.c
@@ -179,6 +179,8 @@
 EXPORT_SYMBOL(invalidate_inode_pages);
 EXPORT_SYMBOL(truncate_inode_pages);
 EXPORT_SYMBOL(fsync_dev);
+EXPORT_SYMBOL(fsync_dev_lockfs);
+EXPORT_SYMBOL(unlockfs);
 EXPORT_SYMBOL(permission);
 EXPORT_SYMBOL(vfs_permission);
 EXPORT_SYMBOL(inode_setattr);