mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Jeff Layton <jlayton@redhat.com>
To: "J. Bruce Fields" <bfields@fieldses.org>
Cc: viro@zeniv.linux.org.uk, matthew@wil.cx, dhowells@redhat.com,
	sage@inktank.com, smfrench@gmail.com, swhiteho@redhat.com,
	Trond.Myklebust@netapp.com, akpm@linux-foundation.org,
	linux-kernel@vger.kernel.org, linux-afs@lists.infradead.org,
	ceph-devel@vger.kernel.org, linux-cifs@vger.kernel.org,
	samba-technical@lists.samba.org, cluster-devel@redhat.com,
	linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org,
	piastryyy@gmail.com
Subject: Re: [PATCH v1 03/11] locks: comment cleanups and clarifications
Date: Tue, 4 Jun 2013 07:09:02 -0400	[thread overview]
Message-ID: <20130604070902.07f0caee@tlielax.poochiereds.net> (raw)
In-Reply-To: <20130603220024.GF2109@fieldses.org>

On Mon, 3 Jun 2013 18:00:24 -0400
"J. Bruce Fields" <bfields@fieldses.org> wrote:

> On Fri, May 31, 2013 at 11:07:26PM -0400, Jeff Layton wrote:
> > Signed-off-by: Jeff Layton <jlayton@redhat.com>
> > ---
> >  fs/locks.c         |   24 +++++++++++++++++++-----
> >  include/linux/fs.h |    6 ++++++
> >  2 files changed, 25 insertions(+), 5 deletions(-)
> > 
> > diff --git a/fs/locks.c b/fs/locks.c
> > index e3140b8..a7d2253 100644
> > --- a/fs/locks.c
> > +++ b/fs/locks.c
> > @@ -150,6 +150,16 @@ static int target_leasetype(struct file_lock *fl)
> >  int leases_enable = 1;
> >  int lease_break_time = 45;
> >  
> > +/*
> > + * The i_flock list is ordered by:
> > + *
> > + * 1) lock type -- FL_LEASEs first, then FL_FLOCK, and finally FL_POSIX
> > + * 2) lock owner
> > + * 3) lock range start
> > + * 4) lock range end
> > + *
> > + * Obviously, the last two criteria only matter for POSIX locks.
> > + */
> 
> Thanks, yes, that needs documenting!  Though I wonder if this is the
> place people will look for it.
> 

Agreed. If you can think of a better spot to put this, I'd be happy to
move it in the next iteration of this series.

> >  #define for_each_lock(inode, lockp) \
> >  	for (lockp = &inode->i_flock; *lockp != NULL; lockp = &(*lockp)->fl_next)
> >  
> > @@ -806,6 +816,11 @@ static int __posix_lock_file(struct inode *inode, struct file_lock *request, str
> >  	}
> >  
> >  	lock_flocks();
> > +	/*
> > +	 * New lock request. Walk all POSIX locks and look for conflicts. If
> > +	 * there are any, either return -EAGAIN or put the request on the
> > +	 * blocker's list of waiters.
> > +	 */
> 
> This though, seems a) not 100% accurate (it could also return EDEADLCK,
> for example), b) mostly redundant with respect to the following code.
> 

Good point -- I'll fix that up. That one was mostly for my own benefit
while trying to figure out how this code works. It's still probably worth
some more verbose comments here since this certainly wasn't 100%
obvious to me when I first dove into this code.

