                 cb(); return
             dbg("saving project to local bup repo")
             bup_save_project
-                projects_path : projects_path
                 project_id    : opts.project_id
                 cb            : (err, _bup) ->
                     if err

                if err
                    cb(err)
                else if data.toString().indexOf("Match User root") == -1
                    cb("Put this in /etc/ssh/sshd_config, then 'service sshd restart'!:\n\nMatch User root\n\tChrootDirectory /projects4/.zfs/snapshot\n\tForceCommand internal-sftp")
                else
                    cb()
        (cb) ->
            dbg("ensure all local snapshots are mounted (should take at most 30s) -- due to sftp chroot we need to do this, since zfs automount doesn't work")
            misc_node.execute_code
                bash    : true  # important to use bash shell so that * below works
                command : "ls /#{server}/.zfs/snapshot/*/NO_SUCH_FILE"
                timeout : 120
                cb      : (err) ->
                    cb()  # explicitly ignore the error we get due to NO_SUCH_FILE
        (cb) ->
            dbg("query database for all compute vm's")
            opts.database.get_all_compute_servers

        cb(err, {host:host, storage:storage})
    )

# Save project from compute VM to its assigned storage server.  Error if project
# not opened on a compute VM.
exports.save_project = save_project = (opts) ->
