Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 16 May 2002 04:21:41 +0930 (CST)
From:      Richard Sharpe <rsharpe@ns.aus.com>
To:        Terry Lambert <tlambert2@mindspring.com>
Cc:        <freebsd-hackers@freebsd.org>
Subject:   Re: File locking, closes and performance in a distributed filesystemenv
Message-ID:  <Pine.LNX.4.33.0205160417350.3424-100000@ns.aus.com>
In-Reply-To: <3CE1F8E2.868B2965@mindspring.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, 14 May 2002, Terry Lambert wrote:

> Richard Sharpe wrote:
> > Hmmm, I wasn't very clear ...
> > 
> > What I am proposing is a 'simple' fix that simply changes
> > 
> >         p->p_flag |= P_ADVLOCK;
> > 
> > to
> > 
> >         fp->l_flag |= P_ADVLOCK;
> > 
> > And never resets it, and then in closef,
> > 
> >         if ((fp->l_flag & P_ADVLOCK) && fp->f_type == DTYPE_VNODE) {
> >                 lf.l_whence = SEEK_SET;
> >                 lf.l_start = 0;
> >                 lf.l_len = 0;
> >                 lf.l_type = F_UNLCK;
> >                 vp = (struct vnode *)fp->f_data;
> >                 (void) VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_UNLCK, &lf,
> > F_POSIX);
> >         }
> > 
> > Which still means that the correct functionality is implemented, but we
> > only try to unlock files that have ever been locked before, or where we
> > are sharing a file struct with another (related) process and one of them
> > has locked the file.
> 
> Do you expect to share the same "fp" between multiple open 
> instances for a given file within a single process?
> 
> I think your approach will fail to implement proper POSIX
> file locking semantics.
> 
> I really hate POSIX semantics, but you have to implement
> them exactly (at least by default), because programs are
> written to expect them.
> 
> Basically, this means that if you open a file twice, lock it
> via the first fd, then close the second fd, all locks are
> released.  In your code, it looks like what would happen is
> that when you closed the second fd, the fp->l_flag won't have
> the bit set.  Correct me if I'm wrong?
> 
> The reason for the extra overhead now is that you can't do
> this on an open instance basis because of POSIX, so it does it
> on a process instance basis.

OK, you have convinced me. I have looked at the POSIX spec in this area, 
and agree that I can't do what I want to do.

> The only other alternative is to do it on a vp basis -- and
> since multiple fp's can point to the same vp, your option #2
> will fail, as described above, but my suggestion to do the
> locking locally will associate it the the vp (or the v_data,
> depending on which version of FreeBSD, and where the VOP_ADVLOCK
> hangs the lock list off of: the vnode or the inode) will
> maintain the proper semantics.
> 
> Your intent isn't really to avoid the VOP_ADVLOCK call, it's
> to avoid making an RPC call to satisfy the VOP_ADVLOCK call,
> right?

Yes, correct. We will have to do it in the vnode layer as you suggest. 
Currently we are using 4.3 and moving to 4.5, so we will have to figure 
out the differences.

> You can't really avoid *all* the "avoidable overhead", without
> restructuring the VOP_ADVLOCK interface, which is politically
> difficult.

I wouldn't want to try. Too much code to change and too much chance of a 
massive screw-up.

Thanks for perservering with me.

Regards
-----
Richard Sharpe, rsharpe@ns.aus.com, rsharpe@samba.org, 
sharpe@ethereal.com


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.LNX.4.33.0205160417350.3424-100000>