Ask for time_delta during fsinfo probe
Used by the client to determine if the server has a granular enough time stamp. Signed-off-by: Ricardo Labiaga <Ricardo.Labiaga@netapp.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
committed by
Trond Myklebust
parent
6b96724e50
commit
55b6e7742d
@@ -129,7 +129,7 @@ const u32 nfs4_fsinfo_bitmap[2] = { FATTR4_WORD0_MAXFILESIZE
|
|||||||
| FATTR4_WORD0_MAXREAD
|
| FATTR4_WORD0_MAXREAD
|
||||||
| FATTR4_WORD0_MAXWRITE
|
| FATTR4_WORD0_MAXWRITE
|
||||||
| FATTR4_WORD0_LEASE_TIME,
|
| FATTR4_WORD0_LEASE_TIME,
|
||||||
0
|
FATTR4_WORD1_TIME_DELTA
|
||||||
};
|
};
|
||||||
|
|
||||||
const u32 nfs4_fs_locations_bitmap[2] = {
|
const u32 nfs4_fs_locations_bitmap[2] = {
|
||||||
|
@@ -3582,6 +3582,24 @@ static int decode_attr_time_metadata(struct xdr_stream *xdr, uint32_t *bitmap, s
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int decode_attr_time_delta(struct xdr_stream *xdr, uint32_t *bitmap,
|
||||||
|
struct timespec *time)
|
||||||
|
{
|
||||||
|
int status = 0;
|
||||||
|
|
||||||
|
time->tv_sec = 0;
|
||||||
|
time->tv_nsec = 0;
|
||||||
|
if (unlikely(bitmap[1] & (FATTR4_WORD1_TIME_DELTA - 1U)))
|
||||||
|
return -EIO;
|
||||||
|
if (likely(bitmap[1] & FATTR4_WORD1_TIME_DELTA)) {
|
||||||
|
status = decode_attr_time(xdr, time);
|
||||||
|
bitmap[1] &= ~FATTR4_WORD1_TIME_DELTA;
|
||||||
|
}
|
||||||
|
dprintk("%s: time_delta=%ld %ld\n", __func__, (long)time->tv_sec,
|
||||||
|
(long)time->tv_nsec);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
static int decode_attr_time_modify(struct xdr_stream *xdr, uint32_t *bitmap, struct timespec *time)
|
static int decode_attr_time_modify(struct xdr_stream *xdr, uint32_t *bitmap, struct timespec *time)
|
||||||
{
|
{
|
||||||
int status = 0;
|
int status = 0;
|
||||||
@@ -3982,6 +4000,9 @@ static int decode_fsinfo(struct xdr_stream *xdr, struct nfs_fsinfo *fsinfo)
|
|||||||
if ((status = decode_attr_maxwrite(xdr, bitmap, &fsinfo->wtmax)) != 0)
|
if ((status = decode_attr_maxwrite(xdr, bitmap, &fsinfo->wtmax)) != 0)
|
||||||
goto xdr_error;
|
goto xdr_error;
|
||||||
fsinfo->wtpref = fsinfo->wtmax;
|
fsinfo->wtpref = fsinfo->wtmax;
|
||||||
|
status = decode_attr_time_delta(xdr, bitmap, &fsinfo->time_delta);
|
||||||
|
if (status != 0)
|
||||||
|
goto xdr_error;
|
||||||
|
|
||||||
status = verify_attr_len(xdr, savep, attrlen);
|
status = verify_attr_len(xdr, savep, attrlen);
|
||||||
xdr_error:
|
xdr_error:
|
||||||
|
Reference in New Issue
Block a user