From: Kinglong Mee <kinglongmee@gmail.com>
To: Jeff Layton <jeff.layton@primarydata.com>
Cc: "J. Bruce Fields" <bfields@fieldses.org>,
Linux NFS Mailing List <linux-nfs@vger.kernel.org>,
Trond Myklebust <trond.myklebust@primarydata.com>,
linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH 2/3] NFSD: Increase the reference of lockowner when coping file_lock
Date: Sun, 10 Aug 2014 23:47:20 +0800 [thread overview]
Message-ID: <53E79408.2050901@gmail.com> (raw)
In-Reply-To: <20140809070818.4d939a6a@tlielax.poochiereds.net>
On 8/9/2014 19:08, Jeff Layton wrote:
> On Wed, 06 Aug 2014 21:35:40 +0800
> Kinglong Mee <kinglongmee@gmail.com> wrote:
>
>> Signed-off-by: Kinglong Mee <kinglongmee@gmail.com>
>> ---
>> fs/nfsd/nfs4state.c | 33 +++++++++++++++++++++++++++++++--
>> 1 file changed, 31 insertions(+), 2 deletions(-)
>>
>> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
>> index 24168ae..07e4b5c 100644
>> --- a/fs/nfsd/nfs4state.c
>> +++ b/fs/nfsd/nfs4state.c
>> @@ -4867,6 +4867,29 @@ nfs4_transform_lock_offset(struct file_lock *lock)
>> lock->fl_end = OFFSET_MAX;
>> }
>>
>> +static inline struct nfs4_lockowner *get_lockowner(struct nfs4_lockowner *lo)
>> +{
>> + atomic_inc(&lo->lo_owner.so_count);
>> + return lo;
>> +}
>> +
>> +static void nfsd4_fl_copy_lock(struct file_lock *dst, struct file_lock *src)
>> +{
>> + struct nfs4_lockowner *lo = (struct nfs4_lockowner *) src->fl_owner;
>> + get_lockowner(lo);
>> +}
>> +
>> +static void nfsd4_fl_release_lock(struct file_lock *fl)
>> +{
>> + struct nfs4_lockowner *lo = (struct nfs4_lockowner *) fl->fl_owner;
>> + nfs4_put_stateowner(&lo->lo_owner);
>> +}
>> +
>> +static const struct file_lock_operations nfsd4_fl_lock_ops = {
>> + .fl_copy_lock = nfsd4_fl_copy_lock,
>> + .fl_release_private = nfsd4_fl_release_lock,
>> +};
>> +
>> static inline void
>> nfs4_set_lock_denied(struct file_lock *fl, struct nfsd4_lock_denied *deny)
>> {
>> @@ -5233,10 +5256,12 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
>> status = nfserr_openmode;
>> goto out;
>> }
>> - file_lock->fl_owner = (fl_owner_t)lock_sop;
>> +
>> + file_lock->fl_owner = (fl_owner_t)get_lockowner(lock_sop);
>> file_lock->fl_pid = current->tgid;
>> file_lock->fl_file = filp;
>> file_lock->fl_flags = FL_POSIX | FL_NFSD;
>> + file_lock->fl_ops = &nfsd4_fl_lock_ops;
>> file_lock->fl_start = lock->lk_offset;
>> file_lock->fl_end = last_byte_offset(lock->lk_offset, lock->lk_length);
>> nfs4_transform_lock_offset(file_lock);
>> @@ -5399,6 +5424,7 @@ nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
>> struct nfs4_ol_stateid *stp;
>> struct file *filp = NULL;
>> struct file_lock *file_lock = NULL;
>> + struct nfs4_lockowner *lock_sop = NULL;
>> __be32 status;
>> int err;
>> struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
>> @@ -5420,6 +5446,8 @@ nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
>> status = nfserr_lock_range;
>> goto put_stateid;
>> }
>> +
>> + lock_sop = lockowner(stp->st_stateowner);
>> file_lock = locks_alloc_lock();
>> if (!file_lock) {
>> dprintk("NFSD: %s: unable to allocate lock!\n", __func__);
>> @@ -5428,10 +5456,11 @@ nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
>> }
>> locks_init_lock(file_lock);
>> file_lock->fl_type = F_UNLCK;
>> - file_lock->fl_owner = (fl_owner_t)lockowner(stp->st_stateowner);
>> + file_lock->fl_owner = (fl_owner_t)get_lockowner(lock_sop);
>> file_lock->fl_pid = current->tgid;
>> file_lock->fl_file = filp;
>> file_lock->fl_flags = FL_POSIX | FL_NFSD;
>> + file_lock->fl_ops = &nfsd4_fl_lock_ops;
>> file_lock->fl_start = locku->lu_offset;
>>
>> file_lock->fl_end = last_byte_offset(locku->lu_offset,
>
> (Sorry I didn't respond to these before -- I no longer work for Red
> Hat, so emails to jlayton@redhat.com don't get to me).
>
> This looks really wrong. In this case, knfsd is acting as a
> (server-side) lock manager, not a filesystem:
>
> const struct file_lock_operations *fl_ops; /* Callbacks for filesystems */
> const struct lock_manager_operations *fl_lmops; /* Callbacks for lockmanagers */
>
> So really, taking and putting of lockowner references is really the
> purview of the lockmanager. If you had a filesystem that set fl_ops and
> was exportable, then this will likely break it.
>
> The fact that the file locking code uses struct file_lock for lock
> requests and for tracking the locks themselves makes for a horribly
> confusing interface. If I were designing this from scratch I would have
> made those two distinct structures. Maybe we should do that anyway
> sometime.
>
> What you probably ought want to do is to declare some new fl_lmops for
> taking and putting lockowner references and add hooks to call them at
> the appropriate places.
Sorry for my fault, a new resolve as v2 has be send.
Please help have a check, thank you very much.
thanks,
Kinglong Mee
WARNING: multiple messages have this Message-ID (diff)
From: Kinglong Mee <kinglongmee-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: Jeff Layton <jeff.layton-7I+n7zu2hftEKMMhf/gKZA@public.gmane.org>
Cc: "J. Bruce Fields"
<bfields-uC3wQj2KruNg9hUCZPvPmw@public.gmane.org>,
Linux NFS Mailing List
<linux-nfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
Trond Myklebust
<trond.myklebust-7I+n7zu2hftEKMMhf/gKZA@public.gmane.org>,
linux-fsdevel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH 2/3] NFSD: Increase the reference of lockowner when coping file_lock
Date: Sun, 10 Aug 2014 23:47:20 +0800 [thread overview]
Message-ID: <53E79408.2050901@gmail.com> (raw)
In-Reply-To: <20140809070818.4d939a6a-9yPaYZwiELC+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
On 8/9/2014 19:08, Jeff Layton wrote:
> On Wed, 06 Aug 2014 21:35:40 +0800
> Kinglong Mee <kinglongmee-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
>
>> Signed-off-by: Kinglong Mee <kinglongmee-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
>> ---
>> fs/nfsd/nfs4state.c | 33 +++++++++++++++++++++++++++++++--
>> 1 file changed, 31 insertions(+), 2 deletions(-)
>>
>> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
>> index 24168ae..07e4b5c 100644
>> --- a/fs/nfsd/nfs4state.c
>> +++ b/fs/nfsd/nfs4state.c
>> @@ -4867,6 +4867,29 @@ nfs4_transform_lock_offset(struct file_lock *lock)
>> lock->fl_end = OFFSET_MAX;
>> }
>>
>> +static inline struct nfs4_lockowner *get_lockowner(struct nfs4_lockowner *lo)
>> +{
>> + atomic_inc(&lo->lo_owner.so_count);
>> + return lo;
>> +}
>> +
>> +static void nfsd4_fl_copy_lock(struct file_lock *dst, struct file_lock *src)
>> +{
>> + struct nfs4_lockowner *lo = (struct nfs4_lockowner *) src->fl_owner;
>> + get_lockowner(lo);
>> +}
>> +
>> +static void nfsd4_fl_release_lock(struct file_lock *fl)
>> +{
>> + struct nfs4_lockowner *lo = (struct nfs4_lockowner *) fl->fl_owner;
>> + nfs4_put_stateowner(&lo->lo_owner);
>> +}
>> +
>> +static const struct file_lock_operations nfsd4_fl_lock_ops = {
>> + .fl_copy_lock = nfsd4_fl_copy_lock,
>> + .fl_release_private = nfsd4_fl_release_lock,
>> +};
>> +
>> static inline void
>> nfs4_set_lock_denied(struct file_lock *fl, struct nfsd4_lock_denied *deny)
>> {
>> @@ -5233,10 +5256,12 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
>> status = nfserr_openmode;
>> goto out;
>> }
>> - file_lock->fl_owner = (fl_owner_t)lock_sop;
>> +
>> + file_lock->fl_owner = (fl_owner_t)get_lockowner(lock_sop);
>> file_lock->fl_pid = current->tgid;
>> file_lock->fl_file = filp;
>> file_lock->fl_flags = FL_POSIX | FL_NFSD;
>> + file_lock->fl_ops = &nfsd4_fl_lock_ops;
>> file_lock->fl_start = lock->lk_offset;
>> file_lock->fl_end = last_byte_offset(lock->lk_offset, lock->lk_length);
>> nfs4_transform_lock_offset(file_lock);
>> @@ -5399,6 +5424,7 @@ nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
>> struct nfs4_ol_stateid *stp;
>> struct file *filp = NULL;
>> struct file_lock *file_lock = NULL;
>> + struct nfs4_lockowner *lock_sop = NULL;
>> __be32 status;
>> int err;
>> struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
>> @@ -5420,6 +5446,8 @@ nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
>> status = nfserr_lock_range;
>> goto put_stateid;
>> }
>> +
>> + lock_sop = lockowner(stp->st_stateowner);
>> file_lock = locks_alloc_lock();
>> if (!file_lock) {
>> dprintk("NFSD: %s: unable to allocate lock!\n", __func__);
>> @@ -5428,10 +5456,11 @@ nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
>> }
>> locks_init_lock(file_lock);
>> file_lock->fl_type = F_UNLCK;
>> - file_lock->fl_owner = (fl_owner_t)lockowner(stp->st_stateowner);
>> + file_lock->fl_owner = (fl_owner_t)get_lockowner(lock_sop);
>> file_lock->fl_pid = current->tgid;
>> file_lock->fl_file = filp;
>> file_lock->fl_flags = FL_POSIX | FL_NFSD;
>> + file_lock->fl_ops = &nfsd4_fl_lock_ops;
>> file_lock->fl_start = locku->lu_offset;
>>
>> file_lock->fl_end = last_byte_offset(locku->lu_offset,
>
> (Sorry I didn't respond to these before -- I no longer work for Red
> Hat, so emails to jlayton-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org don't get to me).
>
> This looks really wrong. In this case, knfsd is acting as a
> (server-side) lock manager, not a filesystem:
>
> const struct file_lock_operations *fl_ops; /* Callbacks for filesystems */
> const struct lock_manager_operations *fl_lmops; /* Callbacks for lockmanagers */
>
> So really, taking and putting of lockowner references is really the
> purview of the lockmanager. If you had a filesystem that set fl_ops and
> was exportable, then this will likely break it.
>
> The fact that the file locking code uses struct file_lock for lock
> requests and for tracking the locks themselves makes for a horribly
> confusing interface. If I were designing this from scratch I would have
> made those two distinct structures. Maybe we should do that anyway
> sometime.
>
> What you probably ought want to do is to declare some new fl_lmops for
> taking and putting lockowner references and add hooks to call them at
> the appropriate places.
Sorry for my fault, a new resolve as v2 has be send.
Please help have a check, thank you very much.
thanks,
Kinglong Mee
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2014-08-10 15:47 UTC|newest]
Thread overview: 102+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-07 14:12 [PATCH 2/4] NFSD: Rervert "knfsd: locks: flag NFSv4-owned locks" Kinglong Mee
2014-07-07 16:45 ` Jeff Layton
2014-07-08 2:30 ` Kinglong Mee
2014-07-07 17:26 ` Jeff Layton
2014-07-08 3:23 ` Kinglong Mee
2014-07-08 11:03 ` Jeff Layton
2014-07-08 12:26 ` Kinglong Mee
2014-07-08 12:39 ` Jeff Layton
2014-07-11 22:11 ` J. Bruce Fields
2014-08-02 14:45 ` [PATCH] fs/locks.c: Copy fl_lmops to conflock for nfsd using Kinglong Mee
2014-08-02 14:59 ` Trond Myklebust
2014-08-02 23:05 ` Jeff Layton
2014-08-02 23:05 ` Jeff Layton
2014-08-05 19:14 ` J. Bruce Fields
2014-08-05 19:14 ` J. Bruce Fields
2014-08-05 19:20 ` Jeff Layton
2014-08-05 19:20 ` Jeff Layton
2014-08-06 13:33 ` [PATCH 1/3] NFSD: New FL_NFSD for marking file_lock belongs to NFSD Kinglong Mee
2014-08-06 13:33 ` Kinglong Mee
2014-08-06 13:35 ` [PATCH 2/3] NFSD: Increase the reference of lockowner when coping file_lock Kinglong Mee
2014-08-06 13:35 ` Kinglong Mee
2014-08-06 13:38 ` [PATCH 3/3 RFC] fs/locks.c: Copy all infomation for conflock Kinglong Mee
2014-08-06 13:38 ` Kinglong Mee
2014-08-09 11:08 ` [PATCH 2/3] NFSD: Increase the reference of lockowner when coping file_lock Jeff Layton
2014-08-09 11:08 ` Jeff Layton
2014-08-10 15:47 ` Kinglong Mee [this message]
2014-08-10 15:47 ` Kinglong Mee
2014-08-09 10:51 ` [PATCH 1/3] NFSD: New FL_NFSD for marking file_lock belongs to NFSD Jeff Layton
2014-08-10 12:46 ` Kinglong Mee
2014-08-10 12:46 ` Kinglong Mee
2014-08-10 15:38 ` [PATCH 1/3 v2] fs/locks.c: Copy all information for conflock Kinglong Mee
2014-08-10 15:38 ` Kinglong Mee
2014-08-10 15:42 ` [PATCH 2/3 v2] fs/locks.c: New ops in file_lock_operations for copying/releasing owner Kinglong Mee
2014-08-10 15:42 ` Kinglong Mee
2014-08-10 15:43 ` [PATCH 3/3 v2] NFSD: Increase the reference of lockowner when coping file_lock Kinglong Mee
2014-08-10 15:43 ` Kinglong Mee
2014-08-11 16:46 ` Jeff Layton
2014-08-11 16:46 ` Jeff Layton
2014-08-14 12:30 ` Kinglong Mee
2014-08-14 12:30 ` Kinglong Mee
2014-08-11 16:19 ` [PATCH 1/3 v2] fs/locks.c: Copy all information for conflock Jeff Layton
2014-08-11 16:19 ` Jeff Layton
2014-08-11 16:25 ` Joe Perches
2014-08-11 16:25 ` Joe Perches
2014-08-14 12:59 ` Kinglong Mee
2014-08-14 12:59 ` Kinglong Mee
2014-08-14 12:26 ` Kinglong Mee
2014-08-14 12:26 ` Kinglong Mee
2014-08-14 14:00 ` Jeff Layton
2014-08-14 14:04 ` Kinglong Mee
2014-08-14 14:04 ` Kinglong Mee
2014-08-15 0:02 ` [PATCH 1/5 v3] NFSD: Remove duplicate initialization of file_lock Kinglong Mee
2014-08-15 0:02 ` Kinglong Mee
2014-08-15 10:57 ` Jeff Layton
2014-08-15 10:57 ` Jeff Layton
2014-08-15 21:35 ` J. Bruce Fields
2014-08-15 21:35 ` J. Bruce Fields
2014-08-15 0:07 ` [PATCH 2/5 v3] locks: Copy all infomation for conflock Kinglong Mee
2014-08-15 11:14 ` Jeff Layton
2014-08-15 11:14 ` Jeff Layton
2014-08-15 14:33 ` Kinglong Mee
2014-08-15 14:33 ` Kinglong Mee
2014-08-16 13:35 ` Kinglong Mee
2014-08-16 13:35 ` Kinglong Mee
2014-08-17 13:42 ` Kinglong Mee
2014-08-17 13:42 ` Kinglong Mee
2014-08-18 11:54 ` Jeff Layton
2014-08-18 11:54 ` Jeff Layton
2014-08-19 15:10 ` Kinglong Mee
2014-08-15 0:09 ` [PATCH 3/5 v3] locks: New ops in file_lock_operations for copy/release owner Kinglong Mee
2014-08-15 0:09 ` Kinglong Mee
2014-08-15 0:10 ` [PATCH 4/5 v3] NFSD: New helper nfs4_get_stateowner() for atomic_inc reference Kinglong Mee
2014-08-15 0:13 ` [PATCH 5/5 v3] NFSD: Increase the reference of lockowner when coping file_lock Kinglong Mee
2014-08-15 0:13 ` Kinglong Mee
2014-08-19 15:16 ` [PATCH 1/6 v4] NFSD: Remove the duplicate initialize of file_lock Kinglong Mee
2014-08-19 15:16 ` Kinglong Mee
2014-08-19 15:18 ` [PATCH 2/6 v4] locks: New ops in file_lock_operations for get/put owner Kinglong Mee
2014-08-19 19:42 ` Jeff Layton
2014-08-19 19:42 ` Jeff Layton
2014-08-19 15:21 ` [PATCH 3/6 v4] locks: Rename __locks_copy_lock() to locks_copy_conflock() Kinglong Mee
2014-08-19 19:46 ` Jeff Layton
2014-08-19 15:24 ` [PATCH 4/6 v4] locks: Copy fl_lmops information for conflock in, locks_copy_conflock() Kinglong Mee
2014-08-19 15:24 ` Kinglong Mee
2014-08-19 20:08 ` Jeff Layton
2014-08-19 15:25 ` [PATCH 5/6 v4] NFSD: New helper nfs4_get_stateowner() for atomic_inc sop reference Kinglong Mee
2014-08-19 20:14 ` Jeff Layton
2014-08-19 15:26 ` [PATCH 6/6 v4] NFSD: Increase the reference of lockowner when coping file_lock Kinglong Mee
2014-08-19 20:23 ` Jeff Layton
2014-08-19 20:23 ` Jeff Layton
2014-08-19 20:24 ` J. Bruce Fields
2014-08-20 10:02 ` Kinglong Mee
2014-08-20 10:02 ` Kinglong Mee
2014-08-20 9:51 ` [PATCH 1/6 v5] NFSD: Remove the duplicate initialize of file_lock Kinglong Mee
2014-08-20 9:53 ` [PATCH 2/6 v5] locks: Rename __locks_copy_lock() to locks_copy_conflock() Kinglong Mee
2014-08-20 9:53 ` Kinglong Mee
2014-08-20 9:54 ` [PATCH 3/6 v5] locks: New ops in file_lock_operations for get/put owner Kinglong Mee
2014-08-20 9:54 ` Kinglong Mee
2014-08-20 9:56 ` [PATCH 4/6 v5] locks: Copy fl_lmops information for conflock in locks_copy_conflock() Kinglong Mee
2014-08-20 9:57 ` [PATCH 5/6 v5] NFSD: New helper nfs4_get_stateowner() for atomic_inc sop reference Kinglong Mee
2014-08-20 9:57 ` Kinglong Mee
2014-08-20 9:59 ` [PATCH 6/6 v5] NFSD: Get reference of lockowner when coping file_lock Kinglong Mee
2014-08-20 9:59 ` Kinglong Mee
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=53E79408.2050901@gmail.com \
--to=kinglongmee@gmail.com \
--cc=bfields@fieldses.org \
--cc=jeff.layton@primarydata.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=trond.myklebust@primarydata.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.