diff options
Diffstat (limited to 'fs/nfsd/vfs.c')
-rw-r--r-- | fs/nfsd/vfs.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 84ce601d8063..a6bc8a7423db 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c | |||
@@ -1912,6 +1912,7 @@ struct buffered_dirent { | |||
1912 | }; | 1912 | }; |
1913 | 1913 | ||
1914 | struct readdir_data { | 1914 | struct readdir_data { |
1915 | struct dir_context ctx; | ||
1915 | char *dirent; | 1916 | char *dirent; |
1916 | size_t used; | 1917 | size_t used; |
1917 | int full; | 1918 | int full; |
@@ -1943,13 +1944,15 @@ static int nfsd_buffered_filldir(void *__buf, const char *name, int namlen, | |||
1943 | static __be32 nfsd_buffered_readdir(struct file *file, filldir_t func, | 1944 | static __be32 nfsd_buffered_readdir(struct file *file, filldir_t func, |
1944 | struct readdir_cd *cdp, loff_t *offsetp) | 1945 | struct readdir_cd *cdp, loff_t *offsetp) |
1945 | { | 1946 | { |
1946 | struct readdir_data buf; | ||
1947 | struct buffered_dirent *de; | 1947 | struct buffered_dirent *de; |
1948 | int host_err; | 1948 | int host_err; |
1949 | int size; | 1949 | int size; |
1950 | loff_t offset; | 1950 | loff_t offset; |
1951 | struct readdir_data buf = { | ||
1952 | .ctx.actor = nfsd_buffered_filldir, | ||
1953 | .dirent = (void *)__get_free_page(GFP_KERNEL) | ||
1954 | }; | ||
1951 | 1955 | ||
1952 | buf.dirent = (void *)__get_free_page(GFP_KERNEL); | ||
1953 | if (!buf.dirent) | 1956 | if (!buf.dirent) |
1954 | return nfserrno(-ENOMEM); | 1957 | return nfserrno(-ENOMEM); |
1955 | 1958 | ||
@@ -1963,7 +1966,7 @@ static __be32 nfsd_buffered_readdir(struct file *file, filldir_t func, | |||
1963 | buf.used = 0; | 1966 | buf.used = 0; |
1964 | buf.full = 0; | 1967 | buf.full = 0; |
1965 | 1968 | ||
1966 | host_err = vfs_readdir(file, nfsd_buffered_filldir, &buf); | 1969 | host_err = iterate_dir(file, &buf.ctx); |
1967 | if (buf.full) | 1970 | if (buf.full) |
1968 | host_err = 0; | 1971 | host_err = 0; |
1969 | 1972 | ||