diff options
Diffstat (limited to 'fs/aio.c')
| -rw-r--r-- | fs/aio.c | 61 | 
1 files changed, 61 insertions, 0 deletions
@@ -45,6 +45,67 @@  #define dprintk(x...)	do { ; } while (0)  #endif +#define AIO_RING_MAGIC			0xa10a10a1 +#define AIO_RING_COMPAT_FEATURES	1 +#define AIO_RING_INCOMPAT_FEATURES	0 +struct aio_ring { +	unsigned	id;	/* kernel internal index number */ +	unsigned	nr;	/* number of io_events */ +	unsigned	head; +	unsigned	tail; + +	unsigned	magic; +	unsigned	compat_features; +	unsigned	incompat_features; +	unsigned	header_length;	/* size of aio_ring */ + + +	struct io_event		io_events[0]; +}; /* 128 bytes + ring size */ + +#define AIO_RING_PAGES	8 +struct aio_ring_info { +	unsigned long		mmap_base; +	unsigned long		mmap_size; + +	struct page		**ring_pages; +	spinlock_t		ring_lock; +	long			nr_pages; + +	unsigned		nr, tail; + +	struct page		*internal_pages[AIO_RING_PAGES]; +}; + +static inline unsigned aio_ring_avail(struct aio_ring_info *info, +					struct aio_ring *ring) +{ +	return (ring->head + info->nr - 1 - ring->tail) % info->nr; +} + +struct kioctx { +	atomic_t		users; +	int			dead; + +	/* This needs improving */ +	unsigned long		user_id; +	struct hlist_node	list; + +	wait_queue_head_t	wait; + +	spinlock_t		ctx_lock; + +	int			reqs_active; +	struct list_head	active_reqs;	/* used for cancellation */ + +	/* sys_io_setup currently limits this to an unsigned int */ +	unsigned		max_reqs; + +	struct aio_ring_info	ring_info; + +	struct rcu_head		rcu_head; +}; +  /*------ sysctl variables----*/  static DEFINE_SPINLOCK(aio_nr_lock);  unsigned long aio_nr;		/* current system wide number of aio requests */  |