summaryrefslogtreecommitdiffstats
path: root/sys/ufs/ffs
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2008-09-16 11:51:06 +0000
committerkib <kib@FreeBSD.org>2008-09-16 11:51:06 +0000
commitf6863a9ef79ec34cd371070704d592a2b5c019c1 (patch)
tree916cd048737fbe3376fc7973f694d424abd09e34 /sys/ufs/ffs
parent0488506405edd848b205c59066a7f0b5d53e55e7 (diff)
downloadFreeBSD-src-f6863a9ef79ec34cd371070704d592a2b5c019c1.zip
FreeBSD-src-f6863a9ef79ec34cd371070704d592a2b5c019c1.tar.gz
When attempt is made to suspend a filesystem that is already syspended,
wait until the current suspension is lifted instead of silently returning success immediately. The consequences of calling vfs_write() resume when not owning the suspension are not well-defined at best. Add the vfs_susp_clean() mount method to be called from vfs_write_resume(). Set it to process_deferred_inactive() for ffs, and stop calling it manually. Add the thread flag TDP_IGNSUSP that allows to bypass the suspension point in the vn_start_write. It is intended for use by VFS in the situations where the suspender want to do some i/o requiring calls to vn_start_write(), and this i/o cannot be done later. Reviewed by: tegge In collaboration with: pho MFC after: 1 month
Diffstat (limited to 'sys/ufs/ffs')
-rw-r--r--sys/ufs/ffs/ffs_extern.h1
-rw-r--r--sys/ufs/ffs/ffs_snapshot.c7
-rw-r--r--sys/ufs/ffs/ffs_vfsops.c1
3 files changed, 7 insertions, 2 deletions
diff --git a/sys/ufs/ffs/ffs_extern.h b/sys/ufs/ffs/ffs_extern.h
index d5dfa12..4a2f3a2 100644
--- a/sys/ufs/ffs/ffs_extern.h
+++ b/sys/ufs/ffs/ffs_extern.h
@@ -80,6 +80,7 @@ void ffs_snapremove(struct vnode *vp);
int ffs_snapshot(struct mount *mp, char *snapfile);
void ffs_snapshot_mount(struct mount *mp);
void ffs_snapshot_unmount(struct mount *mp);
+void process_deferred_inactive(struct mount *mp);
int ffs_syncvnode(struct vnode *vp, int waitfor);
int ffs_truncate(struct vnode *, off_t, int, struct ucred *, struct thread *);
int ffs_update(struct vnode *, int);
diff --git a/sys/ufs/ffs/ffs_snapshot.c b/sys/ufs/ffs/ffs_snapshot.c
index c367d66..fab6798 100644
--- a/sys/ufs/ffs/ffs_snapshot.c
+++ b/sys/ufs/ffs/ffs_snapshot.c
@@ -167,7 +167,6 @@ static int snapacct_ufs2(struct vnode *, ufs2_daddr_t *, ufs2_daddr_t *,
static int mapacct_ufs2(struct vnode *, ufs2_daddr_t *, ufs2_daddr_t *,
struct fs *, ufs_lbn_t, int);
static int readblock(struct vnode *vp, struct buf *, ufs2_daddr_t);
-static void process_deferred_inactive(struct mount *);
static void try_free_snapdata(struct vnode *devvp);
static struct snapdata *ffs_snapdata_acquire(struct vnode *devvp);
static int ffs_bp_snapblk(struct vnode *, struct buf *);
@@ -2375,12 +2374,14 @@ readblock(vp, bp, lbn)
return (bp->b_error);
}
+#endif
+
/*
* Process file deletes that were deferred by ufs_inactive() due to
* the file system being suspended. Transfer IN_LAZYACCESS into
* IN_MODIFIED for vnodes that were accessed during suspension.
*/
-static void
+void
process_deferred_inactive(struct mount *mp)
{
struct vnode *vp, *mvp;
@@ -2453,6 +2454,8 @@ process_deferred_inactive(struct mount *mp)
vn_finished_secondary_write(mp);
}
+#ifndef NO_FFS_SNAPSHOT
+
static struct snapdata *
ffs_snapdata_alloc(void)
{
diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c
index 93e0b48..86b3f60 100644
--- a/sys/ufs/ffs/ffs_vfsops.c
+++ b/sys/ufs/ffs/ffs_vfsops.c
@@ -105,6 +105,7 @@ static struct vfsops ufs_vfsops = {
.vfs_uninit = ffs_uninit,
.vfs_unmount = ffs_unmount,
.vfs_vget = ffs_vget,
+ .vfs_susp_clean = process_deferred_inactive,
};
VFS_SET(ufs_vfsops, ufs, 0);
OpenPOWER on IntegriCloud