@@ -1452,26 +1452,25 @@ static void encode_read(struct xdr_stream *xdr, const struct nfs_readargs *args,
1452
1452
1453
1453
static void encode_readdir (struct xdr_stream * xdr , const struct nfs4_readdir_arg * readdir , struct rpc_rqst * req , struct compound_hdr * hdr )
1454
1454
{
1455
- uint32_t attrs [2 ] = {0 , 0 };
1455
+ uint32_t attrs [2 ] = {
1456
+ FATTR4_WORD0_RDATTR_ERROR ,
1457
+ FATTR4_WORD1_MOUNTED_ON_FILEID ,
1458
+ };
1456
1459
uint32_t dircount = readdir -> count >> 1 ;
1457
1460
__be32 * p ;
1458
1461
1459
1462
if (readdir -> plus ) {
1460
1463
attrs [0 ] |= FATTR4_WORD0_TYPE |FATTR4_WORD0_CHANGE |FATTR4_WORD0_SIZE |
1461
- FATTR4_WORD0_FSID |FATTR4_WORD0_FILEHANDLE ;
1464
+ FATTR4_WORD0_FSID |FATTR4_WORD0_FILEHANDLE | FATTR4_WORD0_FILEID ;
1462
1465
attrs [1 ] |= FATTR4_WORD1_MODE |FATTR4_WORD1_NUMLINKS |FATTR4_WORD1_OWNER |
1463
1466
FATTR4_WORD1_OWNER_GROUP |FATTR4_WORD1_RAWDEV |
1464
1467
FATTR4_WORD1_SPACE_USED |FATTR4_WORD1_TIME_ACCESS |
1465
1468
FATTR4_WORD1_TIME_METADATA |FATTR4_WORD1_TIME_MODIFY ;
1466
1469
dircount >>= 1 ;
1467
1470
}
1468
- attrs [0 ] |= FATTR4_WORD0_RDATTR_ERROR |FATTR4_WORD0_FILEID ;
1469
- attrs [1 ] |= FATTR4_WORD1_MOUNTED_ON_FILEID ;
1470
- /* Switch to mounted_on_fileid if the server supports it */
1471
- if (readdir -> bitmask [1 ] & FATTR4_WORD1_MOUNTED_ON_FILEID )
1472
- attrs [0 ] &= ~FATTR4_WORD0_FILEID ;
1473
- else
1474
- attrs [1 ] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID ;
1471
+ /* Use mounted_on_fileid only if the server supports it */
1472
+ if (!(readdir -> bitmask [1 ] & FATTR4_WORD1_MOUNTED_ON_FILEID ))
1473
+ attrs [0 ] |= FATTR4_WORD0_FILEID ;
1475
1474
1476
1475
p = reserve_space (xdr , 12 + NFS4_VERIFIER_SIZE + 20 );
1477
1476
* p ++ = cpu_to_be32 (OP_READDIR );
@@ -3140,7 +3139,7 @@ static int decode_attr_mounted_on_fileid(struct xdr_stream *xdr, uint32_t *bitma
3140
3139
goto out_overflow ;
3141
3140
xdr_decode_hyper (p , fileid );
3142
3141
bitmap [1 ] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID ;
3143
- ret = NFS_ATTR_FATTR_FILEID ;
3142
+ ret = NFS_ATTR_FATTR_MOUNTED_ON_FILEID ;
3144
3143
}
3145
3144
dprintk ("%s: fileid=%Lu\n" , __func__ , (unsigned long long )* fileid );
3146
3145
return ret ;
@@ -4002,7 +4001,6 @@ static int decode_getfattr_attrs(struct xdr_stream *xdr, uint32_t *bitmap,
4002
4001
{
4003
4002
int status ;
4004
4003
umode_t fmode = 0 ;
4005
- uint64_t fileid ;
4006
4004
uint32_t type ;
4007
4005
4008
4006
status = decode_attr_type (xdr , bitmap , & type );
@@ -4101,13 +4099,10 @@ static int decode_getfattr_attrs(struct xdr_stream *xdr, uint32_t *bitmap,
4101
4099
goto xdr_error ;
4102
4100
fattr -> valid |= status ;
4103
4101
4104
- status = decode_attr_mounted_on_fileid (xdr , bitmap , & fileid );
4102
+ status = decode_attr_mounted_on_fileid (xdr , bitmap , & fattr -> mounted_on_fileid );
4105
4103
if (status < 0 )
4106
4104
goto xdr_error ;
4107
- if (status != 0 && !(fattr -> valid & status )) {
4108
- fattr -> fileid = fileid ;
4109
- fattr -> valid |= status ;
4110
- }
4105
+ fattr -> valid |= status ;
4111
4106
4112
4107
xdr_error :
4113
4108
dprintk ("%s: xdr returned %d\n" , __func__ , - status );
@@ -6411,7 +6406,9 @@ int nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
6411
6406
if (decode_getfattr_attrs (xdr , bitmap , entry -> fattr , entry -> fh ,
6412
6407
entry -> server , 1 ) < 0 )
6413
6408
goto out_overflow ;
6414
- if (entry -> fattr -> valid & NFS_ATTR_FATTR_FILEID )
6409
+ if (entry -> fattr -> valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID )
6410
+ entry -> ino = entry -> fattr -> mounted_on_fileid ;
6411
+ else if (entry -> fattr -> valid & NFS_ATTR_FATTR_FILEID )
6415
6412
entry -> ino = entry -> fattr -> fileid ;
6416
6413
6417
6414
entry -> d_type = DT_UNKNOWN ;
0 commit comments