diff mbox

[4/5] NFS: Send attributes in OPEN request for NFS4_CREATE_EXCLUSIVE4_1

Message ID 55B763C8.1050408@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Kinglong Mee July 28, 2015, 11:13 a.m. UTC
Client sends a SETATTR request after OPEN for updating attributes.
For create file with S_ISGID is set, the SETATTR will be not set S_ISGID
as chmod of no PERMISSION.

Signed-off-by: Kinglong Mee <kinglongmee@gmail.com>
---
 fs/nfs/nfs4proc.c | 2 +-
 fs/nfs/nfs4xdr.c  | 4 +---
 2 files changed, 2 insertions(+), 4 deletions(-)

Comments

Trond Myklebust July 28, 2015, 12:47 p.m. UTC | #1
Hi Kinglong,

On Tue, Jul 28, 2015 at 7:13 AM, Kinglong Mee <kinglongmee@gmail.com> wrote:
> Client sends a SETATTR request after OPEN for updating attributes.
> For create file with S_ISGID is set, the SETATTR will be not set S_ISGID
> as chmod of no PERMISSION.
>
> Signed-off-by: Kinglong Mee <kinglongmee@gmail.com>
> ---
>  fs/nfs/nfs4proc.c | 2 +-
>  fs/nfs/nfs4xdr.c  | 4 +---
>  2 files changed, 2 insertions(+), 4 deletions(-)
>
> diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
> index 8bee934..801f5f4 100644
> --- a/fs/nfs/nfs4proc.c
> +++ b/fs/nfs/nfs4proc.c
> @@ -2413,7 +2413,7 @@ static int _nfs4_do_open(struct inode *dir,
>         state = ctx->state;
>
>         if ((opendata->o_arg.open_flags & O_EXCL) &&
> -           (opendata->o_arg.createmode != NFS4_CREATE_GUARDED)) {
> +           (opendata->o_arg.createmode == NFS4_CREATE_EXCLUSIVE)) {
>                 nfs4_exclusive_attrset(opendata, sattr);
>
>                 nfs_fattr_init(opendata->o_res.f_attr);
> diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
> index 558cd65d..b5147bc 100644
> --- a/fs/nfs/nfs4xdr.c
> +++ b/fs/nfs/nfs4xdr.c
> @@ -1382,7 +1382,6 @@ static inline void encode_openhdr(struct xdr_stream *xdr, const struct nfs_opena
>
>  static inline void encode_createmode(struct xdr_stream *xdr, const struct nfs_openargs *arg)
>  {
> -       struct iattr dummy;
>         __be32 *p;
>
>         p = reserve_space(xdr, 4);
> @@ -1402,8 +1401,7 @@ static inline void encode_createmode(struct xdr_stream *xdr, const struct nfs_op
>         case NFS4_CREATE_EXCLUSIVE4_1:
>                 *p = cpu_to_be32(NFS4_CREATE_EXCLUSIVE4_1);
>                 encode_nfs4_verifier(xdr, &arg->u.verifier);
> -               dummy.ia_valid = 0;
> -               encode_attrs(xdr, &dummy, arg->label, arg->server);
> +               encode_attrs(xdr, arg->u.attrs, arg->label, arg->server);
>         }
>  }
>

The problem here is that NFSv4.1 requires that the client use the
"suppattr_exclcreat" attribute (see
https://tools.ietf.org/html/rfc5661#section-5.8.1.14 and
https://tools.ietf.org/html/rfc5661#section-18.16.3) in order to
figure out which attributes it is permitted to send. If it sends
anything which is not on the approved list, the server is supposed to
fail the create attempt with NFS4ERR_INVAL...

Cheers
  Trond
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Kinglong Mee July 30, 2015, 8:57 a.m. UTC | #2
On 7/28/2015 20:47, Trond Myklebust wrote:
> Hi Kinglong,
> 
> On Tue, Jul 28, 2015 at 7:13 AM, Kinglong Mee <kinglongmee@gmail.com> wrote:
>> Client sends a SETATTR request after OPEN for updating attributes.
>> For create file with S_ISGID is set, the SETATTR will be not set S_ISGID
>> as chmod of no PERMISSION.
>>
>> Signed-off-by: Kinglong Mee <kinglongmee@gmail.com>
>> ---
>>  fs/nfs/nfs4proc.c | 2 +-
>>  fs/nfs/nfs4xdr.c  | 4 +---
>>  2 files changed, 2 insertions(+), 4 deletions(-)
>>
>> diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
>> index 8bee934..801f5f4 100644
>> --- a/fs/nfs/nfs4proc.c
>> +++ b/fs/nfs/nfs4proc.c
>> @@ -2413,7 +2413,7 @@ static int _nfs4_do_open(struct inode *dir,
>>         state = ctx->state;
>>
>>         if ((opendata->o_arg.open_flags & O_EXCL) &&
>> -           (opendata->o_arg.createmode != NFS4_CREATE_GUARDED)) {
>> +           (opendata->o_arg.createmode == NFS4_CREATE_EXCLUSIVE)) {
>>                 nfs4_exclusive_attrset(opendata, sattr);
>>
>>                 nfs_fattr_init(opendata->o_res.f_attr);
>> diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
>> index 558cd65d..b5147bc 100644
>> --- a/fs/nfs/nfs4xdr.c
>> +++ b/fs/nfs/nfs4xdr.c
>> @@ -1382,7 +1382,6 @@ static inline void encode_openhdr(struct xdr_stream *xdr, const struct nfs_opena
>>
>>  static inline void encode_createmode(struct xdr_stream *xdr, const struct nfs_openargs *arg)
>>  {
>> -       struct iattr dummy;
>>         __be32 *p;
>>
>>         p = reserve_space(xdr, 4);
>> @@ -1402,8 +1401,7 @@ static inline void encode_createmode(struct xdr_stream *xdr, const struct nfs_op
>>         case NFS4_CREATE_EXCLUSIVE4_1:
>>                 *p = cpu_to_be32(NFS4_CREATE_EXCLUSIVE4_1);
>>                 encode_nfs4_verifier(xdr, &arg->u.verifier);
>> -               dummy.ia_valid = 0;
>> -               encode_attrs(xdr, &dummy, arg->label, arg->server);
>> +               encode_attrs(xdr, arg->u.attrs, arg->label, arg->server);
>>         }
>>  }
>>
> 
> The problem here is that NFSv4.1 requires that the client use the
> "suppattr_exclcreat" attribute (see
> https://tools.ietf.org/html/rfc5661#section-5.8.1.14 and
> https://tools.ietf.org/html/rfc5661#section-18.16.3) in order to
> figure out which attributes it is permitted to send. If it sends
> anything which is not on the approved list, the server is supposed to
> fail the create attempt with NFS4ERR_INVAL...

Sorry for my missing it.
I will try to implement it later.

thanks,
Kinglong Mee
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 8bee934..801f5f4 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -2413,7 +2413,7 @@  static int _nfs4_do_open(struct inode *dir,
 	state = ctx->state;
 
 	if ((opendata->o_arg.open_flags & O_EXCL) &&
-	    (opendata->o_arg.createmode != NFS4_CREATE_GUARDED)) {
+	    (opendata->o_arg.createmode == NFS4_CREATE_EXCLUSIVE)) {
 		nfs4_exclusive_attrset(opendata, sattr);
 
 		nfs_fattr_init(opendata->o_res.f_attr);
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
index 558cd65d..b5147bc 100644
--- a/fs/nfs/nfs4xdr.c
+++ b/fs/nfs/nfs4xdr.c
@@ -1382,7 +1382,6 @@  static inline void encode_openhdr(struct xdr_stream *xdr, const struct nfs_opena
 
 static inline void encode_createmode(struct xdr_stream *xdr, const struct nfs_openargs *arg)
 {
-	struct iattr dummy;
 	__be32 *p;
 
 	p = reserve_space(xdr, 4);
@@ -1402,8 +1401,7 @@  static inline void encode_createmode(struct xdr_stream *xdr, const struct nfs_op
 	case NFS4_CREATE_EXCLUSIVE4_1:
 		*p = cpu_to_be32(NFS4_CREATE_EXCLUSIVE4_1);
 		encode_nfs4_verifier(xdr, &arg->u.verifier);
-		dummy.ia_valid = 0;
-		encode_attrs(xdr, &dummy, arg->label, arg->server);
+		encode_attrs(xdr, arg->u.attrs, arg->label, arg->server);
 	}
 }