9p: fix readdir corner cases
The patch below also addresses a couple of other corner cases in readdir seen with a large (e.g. 64k) msize. I'm not sure what people think of my co-opting of fid->aux here. I'd be happy to rework if there's a better way. When the size of the user supplied buffer passed to readdir is smaller than the data returned in one go by the 9P read request, v9fs_dir_readdir() currently discards extra data so that, on the next call, a 9P read request will be issued with offset < previous offset + bytes returned, which voilates the constraint described in paragraph 3 of read(5) description. This patch preseves the leftover data in fid->aux for use in the next call. Signed-off-by: Jim Garlick <garlick@llnl.gov> Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
This commit is contained in:
@@ -159,8 +159,7 @@ struct p9_client {
|
||||
* @qid: the &p9_qid server identifier this handle points to
|
||||
* @iounit: the server reported maximum transaction size for this file
|
||||
* @uid: the numeric uid of the local user who owns this handle
|
||||
* @aux: transport specific information (unused?)
|
||||
* @rdir_fpos: tracks offset of file position when reading directory contents
|
||||
* @rdir: readdir accounting structure (allocated on demand)
|
||||
* @flist: per-client-instance fid tracking
|
||||
* @dlist: per-dentry fid tracking
|
||||
*
|
||||
@@ -174,9 +173,9 @@ struct p9_fid {
|
||||
struct p9_qid qid;
|
||||
u32 iounit;
|
||||
uid_t uid;
|
||||
void *aux;
|
||||
|
||||
int rdir_fpos;
|
||||
void *rdir;
|
||||
|
||||
struct list_head flist;
|
||||
struct list_head dlist; /* list of all fids attached to a dentry */
|
||||
};
|
||||
|
Reference in New Issue
Block a user