> >  	if (request->fl_type != F_UNLCK) {
> >  		for_each_lock(inode, before) {
> >  			fl = *before;
> > @@ -844,7 +859,7 @@ static int __posix_lock_file(struct inode *inode, struct file_lock *request, str
> >  		before = &fl->fl_next;
> >  	}
> >  
> > -	/* Process locks with this owner.  */
> > +	/* Process locks with this owner. */
> >  	while ((fl = *before) && posix_same_owner(request, fl)) {
> >  		/* Detect adjacent or overlapping regions (if same lock type)
> >  		 */
> > @@ -930,10 +945,9 @@ static int __posix_lock_file(struct inode *inode, struct file_lock *request, str
> >  	}
> >  
> >  	/*
> > -	 * The above code only modifies existing locks in case of
> > -	 * merging or replacing.  If new lock(s) need to be inserted
> > -	 * all modifications are done bellow this, so it's safe yet to
> > -	 * bail out.
> > +	 * The above code only modifies existing locks in case of merging or
> > +	 * replacing. If new lock(s) need to be inserted all modifications are
> > +	 * done below this, so it's safe yet to bail out.
> >  	 */
> >  	error = -ENOLCK; /* "no luck" */
> >  	if (right && left == right && !new_fl2)
> > diff --git a/include/linux/fs.h b/include/linux/fs.h
> > index b9d7816..ae377e9 100644
> > --- a/include/linux/fs.h
> > +++ b/include/linux/fs.h
> > @@ -926,6 +926,12 @@ int locks_in_grace(struct net *);
> >  /* that will die - we need it for nfs_lock_info */
> >  #include <linux/nfs_fs_i.h>
> >  
> > +/*
> > + * struct file_lock represents a generic "file lock". It's used to represent
> > + * POSIX byte range locks, BSD (flock) locks, and leases. It's important to
> > + * note that the same struct is used to represent both a request for a lock and
> > + * the lock itself, but the same object is never used for both.
> 
> Yes, and I do find that confusing.  I wonder if there's a sensible way
> to use separate structs for the different uses.
> 
> --b.
> 

Yeah. I think that latter point accounts for a lot of the difficulty for
the uninitiated to understand this code.

I considered creating a "struct lock_request" too. If I were designing
this code from scratch I certainly would do so, but it's harder to
justify such a change to the existing code.

It would mean a lot of churn in fs-specific lock routines, and we'd
have to completely revamp things like locks_copy_lock. I just don't see
that giving us a lot of benefit in the near term and I really want this
set to focus on concrete benefits.

We might consider it in the future though. I'll add a FIXME comment
here so we can record the idea for posterity.

Thanks for the comments!

> > + */
> >  struct file_lock {
> >  	struct file_lock *fl_next;	/* singly linked list for this inode  */
> >  	struct list_head fl_link;	/* doubly linked list of all locks */
> > -- 
> > 1.7.1
> > 


-- 
Jeff Layton <jlayton@redhat.com>

  reply	other threads:[~2013-06-04 11:09 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-01  3:07 [PATCH v1 00/11] locks: scalability improvements for file locking Jeff Layton
2013-06-01  3:07 ` [PATCH v1 01/11] cifs: use posix_unblock_lock instead of locks_delete_block Jeff Layton
2013-06-03 21:53   ` J. Bruce Fields
2013-06-01  3:07 ` [PATCH v1 02/11] locks: make generic_add_lease and generic_delete_lease static Jeff Layton
2013-06-03 21:53   ` J. Bruce Fields
2013-06-01  3:07 ` [PATCH v1 03/11] locks: comment cleanups and clarifications Jeff Layton
2013-06-03 22:00   ` J. Bruce Fields
2013-06-04 11:09     ` Jeff Layton [this message]
2013-06-01  3:07 ` [PATCH v1 04/11] locks: make "added" in __posix_lock_file a bool Jeff Layton
2013-06-04 20:17   ` J. Bruce Fields
2013-06-01  3:07 ` [PATCH v1 05/11] locks: encapsulate the fl_link list handling Jeff Layton
2013-06-04 20:17   ` J. Bruce Fields
2013-06-01  3:07 ` [PATCH v1 06/11] locks: convert to i_lock to protect i_flock list Jeff Layton
2013-06-04 21:22   ` J. Bruce Fields
2013-06-05  0:46     ` Jeff Layton
2013-06-01  3:07 ` [PATCH v1 07/11] locks: only pull entries off of blocked_list when they are really unblocked Jeff Layton
2013-06-04 21:58   ` J. Bruce Fields
2013-06-05 11:38     ` Jeff Layton
2013-06-05 12:24       ` J. Bruce Fields
2013-06-05 12:38         ` Jeff Layton
2013-06-05 12:59           ` J. Bruce Fields
2013-06-01  3:07 ` [PATCH v1 08/11] locks: convert fl_link to a hlist_node Jeff Layton
2013-06-04 21:59   ` J. Bruce Fields
2013-06-05 11:43     ` Jeff Layton
2013-06-05 12:46       ` J. Bruce Fields
2013-06-01  3:07 ` [PATCH v1 09/11] locks: turn the blocked_list into a hashtable Jeff Layton
2013-06-01  3:07 ` [PATCH v1 10/11] locks: add a new "lm_owner_key" lock operation Jeff Layton
2013-06-01  3:07 ` [PATCH v1 11/11] locks: give the blocked_hash its own spinlock Jeff Layton
2013-06-04 14:19   ` Stefan (metze) Metzmacher
2013-06-04 14:39     ` Jeff Layton
2013-06-04 14:46     ` Christoph Hellwig
2013-06-04 14:53       ` J. Bruce Fields
2013-06-04 15:15         ` Jeff Layton
2013-06-04 14:56       ` Jeff Layton
2013-06-03 19:04 ` [PATCH v1 00/11] locks: scalability improvements for file locking Davidlohr Bueso
2013-06-03 21:31 ` J. Bruce Fields
2013-06-04 10:54   ` Jeff Layton
2013-06-04 11:56     ` Jim Rees
2013-06-04 12:15       ` 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=20130604070902.07f0caee@tlielax.poochiereds.net \
    --to=jlayton@redhat.com \
    --cc=Trond.Myklebust@netapp.com \
    --cc=akpm@linux-foundation.org \
    --cc=bfields@fieldses.org \
    --cc=ceph-devel@vger.kernel.org \
    --cc=cluster-devel@redhat.com \
    --cc=dhowells@redhat.com \
    --cc=linux-afs@lists.infradead.org \
    --cc=linux-cifs@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=matthew@wil.cx \
    --cc=piastryyy@gmail.com \
    --cc=sage@inktank.com \
    --cc=samba-technical@lists.samba.org \
    --cc=smfrench@gmail.com \
    --cc=swhiteho@redhat.com \
    --cc=viro@zeniv.linux.org.uk \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®