summaryrefslogtreecommitdiff
path: root/include/linux
diff options
context:
space:
mode:
authorBenjamin LaHaise <bcrl@toomuch.toronto.redhat.com>2002-10-09 06:32:32 -0400
committerBenjamin LaHaise <bcrl@toomuch.toronto.redhat.com>2002-10-09 06:32:32 -0400
commit531fc7be36f9dfd346517a5f116ac7d8bc9bc600 (patch)
tree754b973b478c6152e0c3aff7d841e7e907971a9a /include/linux
parente38e1e7fd9c2efd5cde15312e0ec484dbf414a7e (diff)
parent040ffec611f128b1e1d7e6ae9f79964029855355 (diff)
Merge toomuch.toronto.redhat.com:/md0/linus-2.5
into toomuch.toronto.redhat.com:/md0/aio-2.5
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/aio.h43
-rw-r--r--include/linux/fs.h6
-rw-r--r--include/linux/kernel.h3
3 files changed, 45 insertions, 7 deletions
diff --git a/include/linux/aio.h b/include/linux/aio.h
index c819f731e4a2..c03d92d84e39 100644
--- a/include/linux/aio.h
+++ b/include/linux/aio.h
@@ -2,10 +2,11 @@
#define __LINUX__AIO_H
#include <linux/list.h>
-#include <asm/atomic.h>
-
+#include <linux/workqueue.h>
#include <linux/aio_abi.h>
+#include <asm/atomic.h>
+
#define AIO_MAXSEGS 4
#define AIO_KIOGRP_NR_ATOMIC 8
@@ -22,28 +23,54 @@ struct kioctx;
#define KIOCB_SYNC_KEY (~0U)
-#define KIOCB_PRIVATE_SIZE (16 * sizeof(long))
+#define KIOCB_PRIVATE_SIZE (24 * sizeof(long))
+
+/* ki_flags bits */
+#define KIF_LOCKED 0
+#define KIF_KICKED 1
+#define KIF_CANCELLED 2
+
+#define kiocbTryLock(iocb) test_and_set_bit(KIF_LOCKED, &(iocb)->ki_flags)
+#define kiocbTryKick(iocb) test_and_set_bit(KIF_KICKED, &(iocb)->ki_flags)
+
+#define kiocbSetLocked(iocb) set_bit(KIF_LOCKED, &(iocb)->ki_flags)
+#define kiocbSetKicked(iocb) set_bit(KIF_KICKED, &(iocb)->ki_flags)
+#define kiocbSetCancelled(iocb) set_bit(KIF_CANCELLED, &(iocb)->ki_flags)
+
+#define kiocbClearLocked(iocb) set_bit(KIF_LOCKED, &(iocb)->ki_flags)
+#define kiocbClearKicked(iocb) set_bit(KIF_KICKED, &(iocb)->ki_flags)
+#define kiocbClearCancelled(iocb) set_bit(KIF_CANCELLED, &(iocb)->ki_flags)
+
+#define kiocbIsLocked(iocb) test_bit(0, &(iocb)->ki_flags)
+#define kiocbIsKicked(iocb) test_bit(1, &(iocb)->ki_flags)
+#define kiocbIsCancelled(iocb) test_bit(2, &(iocb)->ki_flags)
struct kiocb {
+ struct list_head ki_run_list;
+ long ki_flags;
int ki_users;
unsigned ki_key; /* id of this request */
struct file *ki_filp;
struct kioctx *ki_ctx; /* may be NULL for sync ops */
int (*ki_cancel)(struct kiocb *, struct io_event *);
+ long (*ki_retry)(struct kiocb *);
- struct list_head ki_list;
+ struct list_head ki_list; /* the aio core uses this
+ * for cancellation */
- void *ki_data; /* for use by the the file */
void *ki_user_obj; /* pointer to userland's iocb */
__u64 ki_user_data; /* user's data for completion */
+ loff_t ki_pos;
- long private[KIOCB_PRIVATE_SIZE/sizeof(long)];
+ char private[KIOCB_PRIVATE_SIZE];
};
+#define is_sync_kiocb(iocb) ((iocb)->ki_key == KIOCB_SYNC_KEY)
#define init_sync_kiocb(x, filp) \
do { \
struct task_struct *tsk = current; \
+ (x)->ki_flags = 0; \
(x)->ki_users = 1; \
(x)->ki_key = KIOCB_SYNC_KEY; \
(x)->ki_filp = (filp); \
@@ -101,10 +128,13 @@ struct kioctx {
int reqs_active;
struct list_head active_reqs; /* used for cancellation */
+ struct list_head run_list; /* used for kicked reqs */
unsigned max_reqs;
struct aio_ring_info ring_info;
+
+ struct work_struct wq;
};
/* prototypes */
@@ -112,6 +142,7 @@ extern unsigned aio_max_size;
extern ssize_t FASTCALL(wait_on_sync_kiocb(struct kiocb *iocb));
extern int FASTCALL(aio_put_req(struct kiocb *iocb));
+extern void FASTCALL(kick_iocb(struct kiocb *iocb));
extern int FASTCALL(aio_complete(struct kiocb *iocb, long res, long res2));
extern void FASTCALL(__put_ioctx(struct kioctx *ctx));
struct mm_struct;
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 56771d8994b6..207e0044a889 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -746,7 +746,7 @@ struct file_operations {
ssize_t (*read) (struct file *, char *, size_t, loff_t *);
ssize_t (*aio_read) (struct kiocb *, char *, size_t, loff_t);
ssize_t (*write) (struct file *, const char *, size_t, loff_t *);
- ssize_t (*aio_write) (struct kiocb *, char *, size_t, loff_t);
+ ssize_t (*aio_write) (struct kiocb *, const char *, size_t, loff_t);
int (*readdir) (struct file *, void *, filldir_t);
unsigned int (*poll) (struct file *, struct poll_table_struct *);
int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
@@ -1238,6 +1238,10 @@ extern int generic_file_mmap(struct file *, struct vm_area_struct *);
extern int file_read_actor(read_descriptor_t * desc, struct page *page, unsigned long offset, unsigned long size);
extern ssize_t generic_file_read(struct file *, char *, size_t, loff_t *);
extern ssize_t generic_file_write(struct file *, const char *, size_t, loff_t *);
+extern ssize_t generic_file_aio_read(struct kiocb *, char *, size_t, loff_t);
+extern ssize_t generic_file_aio_write(struct kiocb *, const char *, size_t, loff_t);
+extern ssize_t do_sync_read(struct file *filp, char *buf, size_t len, loff_t *ppos);
+extern ssize_t do_sync_write(struct file *filp, const char *buf, size_t len, loff_t *ppos);
ssize_t generic_file_write_nolock(struct file *file, const struct iovec *iov,
unsigned long nr_segs, loff_t *ppos);
extern ssize_t generic_file_sendfile(struct file *, struct file *, loff_t *, size_t);
diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index 44c38b134498..2def6ba70584 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -201,6 +201,9 @@ struct sysinfo {
#define BUG_ON(condition) do { if (unlikely((condition)!=0)) BUG(); } while(0)
+extern void BUILD_BUG(void);
+#define BUILD_BUG_ON(condition) do { if (condition) BUILD_BUG(); } while(0)
+
/* Trap pasters of __FUNCTION__ at compile-time */
#if __GNUC__ > 2 || __GNUC_MINOR__ >= 95
#define __FUNCTION__ (__func__)