head 1.2; access; symbols perseant-exfatfs-base-20250801:1.2 perseant-exfatfs-base-20240630:1.2 perseant-exfatfs:1.2.0.26 perseant-exfatfs-base:1.2 cjep_sun2x:1.2.0.24 cjep_sun2x-base:1.2 cjep_staticlib_x-base1:1.2 cjep_staticlib_x:1.2.0.22 cjep_staticlib_x-base:1.2 phil-wifi-20200421:1.2 phil-wifi-20200411:1.2 phil-wifi-20200406:1.2 pgoyette-compat-merge-20190127:1.2 pgoyette-compat-20190127:1.2 pgoyette-compat-20190118:1.2 pgoyette-compat-1226:1.2 pgoyette-compat-1126:1.2 pgoyette-compat-1020:1.2 pgoyette-compat-0930:1.2 pgoyette-compat-0906:1.2 pgoyette-compat-0728:1.2 pgoyette-compat-0625:1.2 pgoyette-compat-0521:1.2 pgoyette-compat-0502:1.2 pgoyette-compat-0422:1.2 pgoyette-compat-0415:1.2 pgoyette-compat-0407:1.2 pgoyette-compat-0330:1.2 pgoyette-compat-0322:1.2 pgoyette-compat-0315:1.2 pgoyette-compat:1.2.0.20 pgoyette-compat-base:1.2 perseant-stdc-iso10646:1.2.0.18 perseant-stdc-iso10646-base:1.2 prg-localcount2-base3:1.2 prg-localcount2-base2:1.2 prg-localcount2-base1:1.2 prg-localcount2:1.2.0.16 prg-localcount2-base:1.2 pgoyette-localcount-20170426:1.2 bouyer-socketcan-base1:1.2 pgoyette-localcount-20170320:1.2 bouyer-socketcan:1.2.0.14 bouyer-socketcan-base:1.2 pgoyette-localcount-20170107:1.2 pgoyette-localcount-20161104:1.2 localcount-20160914:1.2 pgoyette-localcount-20160806:1.2 pgoyette-localcount-20160726:1.2 pgoyette-localcount:1.2.0.12 pgoyette-localcount-base:1.2 netbsd-5-2-3-RELEASE:1.1.1.1.8.1 netbsd-5-1-5-RELEASE:1.1.1.1.8.1 yamt-pagecache-base9:1.2 yamt-pagecache-tag8:1.2 tls-earlyentropy:1.2.0.8 tls-earlyentropy-base:1.2 riastradh-xf86-video-intel-2-7-1-pre-2-21-15:1.2 riastradh-drm2-base3:1.2 netbsd-5-2-2-RELEASE:1.1.1.1.8.1 netbsd-5-1-4-RELEASE:1.1.1.1.8.1 netbsd-5-2-1-RELEASE:1.1.1.1.8.1 netbsd-5-1-3-RELEASE:1.1.1.1.8.1 agc-symver:1.2.0.10 agc-symver-base:1.2 tls-maxphys-base:1.2 yamt-pagecache-base8:1.2 netbsd-5-2:1.1.1.1.8.1.0.6 yamt-pagecache-base7:1.2 netbsd-5-2-RELEASE:1.1.1.1.8.1 netbsd-5-2-RC1:1.1.1.1.8.1 yamt-pagecache-base6:1.2 yamt-pagecache-base5:1.2 yamt-pagecache-base4:1.2 netbsd-5-1-2-RELEASE:1.1.1.1.8.1 netbsd-5-1-1-RELEASE:1.1.1.1.8.1 yamt-pagecache-base3:1.2 yamt-pagecache-base2:1.2 yamt-pagecache:1.2.0.6 yamt-pagecache-base:1.2 bouyer-quota2-nbase:1.2 bouyer-quota2:1.2.0.4 bouyer-quota2-base:1.2 matt-nb5-pq3:1.1.1.1.8.1.0.4 matt-nb5-pq3-base:1.1.1.1.8.1 netbsd-5-1:1.1.1.1.8.1.0.2 netbsd-5-1-RELEASE:1.1.1.1.8.1 netbsd-5-1-RC4:1.1.1.1.8.1 netbsd-5-1-RC3:1.1.1.1.8.1 netbsd-5-1-RC2:1.1.1.1.8.1 netbsd-5-1-RC1:1.1.1.1.8.1 netbsd-5-0-2-RELEASE:1.1.1.1 matt-nb5-mips64-premerge-20091211:1.1.1.1 matt-nb5-mips64-u2-k2-k4-k7-k8-k9:1.1.1.1 matt-nb4-mips64-k7-u2a-k9b:1.1.1.1 matt-nb5-mips64-u1-k1-k5:1.1.1.1 matt-nb5-mips64:1.1.1.1.0.12 netbsd-5-0-1-RELEASE:1.1.1.1 jym-xensuspend-nbase:1.2 netbsd-5-0:1.1.1.1.0.10 netbsd-5-0-RELEASE:1.1.1.1 netbsd-5-0-RC4:1.1.1.1 netbsd-5-0-RC3:1.1.1.1 netbsd-5-0-RC2:1.1.1.1 jym-xensuspend:1.2.0.2 jym-xensuspend-base:1.2 netbsd-5-0-RC1:1.1.1.1 haad-dm-base2:1.1.1.1 haad-nbase2:1.1.1.1 netbsd-5:1.1.1.1.0.8 netbsd-5-base:1.1.1.1 matt-mips64-base2:1.1.1.1 haad-dm-base1:1.1.1.1 wrstuden-revivesa-base-3:1.1.1.1 wrstuden-revivesa:1.1.1.1.0.4 wrstuden-revivesa-base-2:1.1.1.1 haad-dm:1.1.1.1.0.2 haad-dm-base:1.1.1.1 libdevmapper-1-02-27:1.1.1.1 FSF:1.1.1; locks; strict; comment @# @; 1.2 date 2008.12.22.01.07.18; author haad; state dead; branches; next 1.1; 1.1 date 2008.07.15.13.52.02; author haad; state Exp; branches 1.1.1.1; next ; 1.1.1.1 date 2008.07.15.13.52.02; author haad; state Exp; branches 1.1.1.1.2.1 1.1.1.1.4.1 1.1.1.1.8.1 1.1.1.1.12.1; next ; 1.1.1.1.2.1 date 2008.07.15.13.52.02; author haad; state dead; branches; next 1.1.1.1.2.2; 1.1.1.1.2.2 date 2008.12.16.01.27.01; author haad; state dead; branches; next ; 1.1.1.1.4.1 date 2008.07.15.13.52.02; author wrstuden; state dead; branches; next 1.1.1.1.4.2; 1.1.1.1.4.2 date 2008.09.18.05.17.11; author wrstuden; state Exp; branches; next ; 1.1.1.1.8.1 date 2010.01.20.05.13.25; author snj; state dead; branches; next ; 1.1.1.1.12.1 date 2010.04.21.05.23.14; author matt; state dead; branches; next ; desc @@ 1.2 log @Remove broken merged sources of haad-dm. lvm2tools are now in gpl2/lvm2 and libdevmapper is not needed anymore. @ text @diff -ruN linux-2.4.20/drivers/md/lvm.c linux/drivers/md/lvm.c --- linux-2.4.20/drivers/md/lvm.c Fri Jan 10 16:34:50 2003 +++ linux/drivers/md/lvm.c Wed Mar 26 15:36:34 2003 @@@@ -229,9 +229,6 @@@@ #define DEVICE_OFF(device) #define LOCAL_END_REQUEST -/* lvm_do_lv_create calls fsync_dev_lockfs()/unlockfs() */ -/* #define LVM_VFS_ENHANCEMENT */ - #include #include #include @@@@ -2171,12 +2168,8 @@@@ if (lv_ptr->lv_access & LV_SNAPSHOT) { lv_t *org = lv_ptr->lv_snapshot_org, *last; - /* sync the original logical volume */ - fsync_dev(org->lv_dev); -#ifdef LVM_VFS_ENHANCEMENT /* VFS function call to sync and lock the filesystem */ fsync_dev_lockfs(org->lv_dev); -#endif down_write(&org->lv_lock); org->lv_access |= LV_SNAPSHOT_ORG; @@@@ -2201,11 +2194,9 @@@@ else set_device_ro(lv_ptr->lv_dev, 1); -#ifdef LVM_VFS_ENHANCEMENT /* VFS function call to unlock the filesystem */ if (lv_ptr->lv_access & LV_SNAPSHOT) unlockfs(lv_ptr->lv_snapshot_org->lv_dev); -#endif lvm_gendisk.part[MINOR(lv_ptr->lv_dev)].de = lvm_fs_create_lv(vg_ptr, lv_ptr); diff -ruN linux-2.4.20/fs/buffer.c linux/fs/buffer.c --- linux-2.4.20/fs/buffer.c Fri Jan 10 16:35:24 2003 +++ linux/fs/buffer.c Wed Mar 26 15:36:34 2003 @@@@ -361,6 +361,38 @@@@ fsync_dev(dev); } +int fsync_dev_lockfs(kdev_t dev) +{ + /* you are not allowed to try locking all the filesystems + ** on the system, your chances of getting through without + ** total deadlock are slim to none. + */ + if (!dev) + return fsync_dev(dev) ; + + sync_buffers(dev, 0); + + lock_kernel(); + /* 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); +#ifdef DQUOT_SYNC_DEV + DQUOT_SYNC_DEV(dev); +#else + DQUOT_SYNC(dev); +#endif + /* 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); diff -ruN linux-2.4.20/fs/reiserfs/super.c linux/fs/reiserfs/super.c --- linux-2.4.20/fs/reiserfs/super.c Fri Jan 10 16:35:32 2003 +++ linux/fs/reiserfs/super.c Wed Mar 26 15:36:34 2003 @@@@ -44,7 +44,7 @@@@ reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s), 1); journal_mark_dirty(&th, s, SB_BUFFER_WITH_SB (s)); reiserfs_block_writes(&th) ; - journal_end(&th, s, 1) ; + journal_end_sync(&th, s, 1) ; } s->s_dirt = dirty; unlock_kernel() ; diff -ruN linux-2.4.20/fs/super.c linux/fs/super.c --- linux-2.4.20/fs/super.c Fri Jan 10 16:35:25 2003 +++ linux/fs/super.c Wed Mar 26 15:36:34 2003 @@@@ -37,6 +37,13 @@@@ LIST_HEAD(super_blocks); spinlock_t sb_lock = SPIN_LOCK_UNLOCKED; +/* + * lock/unlockfs grab a read lock on s_umount, but you need this lock to + * make sure no lockfs runs are in progress before inserting/removing + * supers from the list. + */ +static DECLARE_MUTEX(lockfs_sem); + /* * Handling of filesystem drivers list. * Rules: @@@@ -431,6 +438,19 @@@@ put_super(sb); } +static void write_super_lockfs(struct super_block *sb) +{ + lock_super(sb); + if (sb->s_root && sb->s_op) { + if (sb->s_dirt && sb->s_op->write_super) + sb->s_op->write_super(sb); + if (sb->s_op->write_super_lockfs) { + sb->s_op->write_super_lockfs(sb); + } + } + unlock_super(sb); +} + static inline void write_super(struct super_block *sb) { lock_super(sb); @@@@ -474,6 +494,39 @@@@ spin_unlock(&sb_lock); } +/* + * Note: don't check the dirty flag before waiting, we want the lock + * to happen every time this is called. dev must be non-zero + */ +void sync_supers_lockfs(kdev_t dev) +{ + struct super_block * sb; + + down(&lockfs_sem) ; + if (dev) { + sb = get_super(dev); + if (sb) { + write_super_lockfs(sb); + drop_super(sb); + } + } +} + +void unlockfs(kdev_t dev) +{ + struct super_block * sb; + + if (dev) { + sb = get_super(dev); + if (sb) { + if (sb->s_op && sb->s_op->unlockfs) + sb->s_op->unlockfs(sb) ; + drop_super(sb); + } + } + up(&lockfs_sem) ; +} + /** * get_super - get the superblock of a device * @@dev: device to get the superblock for @@@@ -693,6 +746,7 @@@@ goto out1; error = -EBUSY; + down(&lockfs_sem); restart: spin_lock(&sb_lock); @@@@ -704,6 +758,7 @@@@ ((flags ^ old->s_flags) & MS_RDONLY)) { spin_unlock(&sb_lock); destroy_super(s); + up(&lockfs_sem); goto out1; } if (!grab_super(old)) @@@@ -711,12 +766,14 @@@@ destroy_super(s); blkdev_put(bdev, BDEV_FS); path_release(&nd); + up(&lockfs_sem); return old; } s->s_dev = dev; s->s_bdev = bdev; s->s_flags = flags; insert_super(s, fs_type); + up(&lockfs_sem); if (!fs_type->read_super(s, data, flags & MS_VERBOSE ? 1 : 0)) goto Einval; s->s_flags |= MS_ACTIVE; @@@@ -824,7 +881,10 @@@@ if (!deactivate_super(sb)) return; + down(&lockfs_sem); down_write(&sb->s_umount); + up(&lockfs_sem); + sb->s_root = NULL; /* Need to clean after the sucker */ if (fs->fs_flags & FS_LITTER) diff -ruN linux-2.4.20/include/linux/fs.h linux/include/linux/fs.h --- linux-2.4.20/include/linux/fs.h Fri Jan 10 16:35:55 2003 +++ linux/include/linux/fs.h Wed Mar 26 15:36:34 2003 @@@@ -1225,6 +1225,7 @@@@ extern int sync_buffers(kdev_t, 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 int fsync_no_super(kdev_t); extern void sync_inodes_sb(struct super_block *); @@@@ -1241,6 +1242,8 @@@@ extern int filemap_fdatasync(struct address_space *); extern int 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); diff -ruN linux-2.4.20/kernel/ksyms.c linux/kernel/ksyms.c --- linux-2.4.20/kernel/ksyms.c Fri Jan 10 16:36:02 2003 +++ linux/kernel/ksyms.c Wed Mar 26 15:36:34 2003 @@@@ -184,6 +184,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(fsync_no_super); EXPORT_SYMBOL(permission); EXPORT_SYMBOL(vfs_permission); @ 1.1 log @Initial revision @ text @@ 1.1.1.1 log @version 1.02.27-cvs @ text @@ 1.1.1.1.2.1 log @file linux-2.4.20-VFS-lock.patch was added on branch haad-dm on 2008-12-16 01:27:01 +0000 @ text @d1 243 @ 1.1.1.1.2.2 log @Remove libdevmaper code, lvm2tools are now distributed with libdevmapper source inside. @ text @@ 1.1.1.1.12.1 log @sync to netbsd-5 @ text @@ 1.1.1.1.8.1 log @Remove obsolete LVM sources, as requested by tron in ticket 1211. @ text @@ 1.1.1.1.4.1 log @file linux-2.4.20-VFS-lock.patch was added on branch wrstuden-revivesa on 2008-09-18 05:17:11 +0000 @ text @d1 243 @ 1.1.1.1.4.2 log @Sync with wrstuden-revivesa-base-2. @ text @a0 243 diff -ruN linux-2.4.20/drivers/md/lvm.c linux/drivers/md/lvm.c --- linux-2.4.20/drivers/md/lvm.c Fri Jan 10 16:34:50 2003 +++ linux/drivers/md/lvm.c Wed Mar 26 15:36:34 2003 @@@@ -229,9 +229,6 @@@@ #define DEVICE_OFF(device) #define LOCAL_END_REQUEST -/* lvm_do_lv_create calls fsync_dev_lockfs()/unlockfs() */ -/* #define LVM_VFS_ENHANCEMENT */ - #include #include #include @@@@ -2171,12 +2168,8 @@@@ if (lv_ptr->lv_access & LV_SNAPSHOT) { lv_t *org = lv_ptr->lv_snapshot_org, *last; - /* sync the original logical volume */ - fsync_dev(org->lv_dev); -#ifdef LVM_VFS_ENHANCEMENT /* VFS function call to sync and lock the filesystem */ fsync_dev_lockfs(org->lv_dev); -#endif down_write(&org->lv_lock); org->lv_access |= LV_SNAPSHOT_ORG; @@@@ -2201,11 +2194,9 @@@@ else set_device_ro(lv_ptr->lv_dev, 1); -#ifdef LVM_VFS_ENHANCEMENT /* VFS function call to unlock the filesystem */ if (lv_ptr->lv_access & LV_SNAPSHOT) unlockfs(lv_ptr->lv_snapshot_org->lv_dev); -#endif lvm_gendisk.part[MINOR(lv_ptr->lv_dev)].de = lvm_fs_create_lv(vg_ptr, lv_ptr); diff -ruN linux-2.4.20/fs/buffer.c linux/fs/buffer.c --- linux-2.4.20/fs/buffer.c Fri Jan 10 16:35:24 2003 +++ linux/fs/buffer.c Wed Mar 26 15:36:34 2003 @@@@ -361,6 +361,38 @@@@ fsync_dev(dev); } +int fsync_dev_lockfs(kdev_t dev) +{ + /* you are not allowed to try locking all the filesystems + ** on the system, your chances of getting through without + ** total deadlock are slim to none. + */ + if (!dev) + return fsync_dev(dev) ; + + sync_buffers(dev, 0); + + lock_kernel(); + /* 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); +#ifdef DQUOT_SYNC_DEV + DQUOT_SYNC_DEV(dev); +#else + DQUOT_SYNC(dev); +#endif + /* 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); diff -ruN linux-2.4.20/fs/reiserfs/super.c linux/fs/reiserfs/super.c --- linux-2.4.20/fs/reiserfs/super.c Fri Jan 10 16:35:32 2003 +++ linux/fs/reiserfs/super.c Wed Mar 26 15:36:34 2003 @@@@ -44,7 +44,7 @@@@ reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s), 1); journal_mark_dirty(&th, s, SB_BUFFER_WITH_SB (s)); reiserfs_block_writes(&th) ; - journal_end(&th, s, 1) ; + journal_end_sync(&th, s, 1) ; } s->s_dirt = dirty; unlock_kernel() ; diff -ruN linux-2.4.20/fs/super.c linux/fs/super.c --- linux-2.4.20/fs/super.c Fri Jan 10 16:35:25 2003 +++ linux/fs/super.c Wed Mar 26 15:36:34 2003 @@@@ -37,6 +37,13 @@@@ LIST_HEAD(super_blocks); spinlock_t sb_lock = SPIN_LOCK_UNLOCKED; +/* + * lock/unlockfs grab a read lock on s_umount, but you need this lock to + * make sure no lockfs runs are in progress before inserting/removing + * supers from the list. + */ +static DECLARE_MUTEX(lockfs_sem); + /* * Handling of filesystem drivers list. * Rules: @@@@ -431,6 +438,19 @@@@ put_super(sb); } +static void write_super_lockfs(struct super_block *sb) +{ + lock_super(sb); + if (sb->s_root && sb->s_op) { + if (sb->s_dirt && sb->s_op->write_super) + sb->s_op->write_super(sb); + if (sb->s_op->write_super_lockfs) { + sb->s_op->write_super_lockfs(sb); + } + } + unlock_super(sb); +} + static inline void write_super(struct super_block *sb) { lock_super(sb); @@@@ -474,6 +494,39 @@@@ spin_unlock(&sb_lock); } +/* + * Note: don't check the dirty flag before waiting, we want the lock + * to happen every time this is called. dev must be non-zero + */ +void sync_supers_lockfs(kdev_t dev) +{ + struct super_block * sb; + + down(&lockfs_sem) ; + if (dev) { + sb = get_super(dev); + if (sb) { + write_super_lockfs(sb); + drop_super(sb); + } + } +} + +void unlockfs(kdev_t dev) +{ + struct super_block * sb; + + if (dev) { + sb = get_super(dev); + if (sb) { + if (sb->s_op && sb->s_op->unlockfs) + sb->s_op->unlockfs(sb) ; + drop_super(sb); + } + } + up(&lockfs_sem) ; +} + /** * get_super - get the superblock of a device * @@dev: device to get the superblock for @@@@ -693,6 +746,7 @@@@ goto out1; error = -EBUSY; + down(&lockfs_sem); restart: spin_lock(&sb_lock); @@@@ -704,6 +758,7 @@@@ ((flags ^ old->s_flags) & MS_RDONLY)) { spin_unlock(&sb_lock); destroy_super(s); + up(&lockfs_sem); goto out1; } if (!grab_super(old)) @@@@ -711,12 +766,14 @@@@ destroy_super(s); blkdev_put(bdev, BDEV_FS); path_release(&nd); + up(&lockfs_sem); return old; } s->s_dev = dev; s->s_bdev = bdev; s->s_flags = flags; insert_super(s, fs_type); + up(&lockfs_sem); if (!fs_type->read_super(s, data, flags & MS_VERBOSE ? 1 : 0)) goto Einval; s->s_flags |= MS_ACTIVE; @@@@ -824,7 +881,10 @@@@ if (!deactivate_super(sb)) return; + down(&lockfs_sem); down_write(&sb->s_umount); + up(&lockfs_sem); + sb->s_root = NULL; /* Need to clean after the sucker */ if (fs->fs_flags & FS_LITTER) diff -ruN linux-2.4.20/include/linux/fs.h linux/include/linux/fs.h --- linux-2.4.20/include/linux/fs.h Fri Jan 10 16:35:55 2003 +++ linux/include/linux/fs.h Wed Mar 26 15:36:34 2003 @@@@ -1225,6 +1225,7 @@@@ extern int sync_buffers(kdev_t, 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 int fsync_no_super(kdev_t); extern void sync_inodes_sb(struct super_block *); @@@@ -1241,6 +1242,8 @@@@ extern int filemap_fdatasync(struct address_space *); extern int 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); diff -ruN linux-2.4.20/kernel/ksyms.c linux/kernel/ksyms.c --- linux-2.4.20/kernel/ksyms.c Fri Jan 10 16:36:02 2003 +++ linux/kernel/ksyms.c Wed Mar 26 15:36:34 2003 @@@@ -184,6 +184,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(fsync_no_super); EXPORT_SYMBOL(permission); EXPORT_SYMBOL(vfs_permission); @