X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=sidebyside;f=fs%2Fnfsd%2Fvfs.c;h=d50269bc5a7c52ced2c5a9a0cae26705d1d725f1;hb=9bf4aaab3e101692164d49b7ca357651eb691cb6;hp=d520feaa1f3a06a9a6057b25ff45783e85b0f3c8;hpb=db216c3d5e4c040e557a50f8f5d35d5c415e8c1c;p=linux-2.6.git diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index d520feaa1..d50269bc5 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -611,7 +611,7 @@ static int nfsd_read_actor(read_descriptor_t *desc, struct page *page, unsigned long offset , unsigned long size) { unsigned long count = desc->count; - struct svc_rqst *rqstp = (struct svc_rqst *)desc->buf; + struct svc_rqst *rqstp = desc->arg.data; if (size > count) size = count; @@ -641,7 +641,7 @@ nfsd_read_actor(read_descriptor_t *desc, struct page *page, unsigned long offset */ int nfsd_read(struct svc_rqst *rqstp, struct svc_fh *fhp, loff_t offset, - struct iovec *vec, int vlen, unsigned long *count) + struct kvec *vec, int vlen, unsigned long *count) { struct raparms *ra; mm_segment_t oldfs; @@ -673,7 +673,7 @@ nfsd_read(struct svc_rqst *rqstp, struct svc_fh *fhp, loff_t offset, } else { oldfs = get_fs(); set_fs(KERNEL_DS); - err = vfs_readv(&file, vec, vlen, &offset); + err = vfs_readv(&file, (struct iovec __user *)vec, vlen, &offset); set_fs(oldfs); } @@ -704,7 +704,7 @@ out: */ int nfsd_write(struct svc_rqst *rqstp, struct svc_fh *fhp, loff_t offset, - struct iovec *vec, int vlen, + struct kvec *vec, int vlen, unsigned long cnt, int *stablep) { struct svc_export *exp; @@ -753,7 +753,7 @@ nfsd_write(struct svc_rqst *rqstp, struct svc_fh *fhp, loff_t offset, /* Write the data. */ oldfs = get_fs(); set_fs(KERNEL_DS); - err = vfs_writev(&file, vec, vlen, &offset); + err = vfs_writev(&file, (struct iovec __user *)vec, vlen, &offset); set_fs(oldfs); if (err >= 0) { nfsdstats.io_write += cnt; @@ -1477,10 +1477,12 @@ nfsd_readdir(struct svc_rqst *rqstp, struct svc_fh *fhp, loff_t *offsetp, err = nfsd_open(rqstp, fhp, S_IFDIR, MAY_READ, &file); if (err) goto out; - if (offset > ~(u32) 0) - goto out_close; - file.f_pos = offset; + offset = vfs_llseek(&file, offset, 0); + if (offset < 0) { + err = nfserrno((int)offset); + goto out_close; + } /* * Read the directory entries. This silly loop is necessary because @@ -1496,7 +1498,7 @@ nfsd_readdir(struct svc_rqst *rqstp, struct svc_fh *fhp, loff_t *offsetp, err = nfserrno(err); else err = cdp->err; - *offsetp = file.f_pos; + *offsetp = vfs_llseek(&file, 0, 1); if (err == nfserr_eof || err == nfserr_toosmall) err = nfs_ok; /* can still be found in ->err */ @@ -1514,7 +1516,6 @@ int nfsd_statfs(struct svc_rqst *rqstp, struct svc_fh *fhp, struct kstatfs *stat) { int err = fh_verify(rqstp, fhp, 0, MAY_NOP); - if (!err && vfs_statfs(fhp->fh_dentry->d_inode->i_sb,stat)) err = nfserr_io; return err; @@ -1532,7 +1533,7 @@ nfsd_permission(struct svc_export *exp, struct dentry *dentry, int acc) if (acc == MAY_NOP) return 0; #if 0 - printk("nfsd: permission 0x%x%s%s%s%s%s%s%s mode 0%o%s%s%s\n", + dprintk("nfsd: permission 0x%x%s%s%s%s%s%s%s mode 0%o%s%s%s\n", acc, (acc & MAY_READ)? " read" : "", (acc & MAY_WRITE)? " write" : "", @@ -1545,7 +1546,7 @@ nfsd_permission(struct svc_export *exp, struct dentry *dentry, int acc) IS_IMMUTABLE(inode)? " immut" : "", IS_APPEND(inode)? " append" : "", IS_RDONLY(inode)? " ro" : ""); - printk(" owner %d/%d user %d/%d\n", + dprintk(" owner %d/%d user %d/%d\n", inode->i_uid, inode->i_gid, current->fsuid, current->fsgid); #endif