diff options
| -rw-r--r-- | fs/nfs/dir.c | 7 | ||||
| -rw-r--r-- | fs/nfs/internal.h | 9 | ||||
| -rw-r--r-- | fs/nfs/nfs2xdr.c | 2 | ||||
| -rw-r--r-- | fs/nfs/nfs3xdr.c | 2 | ||||
| -rw-r--r-- | fs/nfs/nfs4xdr.c | 4 | ||||
| -rw-r--r-- | include/linux/nfs_xdr.h | 1 |
6 files changed, 22 insertions, 3 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index ced7291cc5f..8ea4a4180a8 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
| @@ -162,6 +162,7 @@ struct nfs_cache_array_entry { | |||
| 162 | u64 cookie; | 162 | u64 cookie; |
| 163 | u64 ino; | 163 | u64 ino; |
| 164 | struct qstr string; | 164 | struct qstr string; |
| 165 | unsigned char d_type; | ||
| 165 | }; | 166 | }; |
| 166 | 167 | ||
| 167 | struct nfs_cache_array { | 168 | struct nfs_cache_array { |
| @@ -265,6 +266,7 @@ int nfs_readdir_add_to_array(struct nfs_entry *entry, struct page *page) | |||
| 265 | 266 | ||
| 266 | cache_entry->cookie = entry->prev_cookie; | 267 | cache_entry->cookie = entry->prev_cookie; |
| 267 | cache_entry->ino = entry->ino; | 268 | cache_entry->ino = entry->ino; |
| 269 | cache_entry->d_type = entry->d_type; | ||
| 268 | ret = nfs_readdir_make_qstr(&cache_entry->string, entry->name, entry->len); | 270 | ret = nfs_readdir_make_qstr(&cache_entry->string, entry->name, entry->len); |
| 269 | if (ret) | 271 | if (ret) |
| 270 | goto out; | 272 | goto out; |
| @@ -701,7 +703,6 @@ int nfs_do_filldir(nfs_readdir_descriptor_t *desc, void *dirent, | |||
| 701 | int i = 0; | 703 | int i = 0; |
| 702 | int res = 0; | 704 | int res = 0; |
| 703 | struct nfs_cache_array *array = NULL; | 705 | struct nfs_cache_array *array = NULL; |
| 704 | unsigned int d_type = DT_UNKNOWN; | ||
| 705 | 706 | ||
| 706 | array = nfs_readdir_get_array(desc->page); | 707 | array = nfs_readdir_get_array(desc->page); |
| 707 | if (IS_ERR(array)) { | 708 | if (IS_ERR(array)) { |
| @@ -711,11 +712,11 @@ int nfs_do_filldir(nfs_readdir_descriptor_t *desc, void *dirent, | |||
| 711 | 712 | ||
| 712 | for (i = desc->cache_entry_index; i < array->size; i++) { | 713 | for (i = desc->cache_entry_index; i < array->size; i++) { |
| 713 | struct nfs_cache_array_entry *ent; | 714 | struct nfs_cache_array_entry *ent; |
| 714 | d_type = DT_UNKNOWN; | ||
| 715 | 715 | ||
| 716 | ent = &array->array[i]; | 716 | ent = &array->array[i]; |
| 717 | if (filldir(dirent, ent->string.name, ent->string.len, | 717 | if (filldir(dirent, ent->string.name, ent->string.len, |
| 718 | file->f_pos, nfs_compat_user_ino64(ent->ino), d_type) < 0) { | 718 | file->f_pos, nfs_compat_user_ino64(ent->ino), |
| 719 | ent->d_type) < 0) { | ||
| 719 | desc->eof = 1; | 720 | desc->eof = 1; |
| 720 | break; | 721 | break; |
| 721 | } | 722 | } |
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index db08ff3ff45..e6356b750b7 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h | |||
| @@ -362,6 +362,15 @@ unsigned int nfs_page_length(struct page *page) | |||
| 362 | } | 362 | } |
| 363 | 363 | ||
| 364 | /* | 364 | /* |
| 365 | * Convert a umode to a dirent->d_type | ||
| 366 | */ | ||
| 367 | static inline | ||
| 368 | unsigned char nfs_umode_to_dtype(umode_t mode) | ||
| 369 | { | ||
| 370 | return (mode >> 12) & 15; | ||
| 371 | } | ||
| 372 | |||
| 373 | /* | ||
| 365 | * Determine the number of pages in an array of length 'len' and | 374 | * Determine the number of pages in an array of length 'len' and |
| 366 | * with a base offset of 'base' | 375 | * with a base offset of 'base' |
| 367 | */ | 376 | */ |
diff --git a/fs/nfs/nfs2xdr.c b/fs/nfs/nfs2xdr.c index ab5937734f0..5914a1911c9 100644 --- a/fs/nfs/nfs2xdr.c +++ b/fs/nfs/nfs2xdr.c | |||
| @@ -485,6 +485,8 @@ nfs_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry, struct nfs_se | |||
| 485 | entry->prev_cookie = entry->cookie; | 485 | entry->prev_cookie = entry->cookie; |
| 486 | entry->cookie = ntohl(*p++); | 486 | entry->cookie = ntohl(*p++); |
| 487 | 487 | ||
| 488 | entry->d_type = DT_UNKNOWN; | ||
| 489 | |||
| 488 | p = xdr_inline_peek(xdr, 8); | 490 | p = xdr_inline_peek(xdr, 8); |
| 489 | if (p != NULL) | 491 | if (p != NULL) |
| 490 | entry->eof = !p[0] && p[1]; | 492 | entry->eof = !p[0] && p[1]; |
diff --git a/fs/nfs/nfs3xdr.c b/fs/nfs/nfs3xdr.c index e79e4f5f5d5..f6cc60f06da 100644 --- a/fs/nfs/nfs3xdr.c +++ b/fs/nfs/nfs3xdr.c | |||
| @@ -622,11 +622,13 @@ nfs3_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry, struct nfs_s | |||
| 622 | entry->prev_cookie = entry->cookie; | 622 | entry->prev_cookie = entry->cookie; |
| 623 | p = xdr_decode_hyper(p, &entry->cookie); | 623 | p = xdr_decode_hyper(p, &entry->cookie); |
| 624 | 624 | ||
| 625 | entry->d_type = DT_UNKNOWN; | ||
| 625 | if (plus) { | 626 | if (plus) { |
| 626 | entry->fattr->valid = 0; | 627 | entry->fattr->valid = 0; |
| 627 | p = xdr_decode_post_op_attr_stream(xdr, entry->fattr); | 628 | p = xdr_decode_post_op_attr_stream(xdr, entry->fattr); |
| 628 | if (IS_ERR(p)) | 629 | if (IS_ERR(p)) |
| 629 | goto out_overflow_exit; | 630 | goto out_overflow_exit; |
| 631 | entry->d_type = nfs_umode_to_dtype(entry->fattr->mode); | ||
| 630 | /* In fact, a post_op_fh3: */ | 632 | /* In fact, a post_op_fh3: */ |
| 631 | p = xdr_inline_decode(xdr, 4); | 633 | p = xdr_inline_decode(xdr, 4); |
| 632 | if (unlikely(!p)) | 634 | if (unlikely(!p)) |
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index a3b39cbc90f..9f1826b012e 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c | |||
| @@ -6208,6 +6208,10 @@ __be32 *nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry, | |||
| 6208 | if (entry->fattr->valid & NFS_ATTR_FATTR_FILEID) | 6208 | if (entry->fattr->valid & NFS_ATTR_FATTR_FILEID) |
| 6209 | entry->ino = entry->fattr->fileid; | 6209 | entry->ino = entry->fattr->fileid; |
| 6210 | 6210 | ||
| 6211 | entry->d_type = DT_UNKNOWN; | ||
| 6212 | if (entry->fattr->valid & NFS_ATTR_FATTR_TYPE) | ||
| 6213 | entry->d_type = nfs_umode_to_dtype(entry->fattr->mode); | ||
| 6214 | |||
| 6211 | if (verify_attr_len(xdr, p, len) < 0) | 6215 | if (verify_attr_len(xdr, p, len) < 0) |
| 6212 | goto out_overflow; | 6216 | goto out_overflow; |
| 6213 | 6217 | ||
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index ba6cc8f223c..80f07198a31 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h | |||
| @@ -483,6 +483,7 @@ struct nfs_entry { | |||
| 483 | int eof; | 483 | int eof; |
| 484 | struct nfs_fh * fh; | 484 | struct nfs_fh * fh; |
| 485 | struct nfs_fattr * fattr; | 485 | struct nfs_fattr * fattr; |
| 486 | unsigned char d_type; | ||
| 486 | }; | 487 | }; |
| 487 | 488 | ||
| 488 | /* | 489 | /* |
