@@ -230,8 +230,12 @@ void locks_release_private(struct file_lock *fl)
fl->fl_ops->fl_release_private(fl);
fl->fl_ops = NULL;
}
- fl->fl_lmops = NULL;
+ if (fl->fl_lmops) {
+ if (fl->fl_lmops->lm_release_owner)
+ fl->fl_lmops->lm_release_owner(fl);
+ fl->fl_lmops = NULL;
+ }
}
EXPORT_SYMBOL_GPL(locks_release_private);
@@ -262,8 +266,12 @@ static void locks_copy_private(struct file_lock *new, struct file_lock *fl)
fl->fl_ops->fl_copy_lock(new, fl);
new->fl_ops = fl->fl_ops;
}
- if (fl->fl_lmops)
+
+ if (fl->fl_lmops) {
+ if (fl->fl_lmops->lm_copy_owner)
+ fl->fl_lmops->lm_copy_owner(new, fl);
new->fl_lmops = fl->fl_lmops;
+ }
}
void locks_copy_lock(struct file_lock *new, struct file_lock *fl)
@@ -843,6 +843,8 @@ struct file_lock_operations {
struct lock_manager_operations {
int (*lm_compare_owner)(struct file_lock *, struct file_lock *);
unsigned long (*lm_owner_key)(struct file_lock *);
+ void (*lm_copy_owner)(struct file_lock *, struct file_lock *);
+ void (*lm_release_owner)(struct file_lock *);
void (*lm_notify)(struct file_lock *); /* unblock callback */
int (*lm_grant)(struct file_lock *, struct file_lock *, int);
void (*lm_break)(struct file_lock *);
NFSD or other lockmanager may increase the owner's reference, so adds two new options for copying and releasing owner. v2: A new patch isn't exist in v1. Signed-off-by: Kinglong Mee <kinglongmee@gmail.com> --- fs/locks.c | 12 ++++++++++-- include/linux/fs.h | 2 ++ 2 files changed, 12 insertions(+), 2 deletions(-)