I have been talking to Christoph Hellwig <hch@lst.de> on this and he has provided a patch that fixes this under my test scenarios (attached). Under the topic of severity I am wondering if this isn't possibly an issue for certain backup scenarios and utilities? When I search google for: xfs_freeze backup I get a number of pages explaining that xfs_freeze will flush so that a sane backup is achieved for the particular tool or utility. But if one cannot predict when the flush is complete, then it seems to me that a sane snapshot or backup may in fact not be achieved (ever a student, I'm open to new and better information on this). Incidentally, I have verified that this bug is not limited to the current Testing kernel, but also the latest 2.6 kernel in Unstable. -- Encrypted Mail Preferred: Key ID: 8527B9AF Key Fingerprint: E1B6 40B6 B73F 695E 0D3B 644E 6427 DD74 8527 B9AF Information: http://www.gnupg.org/ ASCII ribbon campaign: () against HTML email /\ against Microsoft attachments Information: http://www.expita.com/nomime.html
--- Begin Message ---
- To: David Everly <deckrider@gmail.com>
- Subject: Re: xfs_freeze returns before sync is complete
- From: Christoph Hellwig <hch@lst.de>
- Date: Fri, 13 May 2005 18:51:31 +0200
- Message-id: <20050513165131.GA18895@lst.de>
- In-reply-to: <20050512204115.GA18398@elbert.is-a-geek.org>
- References: <20050429175911.GC24012@elbert.is-a-geek.org> <20050511191740.GA10994@lst.de> <20050511202316.GA3391@elbert.is-a-geek.org> <20050512204115.GA18398@elbert.is-a-geek.org>
On Thu, May 12, 2005 at 02:41:15PM -0600, David Everly wrote: > Looks like my email was messed up and some messages got frozen, but you > should by now have my earlier message which I thought you had read > before sending me this. It should be dated May 9. > > Sorry for the confusion. And thanks again for looking at this. Soem more testing today. When I rm -rf /boot/grub before calling grub-install I can reproduce the issue pretty reliably. The two patches below (against 2.6.12-rc4) make flushing stronger and make freeze do exactly the same flushing as a mount -o ro. Can you give them a try?Index: linux-2.6/fs/xfs/linux-2.6/xfs_buf.c =================================================================== --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_buf.c 2005-05-09 18:34:39.801794184 +0200 +++ linux-2.6/fs/xfs/linux-2.6/xfs_buf.c 2005-05-13 18:22:56.215234608 +0200 @@ -1891,8 +1891,12 @@ xfs_buf_relse(pb); } - if (wait) + filemap_fdatawrite(target->pbr_mapping); + + if (wait) { blk_run_address_space(target->pbr_mapping); + filemap_fdatawait(target->pbr_mapping); + } return pincount; }Index: linux-2.6/fs/xfs/xfs_vfsops.c =================================================================== --- linux-2.6.orig/fs/xfs/xfs_vfsops.c 2005-05-12 12:14:46.037011184 +0200 +++ linux-2.6/fs/xfs/xfs_vfsops.c 2005-05-13 18:51:34.837829256 +0200 @@ -879,10 +879,35 @@ int flags, cred_t *credp) { - xfs_mount_t *mp; + xfs_mount_t *mp = XFS_BHVTOM(bdp); + struct vfs *vfsp = bhvtovfs(bdp); + + if (vfsp->vfs_super->s_frozen == SB_FREEZE_WRITE) { + int pincount = 0, count = 0; - mp = XFS_BHVTOM(bdp); - return (xfs_syncsub(mp, flags, 0, NULL)); + xfs_refcache_purge_mp(mp); + xfs_flush_buftarg(mp->m_ddev_targp, 0); + xfs_finish_reclaim_all(mp, 0); + + /* 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_syncsub(mp, REMOUNT_READONLY_FLAGS, 0, NULL); + pincount = xfs_flush_buftarg(mp->m_ddev_targp, 1); + if (!pincount) { + delay(50); + count++; + } + } while (count < 2); + + return 0; + } else + return (xfs_syncsub(mp, flags, 0, NULL)); } /* @@ -1939,7 +1964,7 @@ while (atomic_read(&mp->m_active_trans) > 0) delay(100); - /* Push the superblock and write an unmount record */ + /* Ok now write out an unmount record */ xfs_log_unmount_write(mp); xfs_unmountfs_writesb(mp); }
--- End Message ---
Attachment:
signature.asc
Description: Digital signature