From mboxrd@z Thu Jan 1 00:00:00 1970 From: "J. Bruce Fields" Subject: Re: [PATCH] AFS: Implement file locking Date: Fri, 25 May 2007 22:23:42 -0400 Message-ID: <20070526022342.GA20905@fieldses.org> References: <20070524165554.22292.38887.stgit@warthog.cambridge.redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: akpm@osdl.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org To: David Howells Return-path: Received: from mail.fieldses.org ([66.93.2.214]:56067 "EHLO fieldses.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750821AbXEZCXr (ORCPT ); Fri, 25 May 2007 22:23:47 -0400 Content-Disposition: inline In-Reply-To: <20070524165554.22292.38887.stgit@warthog.cambridge.redhat.com> Sender: linux-fsdevel-owner@vger.kernel.org List-Id: linux-fsdevel.vger.kernel.org On Thu, May 24, 2007 at 05:55:54PM +0100, David Howells wrote: > +/* > + * initialise the lock manager thread if it isn't already running > + */ > +static int afs_init_lock_manager(void) > +{ > + if (!afs_lock_manager) { > + afs_lock_manager = create_singlethread_workqueue("kafs_lockd"); > + if (!afs_lock_manager) > + return -ENOMEM; > + } > + return 0; Doesn't this need some locking? > +/* > + * request a lock on a file on the server > + */ > +static int afs_do_setlk(struct file *file, struct file_lock *fl) > +{ > + struct afs_vnode *vnode = AFS_FS_I(file->f_mapping->host); > + afs_lock_type_t type; > + struct key *key = file->private_data; > + int ret; > + > + _enter("{%x:%u},%u", vnode->fid.vid, vnode->fid.vnode, fl->fl_type); > + > + /* only whole-file locks are supported */ > + if (fl->fl_start != 0 || fl->fl_end != OFFSET_MAX) > + return -EINVAL; Do you allow upgrades and downgrades? (Just curious.) > + /* if we've already got a readlock on the server and no waiting > + * writelocks, then we might be able to instantly grant another Is that comment correct? (You don't really test for "waiting writelocks", do you?) > + * readlock */ > + if (type == AFS_LOCK_READ && > + vnode->flags & (1 << AFS_VNODE_READLOCKED)) { > + _debug("instant readlock"); > + ASSERTCMP(vnode->flags & > + ((1 << AFS_VNODE_LOCKING) | > + (1 << AFS_VNODE_WRITELOCKED)), ==, 0); > + ASSERT(!list_empty(&vnode->granted_locks)); > + goto sharing_existing_lock; > + } > + } --b.