diff --recursive -puN old/fs/locks.c new/fs/locks.c --- old/fs/locks.c 2004-09-20 14:15:31.144266000 -0400 +++ new/fs/locks.c 2004-09-20 14:18:58.644037000 -0400 @@ -1338,6 +1338,39 @@ out: } /** + * setlease - sets a lease on an open file + * @filp: file pointer + * @arg: type of lease to obtain + * @lease: file_lock to use + * + * Call this to establish a lease on the file. + * The fl_lmops fl_break function is required by break_lease + */ + +int setlease(struct file *filp, long arg, struct file_lock **lease) +{ + struct dentry *dentry = filp->f_dentry; + struct inode *inode = dentry->d_inode; + int error; + + if ((current->fsuid != inode->i_uid) && !capable(CAP_LEASE)) + return -EACCES; + if (!S_ISREG(inode->i_mode)) + return -EINVAL; + error = security_file_lock(filp, arg); + if (error) + return error; + + lock_kernel(); + error = __setlease(filp, arg, lease); + unlock_kernel(); + + return error; +} + +EXPORT_SYMBOL(setlease); + +/** * fcntl_setlease - sets a lease on an open file * @fd: open file descriptor * @filp: file pointer diff --recursive -puN old/include/linux/fs.h new/include/linux/fs.h --- old/include/linux/fs.h 2004-09-20 13:06:31.333998000 -0400 +++ new/include/linux/fs.h 2004-09-20 14:27:37.183726000 -0400 @@ -701,6 +701,7 @@ extern int posix_locks_deadlock(struct f extern int flock_lock_file_wait(struct file *filp, struct file_lock *fl); extern int __break_lease(struct inode *inode, unsigned int flags); extern void lease_get_mtime(struct inode *, struct timespec *time); +extern int setlease(struct file *, long, struct file_lock **); extern int lock_may_read(struct inode *, loff_t start, unsigned long count); extern int lock_may_write(struct inode *, loff_t start, unsigned long count); extern void steal_locks(fl_owner_t from);