Commit 844fdd9a authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-3.9' of git://linux-nfs.org/~bfields/linux

Pull nfsd bugfixes from J Bruce Fields:
 "Fixes for a couple mistakes in the new DRC code.  And thanks to Kent
  Overstreet for noticing we've been sync'ing the wrong range on stable
  writes since 3.8."

* 'for-3.9' of git://linux-nfs.org/~bfields/linux:
  nfsd: fix bad offset use
  nfsd: fix startup order in nfsd_reply_cache_init
  nfsd: only unhash DRC entries that are in the hashtable
parents c4052ba9 e49dbbf3
...@@ -102,6 +102,7 @@ nfsd_reply_cache_free_locked(struct svc_cacherep *rp) ...@@ -102,6 +102,7 @@ nfsd_reply_cache_free_locked(struct svc_cacherep *rp)
{ {
if (rp->c_type == RC_REPLBUFF) if (rp->c_type == RC_REPLBUFF)
kfree(rp->c_replvec.iov_base); kfree(rp->c_replvec.iov_base);
if (!hlist_unhashed(&rp->c_hash))
hlist_del(&rp->c_hash); hlist_del(&rp->c_hash);
list_del(&rp->c_lru); list_del(&rp->c_lru);
--num_drc_entries; --num_drc_entries;
...@@ -118,6 +119,10 @@ nfsd_reply_cache_free(struct svc_cacherep *rp) ...@@ -118,6 +119,10 @@ nfsd_reply_cache_free(struct svc_cacherep *rp)
int nfsd_reply_cache_init(void) int nfsd_reply_cache_init(void)
{ {
INIT_LIST_HEAD(&lru_head);
max_drc_entries = nfsd_cache_size_limit();
num_drc_entries = 0;
register_shrinker(&nfsd_reply_cache_shrinker); register_shrinker(&nfsd_reply_cache_shrinker);
drc_slab = kmem_cache_create("nfsd_drc", sizeof(struct svc_cacherep), drc_slab = kmem_cache_create("nfsd_drc", sizeof(struct svc_cacherep),
0, 0, NULL); 0, 0, NULL);
...@@ -128,10 +133,6 @@ int nfsd_reply_cache_init(void) ...@@ -128,10 +133,6 @@ int nfsd_reply_cache_init(void)
if (!cache_hash) if (!cache_hash)
goto out_nomem; goto out_nomem;
INIT_LIST_HEAD(&lru_head);
max_drc_entries = nfsd_cache_size_limit();
num_drc_entries = 0;
return 0; return 0;
out_nomem: out_nomem:
printk(KERN_ERR "nfsd: failed to allocate reply cache\n"); printk(KERN_ERR "nfsd: failed to allocate reply cache\n");
......
...@@ -1013,6 +1013,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file, ...@@ -1013,6 +1013,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
int host_err; int host_err;
int stable = *stablep; int stable = *stablep;
int use_wgather; int use_wgather;
loff_t pos = offset;
dentry = file->f_path.dentry; dentry = file->f_path.dentry;
inode = dentry->d_inode; inode = dentry->d_inode;
...@@ -1025,7 +1026,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file, ...@@ -1025,7 +1026,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
/* Write the data. */ /* Write the data. */
oldfs = get_fs(); set_fs(KERNEL_DS); oldfs = get_fs(); set_fs(KERNEL_DS);
host_err = vfs_writev(file, (struct iovec __user *)vec, vlen, &offset); host_err = vfs_writev(file, (struct iovec __user *)vec, vlen, &pos);
set_fs(oldfs); set_fs(oldfs);
if (host_err < 0) if (host_err < 0)
goto out_nfserr; goto out_nfserr;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment