Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 124835
b: refs/heads/master
c: 76bf105
h: refs/heads/master
i:
  124833: 2dc0284
  124831: 67ad61a
v: v3
  • Loading branch information
David Chinner authored and Lachlan McIlroy committed Oct 30, 2008
1 parent 6dbe532 commit 4eed00b
Show file tree
Hide file tree
Showing 6 changed files with 60 additions and 60 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a4e4c4f4a8f9376158f8181a75285091f52a79e3
refs/heads/master: 76bf105cb16da6c847a13a3c77dc962ba1081713
6 changes: 3 additions & 3 deletions trunk/fs/xfs/linux-2.6/xfs_super.c
Original file line number Diff line number Diff line change
Expand Up @@ -1212,7 +1212,7 @@ xfs_fs_remount(
/* rw -> ro */
if (!(mp->m_flags & XFS_MOUNT_RDONLY) && (*flags & MS_RDONLY)) {
xfs_quiesce_data(mp);
xfs_attr_quiesce(mp);
xfs_quiesce_attr(mp);
mp->m_flags |= XFS_MOUNT_RDONLY;
}

Expand All @@ -1221,7 +1221,7 @@ xfs_fs_remount(

/*
* Second stage of a freeze. The data is already frozen so we only
* need to take care of themetadata. Once that's done write a dummy
* need to take care of the metadata. Once that's done write a dummy
* record to dirty the log in case of a crash while frozen.
*/
STATIC void
Expand All @@ -1230,7 +1230,7 @@ xfs_fs_lockfs(
{
struct xfs_mount *mp = XFS_M(sb);

xfs_attr_quiesce(mp);
xfs_quiesce_attr(mp);
xfs_fs_log_dummy(mp);
}

Expand Down
55 changes: 55 additions & 0 deletions trunk/fs/xfs/linux-2.6/xfs_sync.c
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,61 @@ xfs_quiesce_data(
return error;
}

STATIC void
xfs_quiesce_fs(
struct xfs_mount *mp)
{
int count = 0, pincount;

xfs_flush_buftarg(mp->m_ddev_targp, 0);
xfs_finish_reclaim_all(mp, 0, XFS_IFLUSH_DELWRI_ELSE_ASYNC);

/*
* This loop must run at least twice. The first instance of the loop
* will flush most meta data but that will generate more meta data
* (typically directory updates). Which then must be flushed and
* logged before we can write the unmount record.
*/
do {
xfs_sync_inodes(mp, SYNC_ATTR|SYNC_WAIT);
pincount = xfs_flush_buftarg(mp->m_ddev_targp, 1);
if (!pincount) {
delay(50);
count++;
}
} while (count < 2);
}

/*
* Second stage of a quiesce. The data is already synced, now we have to take
* care of the metadata. New transactions are already blocked, so we need to
* wait for any remaining transactions to drain out before proceding.
*/
void
xfs_quiesce_attr(
struct xfs_mount *mp)
{
int error = 0;

/* wait for all modifications to complete */
while (atomic_read(&mp->m_active_trans) > 0)
delay(100);

/* flush inodes and push all remaining buffers out to disk */
xfs_quiesce_fs(mp);

ASSERT_ALWAYS(atomic_read(&mp->m_active_trans) == 0);

/* Push the superblock and write an unmount record */
error = xfs_log_sbcount(mp, 1);
if (error)
xfs_fs_cmn_err(CE_WARN, mp,
"xfs_attr_quiesce: failed to log sb changes. "
"Frozen image may not be consistent.");
xfs_log_unmount_write(mp);
xfs_unmountfs_writesb(mp);
}

/*
* Enqueue a work item to be picked up by the vfs xfssyncd thread.
* Doing this has two advantages:
Expand Down
1 change: 1 addition & 0 deletions trunk/fs/xfs/linux-2.6/xfs_sync.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ int xfs_sync_inodes(struct xfs_mount *mp, int flags);
int xfs_sync_fsdata(struct xfs_mount *mp, int flags);

int xfs_quiesce_data(struct xfs_mount *mp);
void xfs_quiesce_attr(struct xfs_mount *mp);

void xfs_flush_inode(struct xfs_inode *ip);
void xfs_flush_device(struct xfs_inode *ip);
Expand Down
55 changes: 0 additions & 55 deletions trunk/fs/xfs/xfs_vfsops.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,61 +59,6 @@
#include "xfs_sync.h"


STATIC void
xfs_quiesce_fs(
xfs_mount_t *mp)
{
int count = 0, pincount;

xfs_flush_buftarg(mp->m_ddev_targp, 0);
xfs_finish_reclaim_all(mp, 0, XFS_IFLUSH_DELWRI_ELSE_ASYNC);

/*
* This loop must run at least twice. The first instance of the loop
* will flush most meta data but that will generate more meta data
* (typically directory updates). Which then must be flushed and
* logged before we can write the unmount record.
*/
do {
xfs_sync_inodes(mp, SYNC_ATTR|SYNC_WAIT);
pincount = xfs_flush_buftarg(mp->m_ddev_targp, 1);
if (!pincount) {
delay(50);
count++;
}
} while (count < 2);
}

/*
* Second stage of a quiesce. The data is already synced, now we have to take
* care of the metadata. New transactions are already blocked, so we need to
* wait for any remaining transactions to drain out before proceding.
*/
void
xfs_attr_quiesce(
xfs_mount_t *mp)
{
int error = 0;

/* wait for all modifications to complete */
while (atomic_read(&mp->m_active_trans) > 0)
delay(100);

/* flush inodes and push all remaining buffers out to disk */
xfs_quiesce_fs(mp);

ASSERT_ALWAYS(atomic_read(&mp->m_active_trans) == 0);

/* Push the superblock and write an unmount record */
error = xfs_log_sbcount(mp, 1);
if (error)
xfs_fs_cmn_err(CE_WARN, mp,
"xfs_attr_quiesce: failed to log sb changes. "
"Frozen image may not be consistent.");
xfs_log_unmount_write(mp);
xfs_unmountfs_writesb(mp);
}

/*
* xfs_unmount_flush implements a set of flush operation on special
* inodes, which are needed as a separate set of operations so that
Expand Down
1 change: 0 additions & 1 deletion trunk/fs/xfs/xfs_vfsops.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,5 @@ struct xfs_mount_args;

void xfs_do_force_shutdown(struct xfs_mount *mp, int flags, char *fname,
int lnnum);
void xfs_attr_quiesce(struct xfs_mount *mp);

#endif /* _XFS_VFSOPS_H */

0 comments on commit 4eed00b

Please sign in to comment.