nfs: initialize the backing_dev_info when creating the server
authorJens Axboe <jens.axboe@oracle.com>
Mon, 21 Sep 2009 07:59:39 +0000 (09:59 +0200)
committerJens Axboe <jens.axboe@oracle.com>
Mon, 21 Sep 2009 13:40:33 +0000 (15:40 +0200)
NFS may free the server structure without ever having used the
bdi, so we either need to flag the bdi as being uninitialized or
initialize it up front. This does the latter.

This fixes a crash with mounting more than one NFS file system,
should people ever need that kind of obscure NFS functionality.

Tested-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Acked-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
fs/nfs/client.c

index e350bd6a2334b3df05fc0ed5b2a151de804ef931..a7ce15d3c24835a0f66c76f7d5141b7552d2d389 100644 (file)
@@ -933,10 +933,6 @@ static int nfs_probe_fsinfo(struct nfs_server *server, struct nfs_fh *mntfh, str
                goto out_error;
 
        nfs_server_set_fsinfo(server, &fsinfo);
-       error = bdi_init(&server->backing_dev_info);
-       if (error)
-               goto out_error;
-
 
        /* Get some general file system info */
        if (server->namelen == 0) {
@@ -995,6 +991,12 @@ static struct nfs_server *nfs_alloc_server(void)
                return NULL;
        }
 
+       if (bdi_init(&server->backing_dev_info)) {
+               nfs_free_iostats(server->io_stats);
+               kfree(server);
+               return NULL;
+       }
+
        return server;
 }