diff options
| author | James Simmons <jsimmons@maxwell.earthlink.net> | 2002-09-14 22:09:04 -0700 |
|---|---|---|
| committer | James Simmons <jsimmons@maxwell.earthlink.net> | 2002-09-14 22:09:04 -0700 |
| commit | 2f0517d7dda0e8a8742e25a50315df956256994e (patch) | |
| tree | 0b1f345b5c7801ac981fe2e7847343445e42e0e5 /include/linux | |
| parent | 3c1eb3f2135f72b7e5fe1fbf2e58f33f853b85d0 (diff) | |
| parent | c7ce0140c9cdde187646278559d7a13e740b86d1 (diff) | |
Merge bk://linus.bkbits.net/linux-2.5
into maxwell.earthlink.net:/usr/src/linus-2.5
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/aio.h | 22 | ||||
| -rw-r--r-- | include/linux/fs.h | 19 | ||||
| -rw-r--r-- | include/linux/init_task.h | 31 | ||||
| -rw-r--r-- | include/linux/llc.h | 11 | ||||
| -rw-r--r-- | include/linux/pci_ids.h | 1 | ||||
| -rw-r--r-- | include/linux/sched.h | 38 | ||||
| -rw-r--r-- | include/linux/uio.h | 15 |
7 files changed, 90 insertions, 47 deletions
diff --git a/include/linux/aio.h b/include/linux/aio.h index 04f710ac0cc2..c819f731e4a2 100644 --- a/include/linux/aio.h +++ b/include/linux/aio.h @@ -1,7 +1,6 @@ #ifndef __LINUX__AIO_H #define __LINUX__AIO_H -#include <linux/tqueue.h> #include <linux/list.h> #include <asm/atomic.h> @@ -21,10 +20,14 @@ struct kioctx; #define KIOCB_C_CANCELLED 0x01 #define KIOCB_C_COMPLETE 0x02 +#define KIOCB_SYNC_KEY (~0U) + #define KIOCB_PRIVATE_SIZE (16 * sizeof(long)) struct kiocb { 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 *); @@ -34,17 +37,19 @@ struct kiocb { 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 */ - unsigned ki_key; /* id of this request */ long private[KIOCB_PRIVATE_SIZE/sizeof(long)]; }; -#define init_sync_kiocb(x, filp) \ - do { \ - (x)->ki_users = 1; \ - (x)->ki_filp = (filp); \ - (x)->ki_ctx = 0; \ - (x)->ki_cancel = NULL; \ +#define init_sync_kiocb(x, filp) \ + do { \ + struct task_struct *tsk = current; \ + (x)->ki_users = 1; \ + (x)->ki_key = KIOCB_SYNC_KEY; \ + (x)->ki_filp = (filp); \ + (x)->ki_ctx = &tsk->active_mm->default_kioctx; \ + (x)->ki_cancel = NULL; \ + (x)->ki_user_obj = tsk; \ } while (0) #define AIO_RING_MAGIC 0xa10a10a1 @@ -105,6 +110,7 @@ struct kioctx { /* prototypes */ 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 int FASTCALL(aio_complete(struct kiocb *iocb, long res, long res2)); extern void FASTCALL(__put_ioctx(struct kioctx *ctx)); diff --git a/include/linux/fs.h b/include/linux/fs.h index d58cd8b88fa8..622481a00115 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -307,8 +307,7 @@ struct address_space_operations { int (*bmap)(struct address_space *, long); int (*invalidatepage) (struct page *, unsigned long); int (*releasepage) (struct page *, int); - int (*direct_IO)(int, struct inode *, char *buf, - loff_t offset, size_t count); + int (*direct_IO)(int, struct inode *, const struct iovec *iov, loff_t offset, unsigned long nr_segs); }; struct backing_dev_info; @@ -1245,14 +1244,18 @@ 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_write_nolock(struct file *, const char *, size_t, loff_t *); +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); extern void do_generic_file_read(struct file *, loff_t *, read_descriptor_t *, read_actor_t); -ssize_t generic_file_direct_IO(int rw, struct inode *inode, char *buf, - loff_t offset, size_t count); -int generic_direct_IO(int rw, struct inode *inode, char *buf, - loff_t offset, size_t count, get_blocks_t *get_blocks); - +extern ssize_t generic_file_direct_IO(int rw, struct inode *inode, + const struct iovec *iov, loff_t offset, unsigned long nr_segs); +extern int generic_direct_IO(int rw, struct inode *inode, const struct iovec + *iov, loff_t offset, unsigned long nr_segs, get_blocks_t *get_blocks); +extern ssize_t generic_file_readv(struct file *filp, const struct iovec *iov, + unsigned long nr_segs, loff_t *ppos); +ssize_t generic_file_writev(struct file *filp, const struct iovec *iov, + unsigned long nr_segs, loff_t *ppos); extern loff_t no_llseek(struct file *file, loff_t offset, int origin); extern loff_t generic_file_llseek(struct file *file, loff_t offset, int origin); extern loff_t remote_llseek(struct file *file, loff_t offset, int origin); diff --git a/include/linux/init_task.h b/include/linux/init_task.h index bdf03241a009..4bd8a09d2bbc 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h @@ -18,15 +18,29 @@ .fd_array = { NULL, } \ } +#define INIT_KIOCTX(name, which_mm) \ +{ \ + .users = ATOMIC_INIT(1), \ + .dead = 0, \ + .mm = &which_mm, \ + .user_id = 0, \ + .next = NULL, \ + .wait = __WAIT_QUEUE_HEAD_INITIALIZER(name.wait), \ + .ctx_lock = SPIN_LOCK_UNLOCKED, \ + .reqs_active = 0U, \ + .max_reqs = ~0U, \ +} + #define INIT_MM(name) \ -{ \ - .mm_rb = RB_ROOT, \ - .pgd = swapper_pg_dir, \ - .mm_users = ATOMIC_INIT(2), \ - .mm_count = ATOMIC_INIT(1), \ - .mmap_sem = __RWSEM_INITIALIZER(name.mmap_sem), \ - .page_table_lock = SPIN_LOCK_UNLOCKED, \ - .mmlist = LIST_HEAD_INIT(name.mmlist), \ +{ \ + .mm_rb = RB_ROOT, \ + .pgd = swapper_pg_dir, \ + .mm_users = ATOMIC_INIT(2), \ + .mm_count = ATOMIC_INIT(1), \ + .mmap_sem = __RWSEM_INITIALIZER(name.mmap_sem), \ + .page_table_lock = SPIN_LOCK_UNLOCKED, \ + .mmlist = LIST_HEAD_INIT(name.mmlist), \ + .default_kioctx = INIT_KIOCTX(name.default_kioctx, name), \ } #define INIT_SIGNALS(sig) { \ @@ -61,6 +75,7 @@ .parent = &tsk, \ .children = LIST_HEAD_INIT(tsk.children), \ .sibling = LIST_HEAD_INIT(tsk.sibling), \ + .group_leader = &tsk, \ .thread_group = LIST_HEAD_INIT(tsk.thread_group), \ .wait_chldexit = __WAIT_QUEUE_HEAD_INITIALIZER(tsk.wait_chldexit),\ .real_timer = { \ diff --git a/include/linux/llc.h b/include/linux/llc.h index 824a149e9e6b..77ac5d9df544 100644 --- a/include/linux/llc.h +++ b/include/linux/llc.h @@ -78,17 +78,6 @@ enum llc_sockopts { #define LLC_SAP_DYN_STOP 0xDE #define LLC_SAP_DYN_TRIES 4 -struct sock; - -struct llc_ui_opt { - u16 link; /* network layer link number */ - struct llc_sap *sap; /* pointer to parent SAP */ - struct sock *core_sk; - struct net_device *dev; /* device to send to remote */ - struct sockaddr_llc addr; /* address sock is bound to */ -}; - -#define llc_ui_sk(__sk) ((struct llc_ui_opt *)(__sk)->protinfo) #define llc_ui_skb_cb(__skb) ((struct sockaddr_llc *)&((__skb)->cb[0])) #ifdef CONFIG_LLC_UI diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index 5eea9545b69a..9a1ad256e2cc 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h @@ -1561,6 +1561,7 @@ #define PCI_DEVICE_ID_TIGON3_5701 0x1645 #define PCI_DEVICE_ID_TIGON3_5702 0x1646 #define PCI_DEVICE_ID_TIGON3_5703 0x1647 +#define PCI_DEVICE_ID_TIGON3_5704 0x1648 #define PCI_DEVICE_ID_TIGON3_5702FE 0x164d #define PCI_DEVICE_ID_TIGON3_5702X 0x16a6 #define PCI_DEVICE_ID_TIGON3_5703X 0x16a7 diff --git a/include/linux/sched.h b/include/linux/sched.h index bdce46f40af2..5a7e7c21009f 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -169,7 +169,8 @@ struct namespace; /* Maximum number of active map areas.. This is a random (large) number */ #define MAX_MAP_COUNT (65536) -struct kioctx; +#include <linux/aio.h> + struct mm_struct { struct vm_area_struct * mmap; /* list of VMAs */ rb_root_t mm_rb; @@ -202,6 +203,8 @@ struct mm_struct { /* aio bits */ rwlock_t ioctx_list_lock; struct kioctx *ioctx_list; + + struct kioctx default_kioctx; }; extern int mmlist_nr; @@ -219,8 +222,6 @@ struct signal_struct { /* thread group exit support */ int group_exit; int group_exit_code; - - struct completion group_exit_done; }; /* @@ -316,6 +317,7 @@ struct task_struct { struct task_struct *parent; /* parent process */ struct list_head children; /* list of my children */ struct list_head sibling; /* linkage in my parent's children list */ + struct task_struct *group_leader; struct list_head thread_group; /* PID hash table linkage. */ @@ -758,14 +760,16 @@ static inline void remove_wait_queue_locked(wait_queue_head_t *q, #define remove_parent(p) list_del_init(&(p)->sibling) #define add_parent(p, parent) list_add_tail(&(p)->sibling,&(parent)->children) -#define REMOVE_LINKS(p) do { \ - list_del_init(&(p)->tasks); \ - remove_parent(p); \ +#define REMOVE_LINKS(p) do { \ + if (thread_group_leader(p)) \ + list_del_init(&(p)->tasks); \ + remove_parent(p); \ } while (0) -#define SET_LINKS(p) do { \ - list_add_tail(&(p)->tasks,&init_task.tasks); \ - add_parent(p, (p)->parent); \ +#define SET_LINKS(p) do { \ + if (thread_group_leader(p)) \ + list_add_tail(&(p)->tasks,&init_task.tasks); \ + add_parent(p, (p)->parent); \ } while (0) static inline struct task_struct *eldest_child(struct task_struct *p) @@ -795,11 +799,18 @@ static inline struct task_struct *younger_sibling(struct task_struct *p) #define next_task(p) list_entry((p)->tasks.next, struct task_struct, tasks) #define prev_task(p) list_entry((p)->tasks.prev, struct task_struct, tasks) -#define for_each_task(p) \ +#define for_each_process(p) \ for (p = &init_task ; (p = next_task(p)) != &init_task ; ) -#define for_each_thread(task) \ - for (task = next_thread(current) ; task != current ; task = next_thread(task)) +/* + * Careful: do_each_thread/while_each_thread is a double loop so + * 'break' will not work as expected - use goto instead. + */ +#define do_each_thread(g, t) \ + for (g = t = &init_task ; (g = t = next_task(g)) != &init_task ; ) do + +#define while_each_thread(g, t) \ + while ((t = next_thread(t)) != g) static inline task_t *next_thread(task_t *p) { @@ -827,6 +838,9 @@ static inline task_t *prev_thread(task_t *p) #define thread_group_leader(p) (p->pid == p->tgid) +#define delay_group_leader(p) \ + (p->tgid == p->pid && !list_empty(&p->thread_group)) + extern void unhash_process(struct task_struct *p); /* Protects ->fs, ->files, ->mm, and synchronises with wait4(). Nests inside tasklist_lock */ diff --git a/include/linux/uio.h b/include/linux/uio.h index beaafffd3cfb..ec098c8e6793 100644 --- a/include/linux/uio.h +++ b/include/linux/uio.h @@ -34,4 +34,19 @@ struct iovec /* Beg pardon: BSD has 1024 --ANK */ #endif +/* + * Total number of bytes covered by an iovec + */ +static inline size_t iov_length(const struct iovec *iov, unsigned long nr_segs) +{ + unsigned long seg; + size_t ret = 0; + + for (seg = 0; seg < nr_segs; seg++) + ret += iov[seg].iov_len; + return ret; +} + +unsigned long iov_shorten(struct iovec *iov, unsigned long nr_segs, size_t to); + #endif |
