Messages in this thread | | | Subject | Re: [PATCH] s390 hypfs fixes for 2.6.18-rc1-mm1 | From | Michael Holzheu <> | Date | Fri, 14 Jul 2006 12:23:07 +0200 |
| |
Hi Badari,
Badari Pulavarty <pbadari@us.ibm.com> wrote on 07/13/2006 07:39:04 PM: > Well, if you say so.. I have no idea what hypfs provides, > if you think that some one can do vector and/or async > operations on these files, its worth adding the complexity. > > I was inclined towards just dealing with only single entry > in the vector and fail if some one called with multiple vectors. > But, its your call. Here is the complete code - completely untested :( > Could you please compile and test it ? > > Thanks, > Badari >
I tested your patch. It works fine! You can test hypfs only on zSeries machines in LPAR mode. It provides acounting information for the zSeries Hypervisor LPAR environment.
Thanks!
Michael
> Vectorize aio interfaces to hypfs to fit new vfs ops interfaces. > > Signed-off-by: Badari Pulavarty <pbadari@us.ibm.com> > > Index: linux-2.6.18-rc1/arch/s390/hypfs/inode.c > =================================================================== > --- linux-2.6.18-rc1.orig/arch/s390/hypfs/inode.c 2006-07-11 21: > 28:07.000000000 -0700 > +++ linux-2.6.18-rc1/arch/s390/hypfs/inode.c 2006-07-13 10:47:07. > 000000000 -0700 > @@ -134,36 +134,50 @@ static int hypfs_open(struct inode *inod > return 0; > } > > -static ssize_t hypfs_aio_read(struct kiocb *iocb, __user char *buf, > - size_t count, loff_t offset) > +static ssize_t hypfs_aio_read(struct kiocb *iocb, const struct iovec *iov, > + unsigned long nr_segs, loff_t offset) > { > char *data; > size_t len; > struct file *filp = iocb->ki_filp; > + int i, ret = 0; > > data = filp->private_data; > len = strlen(data); > - if (offset > len) { > - count = 0; > - goto out; > - } > - if (count > len - offset) > - count = len - offset; > - if (copy_to_user(buf, data + offset, count)) { > - count = -EFAULT; > + if (offset < len) > + len -= offset; > + else > goto out; > + > + for (i=0; i < nr_segs; i++) { > + char __user *buf = iov[i].iov_base; > + size_t count = iov[i].iov_len; > + > + if (count > len) > + count = len; > + if (copy_to_user(buf, data + offset, count)) { > + if (!ret) > + ret = -EFAULT; > + break; > + } > + offset += count; > + len -= count; > + ret += count; > + if (len == 0) > + break; > } > - iocb->ki_pos += count; > + iocb->ki_pos = offset; > file_accessed(filp); > out: > - return count; > + return ret; > } > -static ssize_t hypfs_aio_write(struct kiocb *iocb, const char __user *buf, > - size_t count, loff_t pos) > +static ssize_t hypfs_aio_write(struct kiocb *iocb, const struct iovec *iov, > + unsigned long nr_segs, loff_t offset) > { > int rc; > struct super_block *sb; > struct hypfs_sb_info *fs_info; > + size_t count = iov_length(iov, nr_segs); > > sb = iocb->ki_filp->f_dentry->d_inode->i_sb; > fs_info = sb->s_fs_info; > > >
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |