[pnfs] [PATCH 3/4] nfsd41: SUPPATTR_EXCLCREAT attribute

Benny Halevy bhalevy at panasas.com
Mon May 12 18:38:30 EDT 2008


On May. 12, 2008, 15:27 -0700, "J. Bruce Fields" <bfields at fieldses.org> wrote:
> On Mon, May 12, 2008 at 11:27:08AM -0700, Benny Halevy wrote:
>> Return bitmask for supported EXCLUSIVE4_1 create attributes.
>>
>> Signed-off-by: Benny Halevy <bhalevy at panasas.com>
>> ---
>>  fs/nfsd/nfs4xdr.c         |    9 ++++++++-
>>  include/linux/nfs4.h      |    2 ++
>>  include/linux/nfsd/nfsd.h |   19 +++++++++++++++++++
>>  3 files changed, 29 insertions(+), 1 deletions(-)
>>
>> diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
>> index eac9656..8173af8 100644
>> --- a/fs/nfsd/nfs4xdr.c
>> +++ b/fs/nfsd/nfs4xdr.c
>> @@ -2149,7 +2149,14 @@ out_acl:
>>  		}
>>  		WRITE64(stat.ino);
>>  	}
>> -	BUG_ON(bmval2);	/* FIXME: not implemented yet */
>> +#if defined(CONFIG_NFSD_V4_1)
>> +	if (bmval2 & FATTR4_WORD2_SUPPATTR_EXCLCREAT) {
>> +		WRITE32(3);
>> +		WRITE32(NFSD_SUPPATTR_EXCLCREAT_WORD0);
>> +		WRITE32(NFSD_SUPPATTR_EXCLCREAT_WORD1);
>> +		WRITE32(NFSD_SUPPATTR_EXCLCREAT_WORD2);
>> +	}
>> +#endif /* CONFIG_NFSD_V4_1 */
>>  
>>  	*attrlenp = htonl((char *)p - (char *)attrlenp - 4);
>>  	*countp = p - buffer;
>> diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h
>> index f4c8ce2..190f070 100644
>> --- a/include/linux/nfs4.h
>> +++ b/include/linux/nfs4.h
>> @@ -367,6 +367,8 @@ enum lock_type4 {
>>  #define FATTR4_WORD0_UNIQUE_HANDLES     (1UL << 9)
>>  #define FATTR4_WORD0_LEASE_TIME         (1UL << 10)
>>  #define FATTR4_WORD0_RDATTR_ERROR       (1UL << 11)
>> +/* Mandatory in NFSv4.1 */
>> +#define FATTR4_WORD2_SUPPATTR_EXCLCREAT (1UL << 11)
>>  
>>  /* Recommended Attributes */
>>  #define FATTR4_WORD0_ACL                (1UL << 12)
>> diff --git a/include/linux/nfsd/nfsd.h b/include/linux/nfsd/nfsd.h
>> index 64b9e45..f9f0467 100644
>> --- a/include/linux/nfsd/nfsd.h
>> +++ b/include/linux/nfsd/nfsd.h
>> @@ -333,7 +333,12 @@ extern struct timeval	nfssvc_boot;
>>   | FATTR4_WORD1_TIME_DELTA   | FATTR4_WORD1_TIME_METADATA    \
>>   | FATTR4_WORD1_TIME_MODIFY     | FATTR4_WORD1_TIME_MODIFY_SET | FATTR4_WORD1_MOUNTED_ON_FILEID)
>>  
>> +#if defined(CONFIG_NFSD_V4_1)
>> +#define NFSD_SUPPORTED_ATTRS_WORD2 \
>> +	FATTR4_WORD2_SUPPATTR_EXCLCREAT
>> +#else  /* CONFIG_NFSD_V4_1) */
>>  #define NFSD_SUPPORTED_ATTRS_WORD2 0
>> +#endif /* CONFIG_NFSD_V4_1 */
> 
> Won't we eventually need both of those definitions available at runtime,
> so that we can answer requests for the supported_attrs attribute from
> both 4.0 and 4.1 clients?

Yeah, although I'm not sure it actually illegal in NFSv4.0 to return
bits for attributes which are not in the spec I agree it's probably safer
to mask these out for NFSv4.0 clients like you said.

Benny

> 
> --b.
> 
>>  
>>  /* These will return ERR_INVAL if specified in GETATTR or READDIR. */
>>  #define NFSD_WRITEONLY_ATTRS_WORD1							    \
>> @@ -347,6 +352,20 @@ extern struct timeval	nfssvc_boot;
>>   | FATTR4_WORD1_TIME_ACCESS_SET | FATTR4_WORD1_TIME_METADATA | FATTR4_WORD1_TIME_MODIFY_SET)
>>  #define NFSD_WRITEABLE_ATTRS_WORD2 0
>>  
>> +#if defined(CONFIG_NFSD_V4_1)
>> +#define NFSD_SUPPATTR_EXCLCREAT_WORD0 \
>> +	NFSD_WRITEABLE_ATTRS_WORD0
>> +/*
>> + * we currently store the exclusive create verifier in the v_{a,m}time
>> + * attributes so the client can't set these at create time using EXCLUSIVE4_1
>> + */
>> +#define NFSD_SUPPATTR_EXCLCREAT_WORD1 \
>> +	(NFSD_WRITEABLE_ATTRS_WORD1 & \
>> +	 ~(FATTR4_WORD1_TIME_ACCESS_SET | FATTR4_WORD1_TIME_MODIFY_SET))
>> +#define NFSD_SUPPATTR_EXCLCREAT_WORD2 \
>> +	NFSD_WRITEABLE_ATTRS_WORD2
>> +#endif /* CONFIG_NFSD_V4_1 */
>> +
>>  #endif /* CONFIG_NFSD_V4 */
>>  
>>  #endif /* __KERNEL__ */
>> -- 
>> 1.5.3.3
>>
>> _______________________________________________
>> pNFS mailing list
>> pNFS at linux-nfs.org
>> http://linux-nfs.org/cgi-bin/mailman/listinfo/pnfs



More information about the pNFS mailing list