]> git.hungrycats.org Git - linux/commitdiff
[XFS] fix a freeze/thaw deadlock
authorChristoph Hellwig <hch@sgi.com>
Wed, 13 Oct 2004 23:30:49 +0000 (09:30 +1000)
committerNathan Scott <nathans@sgi.com>
Wed, 13 Oct 2004 23:30:49 +0000 (09:30 +1000)
Signed-off-by: Nathan Scott <nathans@sgi.com>
fs/xfs/linux-2.6/xfs_ioctl.c
fs/xfs/linux-2.6/xfs_vfs.h
fs/xfs/xfs_fsops.c
fs/xfs/xfs_log.c
fs/xfs/xfs_trans.c

index ef764054fcdf4bdbab2e0f15dc943e10ac6f7bdd..a5d382cff479a1730ac3a85b08e0989e2b69dc5d 100644 (file)
@@ -818,13 +818,15 @@ xfs_ioctl(
                if (!capable(CAP_SYS_ADMIN))
                        return -EPERM;
 
-               freeze_bdev(inode->i_sb->s_bdev);
+               if (inode->i_sb->s_frozen == SB_UNFROZEN)
+                       freeze_bdev(inode->i_sb->s_bdev);
                return 0;
 
        case XFS_IOC_THAW:
                if (!capable(CAP_SYS_ADMIN))
                        return -EPERM;
-               thaw_bdev(inode->i_sb->s_bdev, inode->i_sb);
+               if (inode->i_sb->s_frozen != SB_UNFROZEN)
+                       thaw_bdev(inode->i_sb->s_bdev, inode->i_sb);
                return 0;
 
        case XFS_IOC_GOINGDOWN: {
index 4de833f99ee377fc317a5627fa6db55ad3d947dd..aab70136c4e89cec72988d5626d79eafe0434869 100644 (file)
@@ -216,4 +216,8 @@ extern void bhv_insert_all_vfsops(struct vfs *);
 extern void bhv_remove_all_vfsops(struct vfs *, int);
 extern void bhv_remove_vfsops(struct vfs *, int);
 
+#define fs_frozen(vfsp)                ((vfsp)->vfs_super->s_frozen)
+#define fs_check_frozen(vfsp, level) \
+       vfs_check_frozen(vfsp->vfs_super, level);
+
 #endif /* __XFS_VFS_H__ */
index 4e4e966d17ac36d1e73290d4c41fa54e371b9092..ebc2f27ce9e1b0a228d2d12c28b5b043e927c75d 100644 (file)
@@ -590,9 +590,6 @@ xfs_fs_goingdown(
        xfs_mount_t     *mp,
        __uint32_t      inflags)
 {
-       if (!capable(CAP_SYS_ADMIN))
-               return -EPERM;
-
        switch (inflags) {
        case XFS_FSOP_GOING_FLAGS_DEFAULT: {
                struct vfs *vfsp = XFS_MTOVFS(mp);
@@ -602,7 +599,7 @@ xfs_fs_goingdown(
                        xfs_force_shutdown(mp, XFS_FORCE_UMOUNT);
                        thaw_bdev(sb->s_bdev, sb);
                }
-
+       
                break;
        }
        case XFS_FSOP_GOING_FLAGS_LOGFLUSH:
index 58117edbbc2fb84622c61b036ad7b7243229de10..7db33af12520b4b1903607c0e0a86bd3c8ce9163 100644 (file)
@@ -811,7 +811,7 @@ xfs_log_need_covered(xfs_mount_t *mp)
        xlog_t          *log = mp->m_log;
        vfs_t           *vfsp = XFS_MTOVFS(mp);
 
-       if (vfsp->vfs_super->s_frozen || XFS_FORCED_SHUTDOWN(mp) ||
+       if (fs_frozen(vfsp) || XFS_FORCED_SHUTDOWN(mp) ||
            (vfsp->vfs_flag & VFS_RDONLY))
                return 0;
 
index c2bbc9a2c8b8faa0714a7b1177334606e7cfbf2b..3db0e22007759c076b0ed561270203af3dedd026 100644 (file)
@@ -131,7 +131,7 @@ xfs_trans_alloc(
        xfs_mount_t     *mp,
        uint            type)
 {
-       vfs_check_frozen(XFS_MTOVFS(mp)->vfs_super, SB_FREEZE_TRANS);
+       fs_check_frozen(XFS_MTOVFS(mp), SB_FREEZE_TRANS);
        atomic_inc(&mp->m_active_trans);
 
        return (_xfs_trans_alloc(mp, type));