Commit 4e3b28b0 authored by Linus Torvalds's avatar Linus Torvalds

Merge http://oss.sgi.com:8090/xfs-linux-2.6

into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents ed5c27c6 a788a8ec
...@@ -818,13 +818,15 @@ xfs_ioctl( ...@@ -818,13 +818,15 @@ xfs_ioctl(
if (!capable(CAP_SYS_ADMIN)) if (!capable(CAP_SYS_ADMIN))
return -EPERM; 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; return 0;
case XFS_IOC_THAW: case XFS_IOC_THAW:
if (!capable(CAP_SYS_ADMIN)) if (!capable(CAP_SYS_ADMIN))
return -EPERM; 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; return 0;
case XFS_IOC_GOINGDOWN: { case XFS_IOC_GOINGDOWN: {
......
...@@ -339,16 +339,16 @@ linvfs_write_inode( ...@@ -339,16 +339,16 @@ linvfs_write_inode(
int sync) int sync)
{ {
vnode_t *vp = LINVFS_GET_VP(inode); vnode_t *vp = LINVFS_GET_VP(inode);
int error, flags = FLUSH_INODE; int error = 0, flags = FLUSH_INODE;
error = 0;
if (vp) { if (vp) {
vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address); vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address);
if (sync) if (sync)
flags |= FLUSH_SYNC; flags |= FLUSH_SYNC;
VOP_IFLUSH(vp, flags, error); VOP_IFLUSH(vp, flags, error);
} }
return error;
return -error;
} }
STATIC void STATIC void
...@@ -491,8 +491,14 @@ xfssyncd( ...@@ -491,8 +491,14 @@ xfssyncd(
break; break;
spin_lock(&vfsp->vfs_sync_lock); spin_lock(&vfsp->vfs_sync_lock);
if (!timeleft) { /*
timeleft = (xfs_syncd_centisecs * HZ) / 100; * We can get woken by laptop mode, to do a sync -
* that's the (only!) case where the list would be
* empty with time remaining.
*/
if (!timeleft || list_empty(&vfsp->vfs_sync_list)) {
if (!timeleft)
timeleft = (xfs_syncd_centisecs * HZ) / 100;
INIT_LIST_HEAD(&vfsp->vfs_sync_work.w_list); INIT_LIST_HEAD(&vfsp->vfs_sync_work.w_list);
list_add_tail(&vfsp->vfs_sync_work.w_list, list_add_tail(&vfsp->vfs_sync_work.w_list,
&vfsp->vfs_sync_list); &vfsp->vfs_sync_list);
...@@ -595,9 +601,10 @@ linvfs_sync_super( ...@@ -595,9 +601,10 @@ linvfs_sync_super(
if (unlikely(laptop_mode)) { if (unlikely(laptop_mode)) {
int prev_sync_seq = vfsp->vfs_sync_seq; int prev_sync_seq = vfsp->vfs_sync_seq;
/* /*
* The disk must be active because we're syncing. * The disk must be active because we're syncing.
* We schedule syncd now (now that the disk is * We schedule xfssyncd now (now that the disk is
* active) instead of later (when it might not be). * active) instead of later (when it might not be).
*/ */
wake_up_process(vfsp->vfs_sync_task); wake_up_process(vfsp->vfs_sync_task);
......
...@@ -216,4 +216,8 @@ extern void bhv_insert_all_vfsops(struct vfs *); ...@@ -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_all_vfsops(struct vfs *, int);
extern void bhv_remove_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__ */ #endif /* __XFS_VFS_H__ */
...@@ -590,9 +590,6 @@ xfs_fs_goingdown( ...@@ -590,9 +590,6 @@ xfs_fs_goingdown(
xfs_mount_t *mp, xfs_mount_t *mp,
__uint32_t inflags) __uint32_t inflags)
{ {
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
switch (inflags) { switch (inflags) {
case XFS_FSOP_GOING_FLAGS_DEFAULT: { case XFS_FSOP_GOING_FLAGS_DEFAULT: {
struct vfs *vfsp = XFS_MTOVFS(mp); struct vfs *vfsp = XFS_MTOVFS(mp);
...@@ -602,7 +599,7 @@ xfs_fs_goingdown( ...@@ -602,7 +599,7 @@ xfs_fs_goingdown(
xfs_force_shutdown(mp, XFS_FORCE_UMOUNT); xfs_force_shutdown(mp, XFS_FORCE_UMOUNT);
thaw_bdev(sb->s_bdev, sb); thaw_bdev(sb->s_bdev, sb);
} }
break; break;
} }
case XFS_FSOP_GOING_FLAGS_LOGFLUSH: case XFS_FSOP_GOING_FLAGS_LOGFLUSH:
......
...@@ -811,7 +811,7 @@ xfs_log_need_covered(xfs_mount_t *mp) ...@@ -811,7 +811,7 @@ xfs_log_need_covered(xfs_mount_t *mp)
xlog_t *log = mp->m_log; xlog_t *log = mp->m_log;
vfs_t *vfsp = XFS_MTOVFS(mp); 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)) (vfsp->vfs_flag & VFS_RDONLY))
return 0; return 0;
......
...@@ -131,7 +131,7 @@ xfs_trans_alloc( ...@@ -131,7 +131,7 @@ xfs_trans_alloc(
xfs_mount_t *mp, xfs_mount_t *mp,
uint type) 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); atomic_inc(&mp->m_active_trans);
return (_xfs_trans_alloc(mp, type)); return (_xfs_trans_alloc(mp, type));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment