Merge git://git.linux-nfs.org/pub/linux/nfs-2.6
authorLinus Torvalds <torvalds@woody.linux-foundation.org>
Mon, 17 Dec 2007 21:36:17 +0000 (13:36 -0800)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Mon, 17 Dec 2007 21:36:17 +0000 (13:36 -0800)
* 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...

MAINTAINERS
fs/nfs/client.c
fs/nfs/direct.c
fs/nfs/getroot.c
fs/nfs/super.c
net/sunrpc/xprtrdma/rpc_rdma.c

index a7caced39bfa0e69a51dc56fd454aa49c19d4d85..cdc2198db754f4e65a35da6a338adfe658d7258f 100644 (file)
@@ -2751,8 +2751,10 @@ S:       Maintained
 
 NFS CLIENT
 P:     Trond Myklebust
-M:     trond.myklebust@fys.uio.no
-L:     linux-kernel@vger.kernel.org
+M:     Trond.Myklebust@netapp.com
+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
 
 NI5010 NETWORK DRIVER
index 70587f383f10708ba33b5f0d7b3492fc20359487..a6f625497612048dcf2ef5ef9048187e8e1dd63e 100644 (file)
@@ -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)
 {
-       if (!IS_ERR(server->client_acl))
-               rpc_shutdown_client(server->client_acl);
-
        if (!(server->flags & NFS_MOUNT_NONLM))
                lockd_down();   /* release rpc.lockd */
 }
@@ -755,6 +752,9 @@ void nfs_free_server(struct nfs_server *server)
 
        if (server->destroy != NULL)
                server->destroy(server);
+
+       if (!IS_ERR(server->client_acl))
+               rpc_shutdown_client(server->client_acl);
        if (!IS_ERR(server->client))
                rpc_shutdown_client(server->client);
 
index 5e8d82f6666be9e1cd4ec1d4d645c394e115d2f1..3c9d16b4f80c2d2f869ad7541b650389d4cf8130 100644 (file)
@@ -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);
        if (retval)
                goto out;
-       if (!count)
-               goto out;       /* return 0 */
 
        retval = -EINVAL;
        if ((ssize_t) count < 0)
index 0ee43843f4ec40c79f1516fb869a5eb720cb355c..e6242cdbaf9198147d9b5225ac08cc8df630b001 100644 (file)
@@ -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 */
                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;
 }
index 2426e713b77f19567f82824c39126acacb59721d..ea929207f27412e24a04631a301339b5990f7830 100644 (file)
@@ -1475,7 +1475,7 @@ static int nfs_xdev_get_sb(struct file_system_type *fs_type, int flags,
                error = PTR_ERR(mntroot);
                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);
                error = -ESTALE;
                goto error_splat_super;
index 9e11ce7159583e092627e863d44a9907f862c061..ee8de7af2a5bd8b0b757d2f581f1cb8c127e235b 100644 (file)
@@ -92,7 +92,6 @@ rpcrdma_convert_iovs(struct xdr_buf *xdrbuf, int pos,
                seg[n].mr_page = NULL;
                seg[n].mr_offset = xdrbuf->head[0].iov_base;
                seg[n].mr_len = xdrbuf->head[0].iov_len;
-               pos += xdrbuf->head[0].iov_len;
                ++n;
        }
 
@@ -104,7 +103,6 @@ rpcrdma_convert_iovs(struct xdr_buf *xdrbuf, int pos,
                seg[n].mr_len = min_t(u32,
                        PAGE_SIZE - xdrbuf->page_base, xdrbuf->page_len);
                len = xdrbuf->page_len - seg[n].mr_len;
-               pos += len;
                ++n;
                p = 1;
                while (len > 0) {
@@ -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)
                        return 0;
                seg[n].mr_page = NULL;
                seg[n].mr_offset = xdrbuf->tail[0].iov_base;
                seg[n].mr_len = xdrbuf->tail[0].iov_len;
-               pos += xdrbuf->tail[0].iov_len;
                ++n;
        }
 
-       if (pos < xdrbuf->len)
-               dprintk("RPC:       %s: marshaled only %d of %d\n",
-                               __func__, pos, xdrbuf->len);
-
        return n;
 }