Commit 2cc3a8f6 authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.linux-nfs.org/pub/linux/nfs-2.6

* git://git.linux-nfs.org/pub/linux/nfs-2.6:
  MAINTAINERS: update the NFS CLIENT entry
  NFS: Fix an Oops in NFS unmount
  Revert "NFS: Ensure we return zero if applications attempt to write zero bytes"
  SUNRPC xprtrdma: fix XDR tail buf marshalling for all ops
  NFSv2/v3: Fix a memory leak when using -onolock
  NFS: Fix NFS mountpoint crossing...
parents 23afc5c6 78f58153
...@@ -2751,8 +2751,10 @@ S: Maintained ...@@ -2751,8 +2751,10 @@ S: Maintained
NFS CLIENT NFS CLIENT
P: Trond Myklebust P: Trond Myklebust
M: trond.myklebust@fys.uio.no M: Trond.Myklebust@netapp.com
L: linux-kernel@vger.kernel.org L: linux-nfs@vger.kernel.org
W: http://client.linux-nfs.org
T: git git://git.linux-nfs.org/pub/linux/nfs-2.6.git
S: Maintained S: Maintained
NI5010 NETWORK DRIVER NI5010 NETWORK DRIVER
......
...@@ -410,9 +410,6 @@ static int nfs_create_rpc_client(struct nfs_client *clp, int proto, ...@@ -410,9 +410,6 @@ static int nfs_create_rpc_client(struct nfs_client *clp, int proto,
*/ */
static void nfs_destroy_server(struct nfs_server *server) static void nfs_destroy_server(struct nfs_server *server)
{ {
if (!IS_ERR(server->client_acl))
rpc_shutdown_client(server->client_acl);
if (!(server->flags & NFS_MOUNT_NONLM)) if (!(server->flags & NFS_MOUNT_NONLM))
lockd_down(); /* release rpc.lockd */ lockd_down(); /* release rpc.lockd */
} }
...@@ -755,6 +752,9 @@ void nfs_free_server(struct nfs_server *server) ...@@ -755,6 +752,9 @@ void nfs_free_server(struct nfs_server *server)
if (server->destroy != NULL) if (server->destroy != NULL)
server->destroy(server); server->destroy(server);
if (!IS_ERR(server->client_acl))
rpc_shutdown_client(server->client_acl);
if (!IS_ERR(server->client)) if (!IS_ERR(server->client))
rpc_shutdown_client(server->client); rpc_shutdown_client(server->client);
......
...@@ -894,8 +894,6 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, const struct iovec *iov, ...@@ -894,8 +894,6 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, const struct iovec *iov,
retval = generic_write_checks(file, &pos, &count, 0); retval = generic_write_checks(file, &pos, &count, 0);
if (retval) if (retval)
goto out; goto out;
if (!count)
goto out; /* return 0 */
retval = -EINVAL; retval = -EINVAL;
if ((ssize_t) count < 0) if ((ssize_t) count < 0)
......
...@@ -57,6 +57,17 @@ static int nfs_superblock_set_dummy_root(struct super_block *sb, struct inode *i ...@@ -57,6 +57,17 @@ static int nfs_superblock_set_dummy_root(struct super_block *sb, struct inode *i
} }
/* Circumvent igrab(): we know the inode is not being freed */ /* Circumvent igrab(): we know the inode is not being freed */
atomic_inc(&inode->i_count); atomic_inc(&inode->i_count);
/*
* Ensure that this dentry is invisible to d_find_alias().
* Otherwise, it may be spliced into the tree by
* d_materialise_unique if a parent directory from the same
* filesystem gets mounted at a later time.
* This again causes shrink_dcache_for_umount_subtree() to
* Oops, since the test for IS_ROOT() will fail.
*/
spin_lock(&dcache_lock);
list_del_init(&sb->s_root->d_alias);
spin_unlock(&dcache_lock);
} }
return 0; return 0;
} }
......
...@@ -1475,7 +1475,7 @@ static int nfs_xdev_get_sb(struct file_system_type *fs_type, int flags, ...@@ -1475,7 +1475,7 @@ static int nfs_xdev_get_sb(struct file_system_type *fs_type, int flags,
error = PTR_ERR(mntroot); error = PTR_ERR(mntroot);
goto error_splat_super; goto error_splat_super;
} }
if (mntroot->d_inode->i_op != &nfs_dir_inode_operations) { if (mntroot->d_inode->i_op != server->nfs_client->rpc_ops->dir_inode_ops) {
dput(mntroot); dput(mntroot);
error = -ESTALE; error = -ESTALE;
goto error_splat_super; goto error_splat_super;
......
...@@ -92,7 +92,6 @@ rpcrdma_convert_iovs(struct xdr_buf *xdrbuf, int pos, ...@@ -92,7 +92,6 @@ rpcrdma_convert_iovs(struct xdr_buf *xdrbuf, int pos,
seg[n].mr_page = NULL; seg[n].mr_page = NULL;
seg[n].mr_offset = xdrbuf->head[0].iov_base; seg[n].mr_offset = xdrbuf->head[0].iov_base;
seg[n].mr_len = xdrbuf->head[0].iov_len; seg[n].mr_len = xdrbuf->head[0].iov_len;
pos += xdrbuf->head[0].iov_len;
++n; ++n;
} }
...@@ -104,7 +103,6 @@ rpcrdma_convert_iovs(struct xdr_buf *xdrbuf, int pos, ...@@ -104,7 +103,6 @@ rpcrdma_convert_iovs(struct xdr_buf *xdrbuf, int pos,
seg[n].mr_len = min_t(u32, seg[n].mr_len = min_t(u32,
PAGE_SIZE - xdrbuf->page_base, xdrbuf->page_len); PAGE_SIZE - xdrbuf->page_base, xdrbuf->page_len);
len = xdrbuf->page_len - seg[n].mr_len; len = xdrbuf->page_len - seg[n].mr_len;
pos += len;
++n; ++n;
p = 1; p = 1;
while (len > 0) { while (len > 0) {
...@@ -119,20 +117,15 @@ rpcrdma_convert_iovs(struct xdr_buf *xdrbuf, int pos, ...@@ -119,20 +117,15 @@ rpcrdma_convert_iovs(struct xdr_buf *xdrbuf, int pos,
} }
} }
if (pos < xdrbuf->len && xdrbuf->tail[0].iov_len) { if (xdrbuf->tail[0].iov_len) {
if (n == nsegs) if (n == nsegs)
return 0; return 0;
seg[n].mr_page = NULL; seg[n].mr_page = NULL;
seg[n].mr_offset = xdrbuf->tail[0].iov_base; seg[n].mr_offset = xdrbuf->tail[0].iov_base;
seg[n].mr_len = xdrbuf->tail[0].iov_len; seg[n].mr_len = xdrbuf->tail[0].iov_len;
pos += xdrbuf->tail[0].iov_len;
++n; ++n;
} }
if (pos < xdrbuf->len)
dprintk("RPC: %s: marshaled only %d of %d\n",
__func__, pos, xdrbuf->len);
return n; return n;
} }
......
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