mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-26 19:19:32 +03:00
6283f55ea1
One of the neat tricks an autoconf style project is capable of is allow configurion/building in a directory other than the source directory. The major advantage to this is that you can build the project various different ways while making changes in a single source tree. For example, this project is designed to work on various different Linux distributions each of which work slightly differently. This means that changes need to verified on each of those supported distributions perferably before the change is committed to the public git repo. Using nfs and custom build directories makes this much easier. I now have a single source tree in nfs mounted on several different systems each running a supported distribution. When I make a change to the source base I suspect may break things I can concurrently build from the same source on all the systems each in their own subdirectory. wget -c http://github.com/downloads/behlendorf/zfs/zfs-x.y.z.tar.gz tar -xzf zfs-x.y.z.tar.gz cd zfs-x-y-z ------------------------- run concurrently ---------------------- <ubuntu system> <fedora system> <debian system> <rhel6 system> mkdir ubuntu mkdir fedora mkdir debian mkdir rhel6 cd ubuntu cd fedora cd debian cd rhel6 ../configure ../configure ../configure ../configure make make make make make check make check make check make check This change also moves many of the include headers from individual incude/sys directories under the modules directory in to a single top level include directory. This has the advantage of making the build rules cleaner and logically it makes a bit more sense.
139 lines
4.7 KiB
C
139 lines
4.7 KiB
C
/*****************************************************************************\
|
|
* ZPIOS is a heavily modified version of the original PIOS test code.
|
|
* It is designed to have the test code running in the Linux kernel
|
|
* against ZFS while still being flexibly controled from user space.
|
|
*
|
|
* Copyright (C) 2008-2010 Lawrence Livermore National Security, LLC.
|
|
* Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
|
|
* Written by Brian Behlendorf <behlendorf1@llnl.gov>.
|
|
* LLNL-CODE-403049
|
|
*
|
|
* Original PIOS Test Code
|
|
* Copyright (C) 2004 Cluster File Systems, Inc.
|
|
* Written by Peter Braam <braam@clusterfs.com>
|
|
* Atul Vidwansa <atul@clusterfs.com>
|
|
* Milind Dumbare <milind@clusterfs.com>
|
|
*
|
|
* This file is part of ZFS on Linux.
|
|
* For details, see <http://github.com/behlendorf/zfs/>.
|
|
*
|
|
* ZPIOS is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation; either version 2 of the License, or (at your
|
|
* option) any later version.
|
|
*
|
|
* ZPIOS is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with ZPIOS. If not, see <http://www.gnu.org/licenses/>.
|
|
\*****************************************************************************/
|
|
|
|
#ifndef _ZPIOS_INTERNAL_H
|
|
#define _ZPIOS_INTERNAL_H
|
|
|
|
#include "zpios-ctl.h"
|
|
|
|
#define OBJ_SIZE 64
|
|
|
|
struct run_args;
|
|
|
|
typedef struct dmu_obj {
|
|
objset_t *os;
|
|
uint64_t obj;
|
|
} dmu_obj_t;
|
|
|
|
/* thread doing the IO data */
|
|
typedef struct thread_data {
|
|
struct run_args *run_args;
|
|
int thread_no;
|
|
int rc;
|
|
zpios_stats_t stats;
|
|
kmutex_t lock;
|
|
} thread_data_t;
|
|
|
|
/* region for IO data */
|
|
typedef struct zpios_region {
|
|
__u64 wr_offset;
|
|
__u64 rd_offset;
|
|
__u64 init_offset;
|
|
__u64 max_offset;
|
|
dmu_obj_t obj;
|
|
zpios_stats_t stats;
|
|
kmutex_t lock;
|
|
} zpios_region_t;
|
|
|
|
/* arguments for one run */
|
|
typedef struct run_args {
|
|
/* Config args */
|
|
int id;
|
|
char pool[ZPIOS_NAME_SIZE];
|
|
__u64 chunk_size;
|
|
__u32 thread_count;
|
|
__u32 region_count;
|
|
__u64 region_size;
|
|
__u64 offset;
|
|
__u32 region_noise;
|
|
__u32 chunk_noise;
|
|
__u32 thread_delay;
|
|
__u32 flags;
|
|
char pre[ZPIOS_PATH_SIZE];
|
|
char post[ZPIOS_PATH_SIZE];
|
|
char log[ZPIOS_PATH_SIZE];
|
|
|
|
/* Control data */
|
|
objset_t *os;
|
|
wait_queue_head_t waitq;
|
|
volatile uint64_t threads_done;
|
|
kmutex_t lock_work;
|
|
kmutex_t lock_ctl;
|
|
__u32 region_next;
|
|
|
|
/* Results data */
|
|
struct file *file;
|
|
zpios_stats_t stats;
|
|
|
|
thread_data_t **threads;
|
|
zpios_region_t regions[0]; /* Must be last element */
|
|
} run_args_t;
|
|
|
|
#define ZPIOS_INFO_BUFFER_SIZE 65536
|
|
#define ZPIOS_INFO_BUFFER_REDZONE 1024
|
|
|
|
typedef struct zpios_info {
|
|
spinlock_t info_lock;
|
|
int info_size;
|
|
char *info_buffer;
|
|
char *info_head; /* Internal kernel use only */
|
|
} zpios_info_t;
|
|
|
|
#define zpios_print(file, format, args...) \
|
|
({ zpios_info_t *_info_ = (zpios_info_t *)file->private_data; \
|
|
int _rc_; \
|
|
\
|
|
ASSERT(_info_); \
|
|
ASSERT(_info_->info_buffer); \
|
|
\
|
|
spin_lock(&_info_->info_lock); \
|
|
\
|
|
/* Don't allow the kernel to start a write in the red zone */ \
|
|
if ((int)(_info_->info_head - _info_->info_buffer) > \
|
|
(_info_->info_size - ZPIOS_INFO_BUFFER_REDZONE)) { \
|
|
_rc_ = -EOVERFLOW; \
|
|
} else { \
|
|
_rc_ = sprintf(_info_->info_head, format, args); \
|
|
if (_rc_ >= 0) \
|
|
_info_->info_head += _rc_; \
|
|
} \
|
|
\
|
|
spin_unlock(&_info_->info_lock); \
|
|
_rc_; \
|
|
})
|
|
|
|
#define zpios_vprint(file, test, format, args...) \
|
|
zpios_print(file, "%*s: " format, ZPIOS_NAME_SIZE, test, args)
|
|
|
|
#endif /* _ZPIOS_INTERNAL_H */
|