All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Teigland <teigland@redhat.com>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] Re: [PATCH 1/2] dlm: initialize file_lock struct in GETLK before copying conflicting lock
Date: Thu, 22 Jan 2009 12:05:43 -0600	[thread overview]
Message-ID: <20090122180543.GA23796@redhat.com> (raw)
In-Reply-To: <20090121234239.GM4295@fieldses.org>

On Wed, Jan 21, 2009 at 06:42:39PM -0500, J. Bruce Fields wrote:
> On Wed, Jan 21, 2009 at 11:34:50AM -0500, Jeff Layton wrote:
> > dlm_posix_get fills out the relevant fields in the file_lock before
> > returning when there is a lock conflict, but doesn't clean out any of
> > the other fields in the file_lock.
> > 
> > When nfsd does a NFSv4 lockt call, it sets the fl_lmops to
> > nfsd_posix_mng_ops before calling the lower fs. When the lock comes back
> > after testing a lock on GFS2, it still has that field set. This confuses
> > nfsd into thinking that the file_lock is a nfsd4 lock.
> 
> I think of the lock system as supporting two types of objects, both
> stored in "struct lock"'s:
> 
> 	- Heavyweight locks: these have callbacks set and the filesystem
> 	  or lock manager could in theory have some private data
> 	  associated with them, so it's important that the appropriate
> 	  callbacks be called when they're released or copied.  These
> 	  are what are actually passed to posix_lock_file() and kept on
> 	  the inode lock lists.
> 	- Lightweight locks: just start, end, pid, flags, and type, with
> 	  everything zeroed out and/or ignored.
> 
> I don't see any reason why the lock passed into dlm_posix_get() needs to
> be a heavyweight lock.  In any case, if it were, then dlm_posix_get()
> would need to release the passed-in-lock before initializing the new one
> that it's returning.

It seems the nfs code is mixing those two types up a bit.  Regardless, the
rationale I see in Jeff's dlm patch is to make the two different locking paths
equivalent:

Without cfs/dlm,
nfsd4_lockt -> nfsd_test_lock -> vfs_test_lock -> posix_test_lock

With cfs/dlm,
nfsd4_lockt -> nfsd_test_lock -> vfs_test_lock -> (cfs) -> dlm_posix_get

When there's a conflict, dlm_posix_get() and posix_test_lock() should do the
same/equivalent things to the fl they are given.

posix_test_lock() does __locks_copy_lock() on the fl and then sets the pid.
dlm_posix_get() isn't using __locks_copy_lock() because it doesn't have a
conflicting file_lock to copy from.  Jeff's patch does nearly the same thing
using locks_init_lock() plus the existing assignments.  But, I think the best
solution may be for dlm_posix_get() to set up a new lightweight file_lock with
the values we need, and then call __locks_copy_lock() with it, just like
posix_test_lock().

Dave



WARNING: multiple messages have this Message-ID (diff)
From: David Teigland <teigland@redhat.com>
To: "J. Bruce Fields" <bfields@fieldses.org>
Cc: Jeff Layton <jlayton@redhat.com>,
	linux-fsdevel@vger.kernel.org, cluster-devel@redhat.com,
	linux-nfs@vger.kernel.org, nfsv4@linux-nfs.org,
	lkml@vger.kernel.org
Subject: Re: [Cluster-devel] Re: [PATCH 1/2] dlm: initialize file_lock struct in GETLK before copying conflicting lock
Date: Thu, 22 Jan 2009 12:05:43 -0600	[thread overview]
Message-ID: <20090122180543.GA23796@redhat.com> (raw)
In-Reply-To: <20090121234239.GM4295@fieldses.org>

On Wed, Jan 21, 2009 at 06:42:39PM -0500, J. Bruce Fields wrote:
> On Wed, Jan 21, 2009 at 11:34:50AM -0500, Jeff Layton wrote:
> > dlm_posix_get fills out the relevant fields in the file_lock before
> > returning when there is a lock conflict, but doesn't clean out any of
> > the other fields in the file_lock.
> > 
> > When nfsd does a NFSv4 lockt call, it sets the fl_lmops to
> > nfsd_posix_mng_ops before calling the lower fs. When the lock comes back
> > after testing a lock on GFS2, it still has that field set. This confuses
> > nfsd into thinking that the file_lock is a nfsd4 lock.
> 
> I think of the lock system as supporting two types of objects, both
> stored in "struct lock"'s:
> 
> 	- Heavyweight locks: these have callbacks set and the filesystem
> 	  or lock manager could in theory have some private data
> 	  associated with them, so it's important that the appropriate
> 	  callbacks be called when they're released or copied.  These
> 	  are what are actually passed to posix_lock_file() and kept on
> 	  the inode lock lists.
> 	- Lightweight locks: just start, end, pid, flags, and type, with
> 	  everything zeroed out and/or ignored.
> 
> I don't see any reason why the lock passed into dlm_posix_get() needs to
> be a heavyweight lock.  In any case, if it were, then dlm_posix_get()
> would need to release the passed-in-lock before initializing the new one
> that it's returning.

