Skip site navigation (1)Skip section navigation (2)
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>