diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-07-02 09:28:37 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-07-02 09:28:37 -0700 | 
| commit | 63580e51bb3e7ec459501165884e5f815a7a9322 (patch) | |
| tree | 2130de984dda95996bc7922734feb465a13fca70 /fs/9p | |
| parent | 7747bd4bceb3079572695d3942294a6c7b265557 (diff) | |
| parent | ac6614b76478e68173ccf7ad4e9e98035cc9c21d (diff) | |
| download | linux-63580e51bb3e7ec459501165884e5f815a7a9322.tar.bz2 | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull VFS patches (part 1) from Al Viro:
 "The major change in this pile is ->readdir() replacement with
  ->iterate(), dealing with ->f_pos races in ->readdir() instances for
  good.
  There's a lot more, but I'd prefer to split the pull request into
  several stages and this is the first obvious cutoff point."
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (67 commits)
  [readdir] constify ->actor
  [readdir] ->readdir() is gone
  [readdir] convert ecryptfs
  [readdir] convert coda
  [readdir] convert ocfs2
  [readdir] convert fatfs
  [readdir] convert xfs
  [readdir] convert btrfs
  [readdir] convert hostfs
  [readdir] convert afs
  [readdir] convert ncpfs
  [readdir] convert hfsplus
  [readdir] convert hfs
  [readdir] convert befs
  [readdir] convert cifs
  [readdir] convert freevxfs
  [readdir] convert fuse
  [readdir] convert hpfs
  reiserfs: switch reiserfs_readdir_dentry to inode
  reiserfs: is_privroot_deh() needs only directory inode, actually
  ...
