Date: Thu, 30 Dec 2004 23:48:08 -0700 (MST) From: Siddharth Aggarwal <saggarwa@cs.utah.edu> To: freebsd-fs@freebsd.org Subject: Freezing filesystem activity Message-ID: <Pine.GSO.4.50L0.0412302339260.5205-100000@faith.cs.utah.edu>
next in thread | raw e-mail | index | archive | help
I want to freeze any filesystem activity in the kernel (a pseudo driver)
i.e. while my driver code is executing (this code basically flushes
buffer cache blocks to disk), I donot want any other filesystem
operations coming in. I tried this by locking the filesystem before my
code and unlocking right after as shown below. There is a problem because
it causes a hang (rather it seems as if
1. The flush is happening indefinitely
as if the filesystem never got locked and hence more disk updates keep
coming in
or
2. The filesystem unlock is not happening properly and hence nothing can
proceed.
Any suggestions to rectify or probe this problem?
Thanks,
Sid.
my_code()
{
 vp = lock_filesystem();
 sync(); // flush to disk
 unlock_filesystem(vp);
}
struct vnode * lock_filesystem()
{
    NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, "/", curproc);
    if ((error = vn_open(&nd, FREAD, 0)) != 0) {
        printf ("Error opening filesystem \n");
        return 0;
    }
    vp = nd.ni_vp;
    vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, curproc);
    NDFREE(&nd, NDF_ONLY_PNBUF);
    return vp;
}
unlock_filesystem(struct vnode * vp)
{
    VOP_UNLOCK(vp, 0, curproc);
}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.GSO.4.50L0.0412302339260.5205-100000>
