Commit 1ca843a2d2 "nfs: Fix GETATTR bitmap verification" has
check the bitmap after decoding success, but decode_attr_fs_locations
forgets cleanup the FATTR4_WORD0_FS_LOCATIONS bits.
decode_getfattr_attrs always return -EIO when meeting FS_LOCATIONS now.
# ll /mnt/
ls: cannot access /mnt/referal: Input/output error
ls: cannot access /mnt/replicas: Input/output error
total 32
drwxr-xr-x. 7 root root 8192 Nov 16 20:36 pnfs
??????????? ? ? ? ? ? referal
??????????? ? ? ? ? ? replicas
Signed-off-by: Kinglong Mee <[email protected]>
---
fs/nfs/nfs4xdr.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
index dfed4f5..f9f9d94 100644
--- a/fs/nfs/nfs4xdr.c
+++ b/fs/nfs/nfs4xdr.c
@@ -3671,8 +3671,10 @@ static int decode_attr_fs_locations(struct xdr_stream *xdr, uint32_t *bitmap, st
if (unlikely(status != 0))
goto out_eio;
}
- if (res->nlocations != 0)
+ if (res->nlocations != 0) {
+ bitmap[0] &= ~FATTR4_WORD0_FS_LOCATIONS;
status = NFS_ATTR_FATTR_V4_LOCATIONS;
+ }
out:
dprintk("%s: fs_locations done, error = %d\n", __func__, status);
return status;
--
2.5.0
From: Kinglong Mee <[email protected]>
Kinglong,
On Tue, Nov 17, 2015 at 4:44 AM, Kinglong Mee <[email protected]> wrote:
> Commit 1ca843a2d2 "nfs: Fix GETATTR bitmap verification" has
> check the bitmap after decoding success, but decode_attr_fs_locations
> forgets cleanup the FATTR4_WORD0_FS_LOCATIONS bits.
>
> decode_getfattr_attrs always return -EIO when meeting FS_LOCATIONS now.
>
> ls: cannot access /mnt/referal: Input/output error
> ls: cannot access /mnt/replicas: Input/output error
> total 32
> drwxr-xr-x. 7 root root 8192 Nov 16 20:36 pnfs
> ??????????? ? ? ? ? ? referal
> ??????????? ? ? ? ? ? replicas
>
> Signed-off-by: Kinglong Mee <[email protected]>
this looks like the right kind of fix, I think we can clear the bit earlier in
decode_attr_fs_locations though, as below.
Thanks,
Andreas
---
fs/nfs/nfs4xdr.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
index 6779feb..55b4493 100644
--- a/fs/nfs/nfs4xdr.c
+++ b/fs/nfs/nfs4xdr.c
@@ -3637,6 +3637,7 @@ static int decode_attr_fs_locations(struct xdr_stream *xdr, uint32_t *bitmap, st
status = 0;
if (unlikely(!(bitmap[0] & FATTR4_WORD0_FS_LOCATIONS)))
goto out;
+ bitmap[0] &= ~FATTR4_WORD0_FS_LOCATIONS;
status = -EIO;
/* Ignore borken servers that return unrequested attrs */
if (unlikely(res == NULL))
--
2.5.0
Commit 1ca843a2d2 "nfs: Fix GETATTR bitmap verification" has check
the bitmap after decoding success, but decode_attr_fs_locations forgets
cleanup the FATTR4_WORD0_FS_LOCATIONS bits.
decode_getfattr_attrs always return -EIO when meeting FS_LOCATIONS now.
ls: cannot access /mnt/referal: Input/output error
ls: cannot access /mnt/replicas: Input/output error
total 32
drwxr-xr-x. 7 root root 8192 Nov 16 20:36 pnfs
??????????? ? ? ? ? ? referal
??????????? ? ? ? ? ? replicas
v2: clear the bit earlier
Signed-off-by: Andreas Gruenbacher <[email protected]>
Signed-off-by: Kinglong Mee <[email protected]>
---
fs/nfs/nfs4xdr.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
index dfed4f5..4e44412 100644
--- a/fs/nfs/nfs4xdr.c
+++ b/fs/nfs/nfs4xdr.c
@@ -3615,6 +3615,7 @@ static int decode_attr_fs_locations(struct xdr_stream *xdr, uint32_t *bitmap, st
status = 0;
if (unlikely(!(bitmap[0] & FATTR4_WORD0_FS_LOCATIONS)))
goto out;
+ bitmap[0] &= ~FATTR4_WORD0_FS_LOCATIONS;
status = -EIO;
/* Ignore borken servers that return unrequested attrs */
if (unlikely(res == NULL))
--
2.5.0