Diffstat (limited to 'fs/9p')
| -rw-r--r-- | fs/9p/vfs_dir.c | 72 | 
1 files changed, 28 insertions, 44 deletions
| diff --git a/fs/9p/vfs_dir.c b/fs/9p/vfs_dir.c index be1e34adc3c6..4d0c2e0be7e5 100644 --- a/fs/9p/vfs_dir.c +++ b/fs/9p/vfs_dir.c @@ -101,16 +101,15 @@ static struct p9_rdir *v9fs_alloc_rdir_buf(struct file *filp, int buflen)  }  /** - * v9fs_dir_readdir - read a directory - * @filp: opened file structure - * @dirent: directory structure ??? - * @filldir: function to populate directory structure ??? + * v9fs_dir_readdir - iterate through a directory + * @file: opened file structure + * @ctx: actor we feed the entries to   *   */ -static int v9fs_dir_readdir(struct file *filp, void *dirent, filldir_t filldir) +static int v9fs_dir_readdir(struct file *file, struct dir_context *ctx)  { -	int over; +	bool over;  	struct p9_wstat st;  	int err = 0;  	struct p9_fid *fid; @@ -118,19 +117,19 @@ static int v9fs_dir_readdir(struct file *filp, void *dirent, filldir_t filldir)  	int reclen = 0;  	struct p9_rdir *rdir; -	p9_debug(P9_DEBUG_VFS, "name %s\n", filp->f_path.dentry->d_name.name); -	fid = filp->private_data; +	p9_debug(P9_DEBUG_VFS, "name %s\n", file->f_path.dentry->d_name.name); +	fid = file->private_data;  	buflen = fid->clnt->msize - P9_IOHDRSZ; -	rdir = v9fs_alloc_rdir_buf(filp, buflen); +	rdir = v9fs_alloc_rdir_buf(file, buflen);  	if (!rdir)  		return -ENOMEM;  	while (1) {  		if (rdir->tail == rdir->head) { -			err = v9fs_file_readn(filp, rdir->buf, NULL, -							buflen, filp->f_pos); +			err = v9fs_file_readn(file, rdir->buf, NULL, +							buflen, ctx->pos);  			if (err <= 0)  				return err; @@ -148,51 +147,45 @@ static int v9fs_dir_readdir(struct file *filp, void *dirent, filldir_t filldir)  			}  			reclen = st.size+2; -			over = filldir(dirent, st.name, strlen(st.name), -			    filp->f_pos, v9fs_qid2ino(&st.qid), dt_type(&st)); - +			over = !dir_emit(ctx, st.name, strlen(st.name), +					 v9fs_qid2ino(&st.qid), dt_type(&st));  			p9stat_free(&st); -  			if (over)  				return 0;  			rdir->head += reclen; -			filp->f_pos += reclen; +			ctx->pos += reclen;  		}  	}  }  /** - * v9fs_dir_readdir_dotl - read a directory - * @filp: opened file structure - * @dirent: buffer to fill dirent structures - * @filldir: function to populate dirent structures + * v9fs_dir_readdir_dotl - iterate through a directory + * @file: opened file structure + * @ctx: actor we feed the entries to   *   */ -static int v9fs_dir_readdir_dotl(struct file *filp, void *dirent, -						filldir_t filldir) +static int v9fs_dir_readdir_dotl(struct file *file, struct dir_context *ctx)  { -	int over;  	int err = 0;  	struct p9_fid *fid;  	int buflen;  	struct p9_rdir *rdir;  	struct p9_dirent curdirent; -	u64 oldoffset = 0; -	p9_debug(P9_DEBUG_VFS, "name %s\n", filp->f_path.dentry->d_name.name); -	fid = filp->private_data; +	p9_debug(P9_DEBUG_VFS, "name %s\n", file->f_path.dentry->d_name.name); +	fid = file->private_data;  	buflen = fid->clnt->msize - P9_READDIRHDRSZ; -	rdir = v9fs_alloc_rdir_buf(filp, buflen); +	rdir = v9fs_alloc_rdir_buf(file, buflen);  	if (!rdir)  		return -ENOMEM;  	while (1) {  		if (rdir->tail == rdir->head) {  			err = p9_client_readdir(fid, rdir->buf, buflen, -						filp->f_pos); +						ctx->pos);  			if (err <= 0)  				return err; @@ -210,22 +203,13 @@ static int v9fs_dir_readdir_dotl(struct file *filp, void *dirent,  				return -EIO;  			} -			/* d_off in dirent structure tracks the offset into -			 * the next dirent in the dir. However, filldir() -			 * expects offset into the current dirent. Hence -			 * while calling filldir send the offset from the -			 * previous dirent structure. -			 */ -			over = filldir(dirent, curdirent.d_name, -					strlen(curdirent.d_name), -					oldoffset, v9fs_qid2ino(&curdirent.qid), -					curdirent.d_type); -			oldoffset = curdirent.d_off; - -			if (over) +			if (!dir_emit(ctx, curdirent.d_name, +				      strlen(curdirent.d_name), +				      v9fs_qid2ino(&curdirent.qid), +				      curdirent.d_type))  				return 0; -			filp->f_pos = curdirent.d_off; +			ctx->pos = curdirent.d_off;  			rdir->head += err;  		}  	} @@ -254,7 +238,7 @@ int v9fs_dir_release(struct inode *inode, struct file *filp)  const struct file_operations v9fs_dir_operations = {  	.read = generic_read_dir,  	.llseek = generic_file_llseek, -	.readdir = v9fs_dir_readdir, +	.iterate = v9fs_dir_readdir,  	.open = v9fs_file_open,  	.release = v9fs_dir_release,  }; @@ -262,7 +246,7 @@ const struct file_operations v9fs_dir_operations = {  const struct file_operations v9fs_dir_operations_dotl = {  	.read = generic_read_dir,  	.llseek = generic_file_llseek, -	.readdir = v9fs_dir_readdir_dotl, +	.iterate = v9fs_dir_readdir_dotl,  	.open = v9fs_file_open,  	.release = v9fs_dir_release,          .fsync = v9fs_file_fsync_dotl, |