locks: New ops in lock_manager_operations for get/put owner
NFSD or other lockmanager may increase the owner's reference, so adds two new options for copying and releasing owner. v5: change order from 2/6 to 3/6 v4: rename lm_copy_owner/lm_release_owner to lm_get_owner/lm_put_owner Reviewed-by: Jeff Layton <jlayton@primarydata.com> Signed-off-by: Kinglong Mee <kinglongmee@gmail.com> Signed-off-by: Jeff Layton <jlayton@primarydata.com>
This commit is contained in:
parent
3fe0fff18f
commit
5c97d7b147
2 changed files with 12 additions and 2 deletions
12
fs/locks.c
12
fs/locks.c
|
@ -230,8 +230,12 @@ void locks_release_private(struct file_lock *fl)
|
||||||
fl->fl_ops->fl_release_private(fl);
|
fl->fl_ops->fl_release_private(fl);
|
||||||
fl->fl_ops = NULL;
|
fl->fl_ops = NULL;
|
||||||
}
|
}
|
||||||
fl->fl_lmops = NULL;
|
|
||||||
|
|
||||||
|
if (fl->fl_lmops) {
|
||||||
|
if (fl->fl_lmops->lm_put_owner)
|
||||||
|
fl->fl_lmops->lm_put_owner(fl);
|
||||||
|
fl->fl_lmops = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(locks_release_private);
|
EXPORT_SYMBOL_GPL(locks_release_private);
|
||||||
|
|
||||||
|
@ -274,8 +278,12 @@ static void locks_copy_private(struct file_lock *new, struct file_lock *fl)
|
||||||
fl->fl_ops->fl_copy_lock(new, fl);
|
fl->fl_ops->fl_copy_lock(new, fl);
|
||||||
new->fl_ops = fl->fl_ops;
|
new->fl_ops = fl->fl_ops;
|
||||||
}
|
}
|
||||||
if (fl->fl_lmops)
|
|
||||||
|
if (fl->fl_lmops) {
|
||||||
|
if (fl->fl_lmops->lm_get_owner)
|
||||||
|
fl->fl_lmops->lm_get_owner(new, fl);
|
||||||
new->fl_lmops = fl->fl_lmops;
|
new->fl_lmops = fl->fl_lmops;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -868,6 +868,8 @@ struct file_lock_operations {
|
||||||
struct lock_manager_operations {
|
struct lock_manager_operations {
|
||||||
int (*lm_compare_owner)(struct file_lock *, struct file_lock *);
|
int (*lm_compare_owner)(struct file_lock *, struct file_lock *);
|
||||||
unsigned long (*lm_owner_key)(struct file_lock *);
|
unsigned long (*lm_owner_key)(struct file_lock *);
|
||||||
|
void (*lm_get_owner)(struct file_lock *, struct file_lock *);
|
||||||
|
void (*lm_put_owner)(struct file_lock *);
|
||||||
void (*lm_notify)(struct file_lock *); /* unblock callback */
|
void (*lm_notify)(struct file_lock *); /* unblock callback */
|
||||||
int (*lm_grant)(struct file_lock *, int);
|
int (*lm_grant)(struct file_lock *, int);
|
||||||
void (*lm_break)(struct file_lock *);
|
void (*lm_break)(struct file_lock *);
|
||||||
|
|
Loading…
Add table
Reference in a new issue