It seems the nfs code is mixing those two types up a bit.  Regardless, the
rationale I see in Jeff's dlm patch is to make the two different locking paths
equivalent:

Without cfs/dlm,
nfsd4_lockt -> nfsd_test_lock -> vfs_test_lock -> posix_test_lock

With cfs/dlm,
nfsd4_lockt -> nfsd_test_lock -> vfs_test_lock -> (cfs) -> dlm_posix_get

When there's a conflict, dlm_posix_get() and posix_test_lock() should do the
same/equivalent things to the fl they are given.

posix_test_lock() does __locks_copy_lock() on the fl and then sets the pid.
dlm_posix_get() isn't using __locks_copy_lock() because it doesn't have a
conflicting file_lock to copy from.  Jeff's patch does nearly the same thing
using locks_init_lock() plus the existing assignments.  But, I think the best
solution may be for dlm_posix_get() to set up a new lightweight file_lock with
the values we need, and then call __locks_copy_lock() with it, just like
posix_test_lock().

Dave


  parent reply	other threads:[~2009-01-22 18:05 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-01-21 16:34 [Cluster-devel] [PATCH 0/2] nfsd/dlm: fix knfsd panic when NFSv4 client does GETLK call on GFS2 (regression) Jeff Layton
2009-01-21 16:34 ` Jeff Layton
2009-01-21 16:34 ` [Cluster-devel] [PATCH 1/2] dlm: initialize file_lock struct in GETLK before copying conflicting lock Jeff Layton
2009-01-21 16:34   ` Jeff Layton
2009-01-21 16:34   ` Jeff Layton
2009-01-21 23:42   ` [Cluster-devel] " J. Bruce Fields
2009-01-21 23:42     ` J. Bruce Fields
2009-01-22  2:26     ` [Cluster-devel] " Jeff Layton
2009-01-22  2:26       ` Jeff Layton
2009-01-22 18:32       ` [Cluster-devel] " J. Bruce Fields
2009-01-22 18:32         ` J. Bruce Fields
2009-01-22 18:37         ` [Cluster-devel] " Jeff Layton
2009-01-22 18:37           ` Jeff Layton
2009-01-22 18:05     ` David Teigland [this message]
2009-01-22 18:05       ` [Cluster-devel] " David Teigland
2009-01-22 18:37       ` Jeff Layton
2009-01-22 18:37         ` Jeff Layton
2009-01-22 19:03         ` David Teigland
2009-01-22 19:03           ` David Teigland
2009-01-22 19:03           ` David Teigland
2009-01-22 18:48       ` J. Bruce Fields
2009-01-22 18:48         ` J. Bruce Fields
2009-01-21 16:34 ` [Cluster-devel] [PATCH 2/2] nfsd: only set file_lock.fl_lmops in nfsd4_lockt if a stateowner is found Jeff Layton
2009-01-21 16:34   ` Jeff Layton
2009-01-22 18:52   ` [Cluster-devel] " J. Bruce Fields
2009-01-22 18:52     ` J. Bruce Fields
2009-01-22 18:58     ` [Cluster-devel] " Jeff Layton
2009-01-22 18:58       ` Jeff Layton
2009-01-22 19:12       ` [Cluster-devel] " J. Bruce Fields
2009-01-22 19:12         ` J. Bruce Fields
2009-01-22 19:12         ` J. Bruce Fields
2009-01-22 18:59     ` [Cluster-devel] " Jeff Layton
2009-01-22 18:59       ` Jeff Layton
2009-01-22 19:09       ` [Cluster-devel] " Jeff Layton
2009-01-22 19:09         ` Jeff Layton
2009-01-22 19:15         ` [Cluster-devel] " J. Bruce Fields
2009-01-22 19:15           ` J. Bruce Fields
2009-01-22 19:15           ` J. Bruce Fields
  -- strict thread matches above, loose matches on Subject: below --
2009-01-22 19:16 [Cluster-devel] [PATCH 0/2] nfsd/dlm: fix knfsd panic when NFSv4 client does GETLK call Jeff Layton
2009-01-22 19:16 ` [Cluster-devel] [PATCH 1/2] dlm: initialize file_lock struct in GETLK before copying conflicting lock Jeff Layton
2009-01-27 22:34   ` [Cluster-devel] " J. Bruce Fields
2009-01-27 23:30     ` Jeff Layton

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20090122180543.GA23796@redhat.com \
    --to=teigland@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.