From: Trond Myklebust <trond.myklebust@fys.uio.no>
To: Linux Filesystem Development <linux-fsdevel@vger.kernel.org>,
linux-kernel@vger.kernel.org, Linus Torvalds <torvalds@osdl.org>,
Andrew Morton <akpm@osdl.org>
Subject: PATCH [2/7] Fix posix locking code
Date: Sat, 14 Aug 2004 15:29:53 -0400 [thread overview]
Message-ID: <1092511792.4109.22.camel@lade.trondhjem.org> (raw)
VFS: Enable filesystems and to hook certain functions for copying
locks, and freeing locks using the new struct file_lock_operations.
VFS: Enable lock managers (i.e. lockd) to hook functions for comparing
lock ownership using the new struct lock_manager_operations.
Signed-off-by: Trond Myklebust <trond.myklebust@fys.uio.no>
fs/locks.c | 33 +++++++++++++++++++++++++++------
include/linux/fs.h | 11 +++++++++++
2 files changed, 38 insertions(+), 6 deletions(-)
diff -u --recursive --new-file --show-c-function linux-2.6.8.1-01-fix_locks/fs/locks.c linux-2.6.8.1-02-fix_locks2/fs/locks.c
--- linux-2.6.8.1-01-fix_locks/fs/locks.c 2004-08-14 14:28:58.000000000 -0400
+++ linux-2.6.8.1-02-fix_locks2/fs/locks.c 2004-08-14 14:29:12.000000000 -0400
@@ -167,6 +167,12 @@ static inline void locks_free_lock(struc
if (!list_empty(&fl->fl_link))
panic("Attempting to free lock on active lock list");
+ if (fl->fl_ops && fl->fl_ops->fl_release_private) {
+ fl->fl_ops->fl_release_private(fl);
+ fl->fl_ops = NULL;
+ }
+ fl->fl_lmops = NULL;
+
kmem_cache_free(filelock_cache, fl);
}
@@ -186,6 +192,8 @@ void locks_init_lock(struct file_lock *f
fl->fl_notify = NULL;
fl->fl_insert = NULL;
fl->fl_remove = NULL;
+ fl->fl_ops = NULL;
+ fl->fl_lmops = NULL;
}
EXPORT_SYMBOL(locks_init_lock);
@@ -220,7 +228,10 @@ void locks_copy_lock(struct file_lock *n
new->fl_notify = fl->fl_notify;
new->fl_insert = fl->fl_insert;
new->fl_remove = fl->fl_remove;
- new->fl_u = fl->fl_u;
+ new->fl_ops = fl->fl_ops;
+ new->fl_lmops = fl->fl_lmops;
+ if (fl->fl_ops && fl->fl_ops->fl_copy_lock)
+ fl->fl_ops->fl_copy_lock(new, fl);
}
EXPORT_SYMBOL(locks_copy_lock);
@@ -324,6 +335,8 @@ static int flock_to_posix_lock(struct fi
fl->fl_notify = NULL;
fl->fl_insert = NULL;
fl->fl_remove = NULL;
+ fl->fl_ops = NULL;
+ fl->fl_lmops = NULL;
return assign_type(fl, l->l_type);
}
@@ -364,6 +377,8 @@ static int flock64_to_posix_lock(struct
fl->fl_notify = NULL;
fl->fl_insert = NULL;
fl->fl_remove = NULL;
+ fl->fl_ops = NULL;
+ fl->fl_lmops = NULL;
switch (l->l_type) {
case F_RDLCK:
@@ -400,6 +415,8 @@ static int lease_alloc(struct file *filp
fl->fl_notify = NULL;
fl->fl_insert = NULL;
fl->fl_remove = NULL;
+ fl->fl_ops = NULL;
+ fl->fl_lmops = NULL;
*flp = fl;
return 0;
@@ -419,10 +436,9 @@ static inline int locks_overlap(struct f
static inline int
posix_same_owner(struct file_lock *fl1, struct file_lock *fl2)
{
- /* FIXME: Replace this sort of thing with struct file_lock_operations */
- if ((fl1->fl_type | fl2->fl_type) & FL_LOCKD)
- return fl1->fl_owner == fl2->fl_owner &&
- fl1->fl_pid == fl2->fl_pid;
+ if (fl1->fl_lmops && fl1->fl_lmops->fl_compare_owner)
+ return fl2->fl_lmops == fl1->fl_lmops &&
+ fl1->fl_lmops->fl_compare_owner(fl1, fl2);
return fl1->fl_owner == fl2->fl_owner;
}
@@ -981,6 +997,8 @@ int locks_mandatory_area(int read_write,
break;
}
+ if (fl.fl_ops && fl.fl_ops->fl_release_private)
+ fl.fl_ops->fl_release_private(&fl);
return error;
}
@@ -1415,7 +1433,6 @@ int fcntl_getlk(struct file *filp, struc
error = -EFAULT;
if (!copy_to_user(l, &flock, sizeof(flock)))
error = 0;
-
out:
return error;
}
@@ -1665,6 +1682,8 @@ void locks_remove_posix(struct file *fil
lock.fl_owner = owner;
lock.fl_pid = current->tgid;
lock.fl_file = filp;
+ lock.fl_ops = NULL;
+ lock.fl_lmops = NULL;
if (filp->f_op && filp->f_op->lock != NULL) {
filp->f_op->lock(filp, F_SETLK, &lock);
@@ -1684,6 +1703,8 @@ void locks_remove_posix(struct file *fil
before = &fl->fl_next;
}
unlock_kernel();
+ if (lock.fl_ops && lock.fl_ops->fl_release_private)
+ lock.fl_ops->fl_release_private(&lock);
}
EXPORT_SYMBOL(locks_remove_posix);
diff -u --recursive --new-file --show-c-function linux-2.6.8.1-01-fix_locks/include/linux/fs.h linux-2.6.8.1-02-fix_locks2/include/linux/fs.h
--- linux-2.6.8.1-01-fix_locks/include/linux/fs.h 2004-08-14 14:25:55.000000000 -0400
+++ linux-2.6.8.1-02-fix_locks2/include/linux/fs.h 2004-08-14 14:40:11.000000000 -0400
@@ -626,6 +626,15 @@ extern void close_private_file(struct fi
*/
typedef struct files_struct *fl_owner_t;
+struct file_lock_operations {
+ void (*fl_copy_lock)(struct file_lock *, struct file_lock *);
+ void (*fl_release_private)(struct file_lock *);
+};
+
+struct lock_manager_operations {
+ int (*fl_compare_owner)(struct file_lock *, struct file_lock *);
+};
+
/* that will die - we need it for nfs_lock_info */
#include <linux/nfs_fs_i.h>
@@ -649,6 +658,8 @@ struct file_lock {
struct fasync_struct * fl_fasync; /* for lease break notifications */
unsigned long fl_break_time; /* for nonblocking lease breaks */
+ struct file_lock_operations *fl_ops; /* Callbacks for filesystems */
+ struct lock_manager_operations *fl_lmops; /* Callbacks for lockmanagers */
union {
struct nfs_lock_info nfs_fl;
} fl_u;
next reply other threads:[~2004-08-14 19:29 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-08-14 19:29 Trond Myklebust [this message]
2004-08-14 19:53 ` PATCH [2/7] Fix posix locking code Christoph Hellwig
2004-08-14 20:19 ` Trond Myklebust
2004-08-14 20:00 ` Matthew Wilcox
2004-08-14 20:18 ` Trond Myklebust
2004-08-14 20:30 ` PATCH [2/7] Fix posix locking code (resend with fixes) Trond Myklebust
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=1092511792.4109.22.camel@lade.trondhjem.org \
--to=trond.myklebust@fys.uio.no \
--cc=akpm@osdl.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@osdl.org \
/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;
as well as URLs for NNTP newsgroup(s).