From mboxrd@z Thu Jan 1 00:00:00 1970 From: "J. Bruce Fields" Subject: [PATCH 2/6] locks: provide a file lease method enabling cluster-coherent leases Date: Fri, 29 Jun 2007 15:21:26 -0400 Message-ID: <1183144890833-git-send-email-bfields@fieldses.org> References: <1183144890244-git-send-email-bfields@fieldses.org> <11831448902131-git-send-email-bfields@fieldses.org> Cc: linux-fsdevel@vger.kernel.org, "J. Bruce Fields" , "J. Bruce Fields" To: Andrew Morton Return-path: Received: from mail.fieldses.org ([66.93.2.214]:59995 "EHLO fieldses.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750994AbXF2TVh (ORCPT ); Fri, 29 Jun 2007 15:21:37 -0400 In-Reply-To: <11831448902131-git-send-email-bfields@fieldses.org> Message-Id: <59343fe9a0b0bdb9c39ed217185b9c0d6c7d8dae.1183143819.git.bfields@citi.umich.edu> In-Reply-To: <6e0beaf3e950494a6903571f0b5c9b61fc7bf650.1183143819.git.bfields@citi.umich.edu> References: <6e0beaf3e950494a6903571f0b5c9b61fc7bf650.1183143819.git.bfields@citi.umich.edu> Sender: linux-fsdevel-owner@vger.kernel.org List-Id: linux-fsdevel.vger.kernel.org From: J. Bruce Fields Currently leases are only kept locally, so there's no way for a distributed filesystem to enforce them against multiple clients. We're particularly interested in the case of nfsd exporting a cluster filesystem, in which case nfsd needs cluster-coherent leases in order to implement delegations correctly. Signed-off-by: J. Bruce Fields --- fs/locks.c | 7 +++++-- include/linux/fs.h | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/fs/locks.c b/fs/locks.c index 6ad3c7b..8fa4420 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -1442,7 +1442,10 @@ int setlease(struct file *filp, long arg, struct file_lock **lease) int error; lock_kernel(); - error = __setlease(filp, arg, lease); + if (filp->f_op && filp->f_op->setlease) + error = filp->f_op->setlease(filp, arg, lease); + else + error = __setlease(filp, arg, lease); unlock_kernel(); return error; @@ -1474,7 +1477,7 @@ int fcntl_setlease(unsigned int fd, struct file *filp, long arg) lock_kernel(); - error = __setlease(filp, arg, &flp); + error = setlease(filp, arg, &flp); if (error || arg == F_UNLCK) goto out_unlock; diff --git a/include/linux/fs.h b/include/linux/fs.h index 6a41f4c..4fbbc7f 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1113,6 +1113,7 @@ struct file_operations { int (*flock) (struct file *, int, struct file_lock *); ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int); ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); + int (*setlease)(struct file *, long, struct file_lock **); }; struct inode_operations { -- 1.5.2.58.g98ee