diff --git a/package/powerpc/mac-fdisk/mac-fdisk.conf b/package/powerpc/mac-fdisk/mac-fdisk.conf index af835b66a..303bc7746 100644 --- a/package/powerpc/mac-fdisk/mac-fdisk.conf +++ b/package/powerpc/mac-fdisk/mac-fdisk.conf @@ -20,5 +20,5 @@ # # --- ROCK-COPYRIGHT-NOTE-END --- -hook_add prepatch 5 "bzcat $archdir/mac-fdisk_0.1-9.diff.bz2 | patch -p1" +hook_add prepatch 5 "bzcat $archdir/mac-fdisk_0.1-10.diff.bz2 | patch -p1" diff --git a/package/powerpc/mac-fdisk/mac-fdisk.desc b/package/powerpc/mac-fdisk/mac-fdisk.desc index 223691693..7a001dc70 100644 --- a/package/powerpc/mac-fdisk/mac-fdisk.desc +++ b/package/powerpc/mac-fdisk/mac-fdisk.desc @@ -34,9 +34,9 @@ [L] GPL [S] Beta -[V] 1.1-9 +[V] 0.1-10 [P] X -?---5---9 180.400 [D] 3452460732 mac-fdisk_0.1.orig.tar.gz http://ftp.debian.org/debian/pool/main/m/mac-fdisk/ -[D] 2551054905 mac-fdisk_0.1-9.diff.gz http://ftp.debian.org/debian/pool/main/m/mac-fdisk/ +[D] 1233512592 mac-fdisk_0.1-10.diff.gz http://ftp.debian.org/debian/pool/main/m/mac-fdisk/ diff --git a/package/powerpc/mac-fdisk/own-kernel-headers.patch b/package/powerpc/mac-fdisk/own-kernel-headers.patch new file mode 100644 index 000000000..a11e9a338 --- /dev/null +++ b/package/powerpc/mac-fdisk/own-kernel-headers.patch @@ -0,0 +1,3228 @@ +--- ./fdisk.c.orig 2004-08-20 03:17:46.327259224 +0000 ++++ ./fdisk.c 2004-08-20 03:18:11.030503760 +0000 +@@ -70,13 +70,13 @@ + + #include + +-#include ++#include "linux/types.h" + + typedef unsigned short kdev_t; /* BAD hack; kdev_t is not exported */ + +-#include +-#include +-#include ++#include "linux/genhd.h" ++#include "linux/hdreg.h" ++#include "linux/fs.h" + + #include "fdisk.h" + +--- ./linux/fs.h 1970-01-01 00:00:00.000000000 +0000 ++++ ./linux/fs.h 2004-08-20 03:20:18.126182280 +0000 +@@ -0,0 +1,1724 @@ ++#ifndef _LINUX_FS_H ++#define _LINUX_FS_H ++ ++/* ++ * This file has definitions for some important file table ++ * structures etc. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include "vfs.h" ++#include ++#include ++#include ++#include "list.h" ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++struct poll_table_struct; ++ ++ ++/* ++ * It's silly to have NR_OPEN bigger than NR_FILE, but you can change ++ * the file limit at runtime and only root can increase the per-process ++ * nr_file rlimit, so it's safe to set up a ridiculously high absolute ++ * upper limit on files-per-process. ++ * ++ * Some programs (notably those using select()) may have to be ++ * recompiled to take full advantage of the new limits.. ++ */ ++ ++/* Fixed constants first: */ ++#undef NR_OPEN ++#define NR_OPEN (1024*1024) /* Absolute upper limit on fd num */ ++#define INR_OPEN 1024 /* Initial setting for nfile rlimits */ ++ ++#define BLOCK_SIZE_BITS 10 ++#define BLOCK_SIZE (1<i_sb->s_flags & (flg)) ++ ++#define IS_RDONLY(inode) ((inode)->i_sb->s_flags & MS_RDONLY) ++#define IS_SYNC(inode) (__IS_FLG(inode, MS_SYNCHRONOUS) || ((inode)->i_flags & S_SYNC)) ++#define IS_MANDLOCK(inode) __IS_FLG(inode, MS_MANDLOCK) ++ ++#define IS_QUOTAINIT(inode) ((inode)->i_flags & S_QUOTA) ++#define IS_NOQUOTA(inode) ((inode)->i_flags & S_NOQUOTA) ++#define IS_APPEND(inode) ((inode)->i_flags & S_APPEND) ++#define IS_IMMUTABLE(inode) ((inode)->i_flags & S_IMMUTABLE) ++#define IS_NOATIME(inode) (__IS_FLG(inode, MS_NOATIME) || ((inode)->i_flags & S_NOATIME)) ++#define IS_NODIRATIME(inode) __IS_FLG(inode, MS_NODIRATIME) ++ ++#define IS_DEADDIR(inode) ((inode)->i_flags & S_DEAD) ++ ++/* the read-only stuff doesn't really belong here, but any other place is ++ probably as bad and I don't want to create yet another include file. */ ++ ++#define BLKROSET _IO(0x12,93) /* set device read-only (0 = read-write) */ ++#define BLKROGET _IO(0x12,94) /* get read-only status (0 = read_write) */ ++#define BLKRRPART _IO(0x12,95) /* re-read partition table */ ++#define BLKGETSIZE _IO(0x12,96) /* return device size /512 (long *arg) */ ++#define BLKFLSBUF _IO(0x12,97) /* flush buffer cache */ ++#define BLKRASET _IO(0x12,98) /* Set read ahead for block device */ ++#define BLKRAGET _IO(0x12,99) /* get current read ahead setting */ ++#define BLKFRASET _IO(0x12,100)/* set filesystem (mm/filemap.c) read-ahead */ ++#define BLKFRAGET _IO(0x12,101)/* get filesystem (mm/filemap.c) read-ahead */ ++#define BLKSECTSET _IO(0x12,102)/* set max sectors per request (ll_rw_blk.c) */ ++#define BLKSECTGET _IO(0x12,103)/* get max sectors per request (ll_rw_blk.c) */ ++#define BLKSSZGET _IO(0x12,104)/* get block device sector size */ ++#if 0 ++#define BLKPG _IO(0x12,105)/* See blkpg.h */ ++#define BLKELVGET _IOR(0x12,106,sizeof(blkelv_ioctl_arg_t))/* elevator get */ ++#define BLKELVSET _IOW(0x12,107,sizeof(blkelv_ioctl_arg_t))/* elevator set */ ++/* This was here just to show that the number is taken - ++ probably all these _IO(0x12,*) ioctls should be moved to blkpg.h. */ ++#endif ++/* A jump here: 108-111 have been used for various private purposes. */ ++#define BLKBSZGET _IOR(0x12,112,sizeof(int)) ++#define BLKBSZSET _IOW(0x12,113,sizeof(int)) ++#define BLKGETSIZE64 _IOR(0x12,114,sizeof(u64)) /* return device size in bytes (u64 *arg) */ ++ ++#define BMAP_IOCTL 1 /* obsolete - kept for compatibility */ ++#define FIBMAP _IO(0x00,1) /* bmap access */ ++#define FIGETBSZ _IO(0x00,2) /* get the block size used for bmap */ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include ++ ++extern void update_atime (struct inode *); ++extern void update_mctime (struct inode *); ++#define UPDATE_ATIME(inode) update_atime (inode) ++ ++extern void buffer_init(unsigned long); ++extern void inode_init(unsigned long); ++extern void mnt_init(unsigned long); ++extern void files_init(unsigned long mempages); ++ ++/* bh state bits */ ++enum bh_state_bits { ++ BH_Uptodate, /* 1 if the buffer contains valid data */ ++ BH_Dirty, /* 1 if the buffer is dirty */ ++ BH_Lock, /* 1 if the buffer is locked */ ++ BH_Req, /* 0 if the buffer has been invalidated */ ++ BH_Mapped, /* 1 if the buffer has a disk mapping */ ++ BH_New, /* 1 if the buffer is new and not yet written out */ ++ BH_Async, /* 1 if the buffer is under end_buffer_io_async I/O */ ++ BH_Wait_IO, /* 1 if we should write out this buffer */ ++ BH_Launder, /* 1 if we can throttle on this buffer */ ++ BH_Attached, /* 1 if b_inode_buffers is linked into a list */ ++ BH_JBD, /* 1 if it has an attached journal_head */ ++ BH_Sync, /* 1 if the buffer is a sync read */ ++ BH_Delay, /* 1 if the buffer is delayed allocate */ ++ ++ BH_PrivateStart,/* not a state bit, but the first bit available ++ * for private allocation by other entities ++ */ ++}; ++ ++#define MAX_BUF_PER_PAGE (PAGE_CACHE_SIZE / 512) ++ ++/* ++ * Try to keep the most commonly used fields in single cache lines (16 ++ * bytes) to improve performance. This ordering should be ++ * particularly beneficial on 32-bit processors. ++ * ++ * We use the first 16 bytes for the data which is used in searches ++ * over the block hash lists (ie. getblk() and friends). ++ * ++ * The second 16 bytes we use for lru buffer scans, as used by ++ * sync_buffers() and refill_freelist(). -- sct ++ */ ++struct buffer_head { ++ /* First cache line: */ ++ struct buffer_head *b_next; /* Hash queue list */ ++ unsigned long b_blocknr; /* block number */ ++ unsigned short b_size; /* block size */ ++ unsigned short b_list; /* List that this buffer appears */ ++ kdev_t b_dev; /* device (B_FREE = free) */ ++ ++ atomic_t b_count; /* users using this block */ ++ kdev_t b_rdev; /* Real device */ ++ unsigned long b_state; /* buffer state bitmap (see above) */ ++ unsigned long b_flushtime; /* Time when (dirty) buffer should be written */ ++ ++ struct buffer_head *b_next_free;/* lru/free list linkage */ ++ struct buffer_head *b_prev_free;/* doubly linked list of buffers */ ++ struct buffer_head *b_this_page;/* circular list of buffers in one page */ ++ struct buffer_head *b_reqnext; /* request queue */ ++ ++ struct buffer_head **b_pprev; /* doubly linked list of hash-queue */ ++ char * b_data; /* pointer to data block */ ++ struct page *b_page; /* the page this bh is mapped to */ ++ void (*b_end_io)(struct buffer_head *bh, int uptodate); /* I/O completion */ ++ void *b_private; /* reserved for b_end_io */ ++ ++ unsigned long b_rsector; /* Real buffer location on disk */ ++ wait_queue_head_t b_wait; ++ ++ struct list_head b_inode_buffers; /* doubly linked list of inode dirty buffers */ ++}; ++ ++typedef void (bh_end_io_t)(struct buffer_head *bh, int uptodate); ++void init_buffer(struct buffer_head *, bh_end_io_t *, void *); ++ ++#define __buffer_state(bh, state) (((bh)->b_state & (1UL << BH_##state)) != 0) ++ ++#define buffer_uptodate(bh) __buffer_state(bh,Uptodate) ++#define buffer_dirty(bh) __buffer_state(bh,Dirty) ++#define buffer_locked(bh) __buffer_state(bh,Lock) ++#define buffer_req(bh) __buffer_state(bh,Req) ++#define buffer_mapped(bh) __buffer_state(bh,Mapped) ++#define buffer_new(bh) __buffer_state(bh,New) ++#define buffer_async(bh) __buffer_state(bh,Async) ++#define buffer_launder(bh) __buffer_state(bh,Launder) ++#define buffer_delay(bh) __buffer_state(bh,Delay) ++ ++#define bh_offset(bh) ((unsigned long)(bh)->b_data & ~PAGE_MASK) ++ ++extern void set_bh_page(struct buffer_head *bh, struct page *page, unsigned long offset); ++ ++#define touch_buffer(bh) mark_page_accessed(bh->b_page) ++ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* ++ * Attribute flags. These should be or-ed together to figure out what ++ * has been changed! ++ */ ++#define ATTR_MODE 1 ++#define ATTR_UID 2 ++#define ATTR_GID 4 ++#define ATTR_SIZE 8 ++#define ATTR_ATIME 16 ++#define ATTR_MTIME 32 ++#define ATTR_CTIME 64 ++#define ATTR_ATIME_SET 128 ++#define ATTR_MTIME_SET 256 ++#define ATTR_FORCE 512 /* Not a change, but a change it */ ++#define ATTR_ATTR_FLAG 1024 ++ ++/* ++ * This is the Inode Attributes structure, used for notify_change(). It ++ * uses the above definitions as flags, to know which values have changed. ++ * Also, in this manner, a Filesystem can look at only the values it cares ++ * about. Basically, these are the attributes that the VFS layer can ++ * request to change from the FS layer. ++ * ++ * Derek Atkins 94-10-20 ++ */ ++struct iattr { ++ unsigned int ia_valid; ++ umode_t ia_mode; ++ uid_t ia_uid; ++ gid_t ia_gid; ++ loff_t ia_size; ++ time_t ia_atime; ++ time_t ia_mtime; ++ time_t ia_ctime; ++ unsigned int ia_attr_flags; ++}; ++ ++/* ++ * This is the inode attributes flag definitions ++ */ ++#define ATTR_FLAG_SYNCRONOUS 1 /* Syncronous write */ ++#define ATTR_FLAG_NOATIME 2 /* Don't update atime */ ++#define ATTR_FLAG_APPEND 4 /* Append-only file */ ++#define ATTR_FLAG_IMMUTABLE 8 /* Immutable file */ ++#define ATTR_FLAG_NODIRATIME 16 /* Don't update atime for directory */ ++ ++/* ++ * Includes for diskquotas and mount structures. ++ */ ++#include ++#include ++ ++/* ++ * oh the beauties of C type declarations. ++ */ ++struct page; ++struct address_space; ++struct kiobuf; ++ ++struct address_space_operations { ++ int (*writepage)(struct page *); ++ int (*readpage)(struct file *, struct page *); ++ int (*sync_page)(struct page *); ++ /* ++ * ext3 requires that a successful prepare_write() call be followed ++ * by a commit_write() call - they must be balanced ++ */ ++ int (*prepare_write)(struct file *, struct page *, unsigned, unsigned); ++ int (*commit_write)(struct file *, struct page *, unsigned, unsigned); ++ /* Unfortunately this kludge is needed for FIBMAP. Don't use it */ ++ int (*bmap)(struct address_space *, long); ++ int (*flushpage) (struct page *, unsigned long); ++ int (*releasepage) (struct page *, int); ++#define KERNEL_HAS_O_DIRECT /* this is for modules out of the kernel */ ++ int (*direct_IO)(int, struct inode *, struct kiobuf *, unsigned long, int); ++#define KERNEL_HAS_DIRECT_FILEIO /* Unfortunate kludge due to lack of foresight */ ++ int (*direct_fileIO)(int, struct file *, struct kiobuf *, unsigned long, int); ++ void (*removepage)(struct page *); /* called when page gets removed from the inode */ ++}; ++ ++struct address_space { ++ struct list_head clean_pages; /* list of clean pages */ ++ struct list_head dirty_pages; /* list of dirty pages */ ++ struct list_head locked_pages; /* list of locked pages */ ++ unsigned long nrpages; /* number of total pages */ ++ struct address_space_operations *a_ops; /* methods */ ++ struct inode *host; /* owner: inode, block_device */ ++ struct vm_area_struct *i_mmap; /* list of private mappings */ ++ struct vm_area_struct *i_mmap_shared; /* list of shared mappings */ ++ spinlock_t i_shared_lock; /* and spinlock protecting it */ ++ int gfp_mask; /* how to allocate the pages */ ++}; ++ ++struct char_device { ++ struct list_head hash; ++ atomic_t count; ++ dev_t dev; ++ atomic_t openers; ++ struct semaphore sem; ++}; ++ ++struct block_device { ++ struct list_head bd_hash; ++ atomic_t bd_count; ++ struct inode * bd_inode; ++ dev_t bd_dev; /* not a kdev_t - it's a search key */ ++ int bd_openers; ++ const struct block_device_operations *bd_op; ++ struct semaphore bd_sem; /* open/close mutex */ ++ struct list_head bd_inodes; ++}; ++ ++struct inode { ++ struct list_head i_hash; ++ struct list_head i_list; ++ struct list_head i_dentry; ++ ++ struct list_head i_dirty_buffers; ++ struct list_head i_dirty_data_buffers; ++ ++ unsigned long i_ino; ++ atomic_t i_count; ++ kdev_t i_dev; ++ umode_t i_mode; ++ nlink_t i_nlink; ++ uid_t i_uid; ++ gid_t i_gid; ++ kdev_t i_rdev; ++ loff_t i_size; ++ time_t i_atime; ++ time_t i_mtime; ++ time_t i_ctime; ++ unsigned int i_blkbits; ++ unsigned long i_blksize; ++ unsigned long i_blocks; ++ unsigned long i_version; ++ unsigned short i_bytes; ++ struct semaphore i_sem; ++ struct rw_semaphore i_alloc_sem; ++ struct semaphore i_zombie; ++ struct inode_operations *i_op; ++ struct file_operations *i_fop; /* former ->i_op->default_file_ops */ ++ struct super_block *i_sb; ++ wait_queue_head_t i_wait; ++ struct file_lock *i_flock; ++ struct address_space *i_mapping; ++ struct address_space i_data; ++ struct dquot *i_dquot[MAXQUOTAS]; ++ /* These three should probably be a union */ ++ struct list_head i_devices; ++ struct pipe_inode_info *i_pipe; ++ struct block_device *i_bdev; ++ struct char_device *i_cdev; ++ ++ unsigned long i_dnotify_mask; /* Directory notify events */ ++ struct dnotify_struct *i_dnotify; /* for directory notifications */ ++ ++ unsigned long i_state; ++ ++ unsigned int i_flags; ++ unsigned char i_sock; ++ ++ atomic_t i_writecount; ++ unsigned int i_attr_flags; ++ __u32 i_generation; ++ union { ++ struct minix_inode_info minix_i; ++ struct ext2_inode_info ext2_i; ++ struct ext3_inode_info ext3_i; ++ struct hpfs_inode_info hpfs_i; ++ struct ntfs_inode_info ntfs_i; ++ struct msdos_inode_info msdos_i; ++ struct umsdos_inode_info umsdos_i; ++ struct iso_inode_info isofs_i; ++ struct nfs_inode_info nfs_i; ++ struct sysv_inode_info sysv_i; ++ struct affs_inode_info affs_i; ++ struct ufs_inode_info ufs_i; ++ struct efs_inode_info efs_i; ++ struct romfs_inode_info romfs_i; ++ struct shmem_inode_info shmem_i; ++ struct coda_inode_info coda_i; ++ struct smb_inode_info smbfs_i; ++ struct hfs_inode_info hfs_i; ++ struct adfs_inode_info adfs_i; ++ struct qnx4_inode_info qnx4_i; ++ struct reiserfs_inode_info reiserfs_i; ++ struct bfs_inode_info bfs_i; ++ struct udf_inode_info udf_i; ++ struct ncp_inode_info ncpfs_i; ++ struct proc_inode_info proc_i; ++ struct socket socket_i; ++ struct usbdev_inode_info usbdev_i; ++ struct jffs2_inode_info jffs2_i; ++ void *generic_ip; ++ } u; ++}; ++ ++static inline void inode_add_bytes(struct inode *inode, loff_t bytes) ++{ ++ inode->i_blocks += bytes >> 9; ++ bytes &= 511; ++ inode->i_bytes += bytes; ++ if (inode->i_bytes >= 512) { ++ inode->i_blocks++; ++ inode->i_bytes -= 512; ++ } ++} ++ ++static inline void inode_sub_bytes(struct inode *inode, loff_t bytes) ++{ ++ inode->i_blocks -= bytes >> 9; ++ bytes &= 511; ++ if (inode->i_bytes < bytes) { ++ inode->i_blocks--; ++ inode->i_bytes += 512; ++ } ++ inode->i_bytes -= bytes; ++} ++ ++static inline loff_t inode_get_bytes(struct inode *inode) ++{ ++ return (((loff_t)inode->i_blocks) << 9) + inode->i_bytes; ++} ++ ++static inline void inode_set_bytes(struct inode *inode, loff_t bytes) ++{ ++ inode->i_blocks = bytes >> 9; ++ inode->i_bytes = bytes & 511; ++} ++ ++struct fown_struct { ++ int pid; /* pid or -pgrp where SIGIO should be sent */ ++ uid_t uid, euid; /* uid/euid of process setting the owner */ ++ int signum; /* posix.1b rt signal to be delivered on IO */ ++}; ++ ++struct file { ++ struct list_head f_list; ++ struct dentry *f_dentry; ++ struct vfsmount *f_vfsmnt; ++ struct file_operations *f_op; ++ atomic_t f_count; ++ unsigned int f_flags; ++ mode_t f_mode; ++ loff_t f_pos; ++ unsigned long f_reada, f_ramax, f_raend, f_ralen, f_rawin; ++ struct fown_struct f_owner; ++ unsigned int f_uid, f_gid; ++ int f_error; ++ ++ unsigned long f_version; ++ ++ /* needed for tty driver, and maybe others */ ++ void *private_data; ++ ++ /* preallocated helper kiobuf to speedup O_DIRECT */ ++ struct kiobuf *f_iobuf; ++ long f_iobuf_lock; ++}; ++extern spinlock_t files_lock; ++#define file_list_lock() spin_lock(&files_lock); ++#define file_list_unlock() spin_unlock(&files_lock); ++ ++#define get_file(x) atomic_inc(&(x)->f_count) ++#define file_count(x) atomic_read(&(x)->f_count) ++ ++extern int init_private_file(struct file *, struct dentry *, int); ++ ++#define MAX_NON_LFS ((1UL<<31) - 1) ++ ++/* Page cache limit. The filesystems should put that into their s_maxbytes ++ limits, otherwise bad things can happen in VM. */ ++#if BITS_PER_LONG==32 ++#define MAX_LFS_FILESIZE (((u64)PAGE_CACHE_SIZE << (BITS_PER_LONG-1))-1) ++#elif BITS_PER_LONG==64 ++#define MAX_LFS_FILESIZE 0x7fffffffffffffff ++#endif ++ ++#define FL_POSIX 1 ++#define FL_FLOCK 2 ++#define FL_BROKEN 4 /* broken flock() emulation */ ++#define FL_ACCESS 8 /* for processes suspended by mandatory locking */ ++#define FL_LOCKD 16 /* lock held by rpc.lockd */ ++#define FL_LEASE 32 /* lease held on this file */ ++ ++/* ++ * The POSIX file lock owner is determined by ++ * the "struct files_struct" in the thread group ++ * (or NULL for no owner - BSD locks). ++ * ++ * Lockd stuffs a "host" pointer into this. ++ */ ++typedef struct files_struct *fl_owner_t; ++ ++struct file_lock { ++ struct file_lock *fl_next; /* singly linked list for this inode */ ++ struct list_head fl_link; /* doubly linked list of all locks */ ++ struct list_head fl_block; /* circular list of blocked processes */ ++ fl_owner_t fl_owner; ++ unsigned int fl_pid; ++ wait_queue_head_t fl_wait; ++ struct file *fl_file; ++ unsigned char fl_flags; ++ unsigned char fl_type; ++ loff_t fl_start; ++ loff_t fl_end; ++ ++ void (*fl_notify)(struct file_lock *); /* unblock callback */ ++ void (*fl_insert)(struct file_lock *); /* lock insertion callback */ ++ void (*fl_remove)(struct file_lock *); /* lock removal callback */ ++ ++ struct fasync_struct * fl_fasync; /* for lease break notifications */ ++ unsigned long fl_break_time; /* for nonblocking lease breaks */ ++ ++ union { ++ struct nfs_lock_info nfs_fl; ++ } fl_u; ++}; ++ ++/* The following constant reflects the upper bound of the file/locking space */ ++#ifndef OFFSET_MAX ++#define INT_LIMIT(x) (~((x)1 << (sizeof(x)*8 - 1))) ++#define OFFSET_MAX INT_LIMIT(loff_t) ++#define OFFT_OFFSET_MAX INT_LIMIT(off_t) ++#endif ++ ++extern struct list_head file_lock_list; ++ ++#include ++ ++extern int fcntl_getlk(unsigned int, struct flock *); ++extern int fcntl_setlk(unsigned int, unsigned int, struct flock *); ++ ++extern int fcntl_getlk64(unsigned int, struct flock64 *); ++extern int fcntl_setlk64(unsigned int, unsigned int, struct flock64 *); ++ ++/* fs/locks.c */ ++extern void locks_init_lock(struct file_lock *); ++extern void locks_copy_lock(struct file_lock *, struct file_lock *); ++extern void locks_remove_posix(struct file *, fl_owner_t); ++extern void locks_remove_flock(struct file *); ++extern struct file_lock *posix_test_lock(struct file *, struct file_lock *); ++extern int posix_lock_file(struct file *, struct file_lock *, unsigned int); ++extern void posix_block_lock(struct file_lock *, struct file_lock *); ++extern void posix_unblock_lock(struct file_lock *); ++extern int posix_locks_deadlock(struct file_lock *, struct file_lock *); ++extern int __get_lease(struct inode *inode, unsigned int flags); ++extern time_t lease_get_mtime(struct inode *); ++extern int lock_may_read(struct inode *, loff_t start, unsigned long count); ++extern int lock_may_write(struct inode *, loff_t start, unsigned long count); ++extern void steal_locks(fl_owner_t from); ++ ++struct fasync_struct { ++ int magic; ++ int fa_fd; ++ struct fasync_struct *fa_next; /* singly linked list */ ++ struct file *fa_file; ++}; ++ ++#define FASYNC_MAGIC 0x4601 ++ ++/* SMP safe fasync helpers: */ ++extern int fasync_helper(int, struct file *, int, struct fasync_struct **); ++/* can be called from interrupts */ ++extern void kill_fasync(struct fasync_struct **, int, int); ++/* only for net: no internal synchronization */ ++extern void __kill_fasync(struct fasync_struct *, int, int); ++ ++struct nameidata { ++ struct dentry *dentry; ++ struct vfsmount *mnt; ++ struct qstr last; ++ unsigned int flags; ++ int last_type; ++}; ++ ++/* ++ * Umount options ++ */ ++ ++#define MNT_FORCE 0x00000001 /* Attempt to forcibily umount */ ++#define MNT_DETACH 0x00000002 /* Just detach from the tree */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++extern struct list_head super_blocks; ++extern spinlock_t sb_lock; ++ ++#define sb_entry(list) list_entry((list), struct super_block, s_list) ++#define S_BIAS (1<<30) ++struct super_block { ++ struct list_head s_list; /* Keep this first */ ++ kdev_t s_dev; ++ unsigned long s_blocksize; ++ unsigned char s_blocksize_bits; ++ unsigned char s_dirt; ++ unsigned long long s_maxbytes; /* Max file size */ ++ struct file_system_type *s_type; ++ struct super_operations *s_op; ++ struct dquot_operations *dq_op; ++ struct quotactl_ops *s_qcop; ++ unsigned long s_flags; ++ unsigned long s_magic; ++ struct dentry *s_root; ++ struct rw_semaphore s_umount; ++ struct semaphore s_lock; ++ int s_count; ++ atomic_t s_active; ++ ++ struct list_head s_dirty; /* dirty inodes */ ++ struct list_head s_locked_inodes;/* inodes being synced */ ++ struct list_head s_files; ++ ++ struct block_device *s_bdev; ++ struct list_head s_instances; ++ struct quota_info s_dquot; /* Diskquota specific options */ ++ ++ union { ++ struct minix_sb_info minix_sb; ++ struct ext2_sb_info ext2_sb; ++ struct ext3_sb_info ext3_sb; ++ struct hpfs_sb_info hpfs_sb; ++ struct ntfs_sb_info ntfs_sb; ++ struct msdos_sb_info msdos_sb; ++ struct isofs_sb_info isofs_sb; ++ struct nfs_sb_info nfs_sb; ++ struct sysv_sb_info sysv_sb; ++ struct affs_sb_info affs_sb; ++ struct ufs_sb_info ufs_sb; ++ struct efs_sb_info efs_sb; ++ struct shmem_sb_info shmem_sb; ++ struct romfs_sb_info romfs_sb; ++ struct smb_sb_info smbfs_sb; ++ struct hfs_sb_info hfs_sb; ++ struct adfs_sb_info adfs_sb; ++ struct qnx4_sb_info qnx4_sb; ++ struct reiserfs_sb_info reiserfs_sb; ++ struct bfs_sb_info bfs_sb; ++ struct udf_sb_info udf_sb; ++ struct ncp_sb_info ncpfs_sb; ++ struct usbdev_sb_info usbdevfs_sb; ++ struct jffs2_sb_info jffs2_sb; ++ struct cramfs_sb_info cramfs_sb; ++ void *generic_sbp; ++ } u; ++ /* ++ * The next field is for VFS *only*. No filesystems have any business ++ * even looking at it. You had been warned. ++ */ ++ struct semaphore s_vfs_rename_sem; /* Kludge */ ++ ++ /* The next field is used by knfsd when converting a (inode number based) ++ * file handle into a dentry. As it builds a path in the dcache tree from ++ * the bottom up, there may for a time be a subpath of dentrys which is not ++ * connected to the main tree. This semaphore ensure that there is only ever ++ * one such free path per filesystem. Note that unconnected files (or other ++ * non-directories) are allowed, but not unconnected diretories. ++ */ ++ struct semaphore s_nfsd_free_path_sem; ++}; ++ ++/* ++ * VFS helper functions.. ++ */ ++extern int vfs_create(struct inode *, struct dentry *, int); ++extern int vfs_mkdir(struct inode *, struct dentry *, int); ++extern int vfs_mknod(struct inode *, struct dentry *, int, dev_t); ++extern int vfs_symlink(struct inode *, struct dentry *, const char *); ++extern int vfs_link(struct dentry *, struct inode *, struct dentry *); ++extern int vfs_rmdir(struct inode *, struct dentry *); ++extern int vfs_unlink(struct inode *, struct dentry *); ++extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *); ++ ++/* ++ * File types ++ */ ++#define DT_UNKNOWN 0 ++#define DT_FIFO 1 ++#define DT_CHR 2 ++#define DT_DIR 4 ++#define DT_BLK 6 ++#define DT_REG 8 ++#define DT_LNK 10 ++#define DT_SOCK 12 ++#define DT_WHT 14 ++ ++/* ++ * This is the "filldir" function type, used by readdir() to let ++ * the kernel specify what kind of dirent layout it wants to have. ++ * This allows the kernel to read directories into kernel space or ++ * to have different dirent layouts depending on the binary type. ++ */ ++typedef int (*filldir_t)(void *, const char *, int, loff_t, ino_t, unsigned); ++ ++struct block_device_operations { ++ int (*open) (struct inode *, struct file *); ++ int (*release) (struct inode *, struct file *); ++ int (*ioctl) (struct inode *, struct file *, unsigned, unsigned long); ++ int (*check_media_change) (kdev_t); ++ int (*revalidate) (kdev_t); ++ struct module *owner; ++}; ++ ++/* ++ * NOTE: ++ * read, write, poll, fsync, readv, writev can be called ++ * without the big kernel lock held in all filesystems. ++ */ ++struct file_operations { ++ struct module *owner; ++ loff_t (*llseek) (struct file *, loff_t, int); ++ ssize_t (*read) (struct file *, char *, size_t, loff_t *); ++ ssize_t (*write) (struct file *, 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); ++ int (*mmap) (struct file *, struct vm_area_struct *); ++ int (*open) (struct inode *, struct file *); ++ int (*flush) (struct file *); ++ int (*release) (struct inode *, struct file *); ++ int (*fsync) (struct file *, struct dentry *, int datasync); ++ int (*fasync) (int, struct file *, int); ++ int (*lock) (struct file *, int, struct file_lock *); ++ ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *); ++ ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *); ++ ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); ++ unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); ++}; ++ ++struct inode_operations { ++ int (*create) (struct inode *,struct dentry *,int); ++ struct dentry * (*lookup) (struct inode *,struct dentry *); ++ int (*link) (struct dentry *,struct inode *,struct dentry *); ++ int (*unlink) (struct inode *,struct dentry *); ++ int (*symlink) (struct inode *,struct dentry *,const char *); ++ int (*mkdir) (struct inode *,struct dentry *,int); ++ int (*rmdir) (struct inode *,struct dentry *); ++ int (*mknod) (struct inode *,struct dentry *,int,int); ++ int (*rename) (struct inode *, struct dentry *, ++ struct inode *, struct dentry *); ++ int (*readlink) (struct dentry *, char *,int); ++ int (*follow_link) (struct dentry *, struct nameidata *); ++ void (*truncate) (struct inode *); ++ int (*permission) (struct inode *, int); ++ int (*revalidate) (struct dentry *); ++ int (*setattr) (struct dentry *, struct iattr *); ++ int (*getattr) (struct dentry *, struct iattr *); ++ int (*setxattr) (struct dentry *, const char *, void *, size_t, int); ++ ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); ++ ssize_t (*listxattr) (struct dentry *, char *, size_t); ++ int (*removexattr) (struct dentry *, const char *); ++}; ++ ++struct seq_file; ++ ++/* ++ * NOTE: write_inode, delete_inode, clear_inode, put_inode can be called ++ * without the big kernel lock held in all filesystems. ++ */ ++struct super_operations { ++ struct inode *(*alloc_inode)(struct super_block *sb); ++ void (*destroy_inode)(struct inode *); ++ ++ void (*read_inode) (struct inode *); ++ ++ /* reiserfs kludge. reiserfs needs 64 bits of information to ++ ** find an inode. We are using the read_inode2 call to get ++ ** that information. We don't like this, and are waiting on some ++ ** VFS changes for the real solution. ++ ** iget4 calls read_inode2, iff it is defined ++ */ ++ void (*read_inode2) (struct inode *, void *) ; ++ void (*dirty_inode) (struct inode *); ++ void (*write_inode) (struct inode *, int); ++ void (*put_inode) (struct inode *); ++ void (*delete_inode) (struct inode *); ++ void (*put_super) (struct super_block *); ++ void (*write_super) (struct super_block *); ++ int (*sync_fs) (struct super_block *); ++ void (*write_super_lockfs) (struct super_block *); ++ void (*unlockfs) (struct super_block *); ++ int (*statfs) (struct super_block *, struct statfs *); ++ int (*remount_fs) (struct super_block *, int *, char *); ++ void (*clear_inode) (struct inode *); ++ void (*umount_begin) (struct super_block *); ++ ++ /* Following are for knfsd to interact with "interesting" filesystems ++ * Currently just reiserfs, but possibly FAT and others later ++ * ++ * fh_to_dentry is given a filehandle fragement with length, and a type flag ++ * and must return a dentry for the referenced object or, if "parent" is ++ * set, a dentry for the parent of the object. ++ * If a dentry cannot be found, a "root" dentry should be created and ++ * flaged as DCACHE_NFSD_DISCONNECTED. nfsd_iget is an example implementation. ++ * ++ * dentry_to_fh is given a dentry and must generate the filesys specific ++ * part of the file handle. Available length is passed in *lenp and used ++ * length should be returned therein. ++ * If need_parent is set, then dentry_to_fh should encode sufficient information ++ * to find the (current) parent. ++ * dentry_to_fh should return a 1byte "type" which will be passed back in ++ * the fhtype arguement to fh_to_dentry. Type of 0 is reserved. ++ * If filesystem was exportable before the introduction of fh_to_dentry, ++ * types 1 and 2 should be used is that same way as the generic code. ++ * Type 255 means error. ++ * ++ * Lengths are in units of 4bytes, not bytes. ++ */ ++ struct dentry * (*fh_to_dentry)(struct super_block *sb, __u32 *fh, int len, int fhtype, int parent); ++ int (*dentry_to_fh)(struct dentry *, __u32 *fh, int *lenp, int need_parent); ++ int (*show_options)(struct seq_file *, struct vfsmount *); ++}; ++ ++/* Inode state bits.. */ ++#define I_DIRTY_SYNC 1 /* Not dirty enough for O_DATASYNC */ ++#define I_DIRTY_DATASYNC 2 /* Data-related inode changes pending */ ++#define I_DIRTY_PAGES 4 /* Data-related inode changes pending */ ++#define I_LOCK 8 ++#define I_FREEING 16 ++#define I_CLEAR 32 ++#define I_NEW 64 ++ ++#define I_DIRTY (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES) ++ ++extern void __mark_inode_dirty(struct inode *, int); ++static inline void mark_inode_dirty(struct inode *inode) ++{ ++ __mark_inode_dirty(inode, I_DIRTY); ++} ++ ++static inline void mark_inode_dirty_sync(struct inode *inode) ++{ ++ __mark_inode_dirty(inode, I_DIRTY_SYNC); ++} ++ ++static inline void mark_inode_dirty_pages(struct inode *inode) ++{ ++ __mark_inode_dirty(inode, I_DIRTY_PAGES); ++} ++ ++struct file_system_type { ++ const char *name; ++ int fs_flags; ++ struct super_block *(*read_super) (struct super_block *, void *, int); ++ struct module *owner; ++ struct file_system_type * next; ++ struct list_head fs_supers; ++}; ++ ++#define DECLARE_FSTYPE(var,type,read,flags) \ ++struct file_system_type var = { \ ++ name: type, \ ++ read_super: read, \ ++ fs_flags: flags, \ ++ owner: THIS_MODULE, \ ++} ++ ++#define DECLARE_FSTYPE_DEV(var,type,read) \ ++ DECLARE_FSTYPE(var,type,read,FS_REQUIRES_DEV) ++ ++/* Alas, no aliases. Too much hassle with bringing module.h everywhere */ ++#define fops_get(fops) \ ++ (((fops) && (fops)->owner) \ ++ ? ( try_inc_mod_count((fops)->owner) ? (fops) : NULL ) \ ++ : (fops)) ++ ++#define fops_put(fops) \ ++do { \ ++ if ((fops) && (fops)->owner) \ ++ __MOD_DEC_USE_COUNT((fops)->owner); \ ++} while(0) ++ ++extern int register_filesystem(struct file_system_type *); ++extern int unregister_filesystem(struct file_system_type *); ++extern struct vfsmount *kern_mount(struct file_system_type *); ++extern int may_umount(struct vfsmount *); ++extern long do_mount(char *, char *, char *, unsigned long, void *); ++ ++#define kern_umount mntput ++ ++extern int vfs_statfs(struct super_block *, struct statfs *); ++ ++/* Return value for VFS lock functions - tells locks.c to lock conventionally ++ * REALLY kosha for root NFS and nfs_lock ++ */ ++#define LOCK_USE_CLNT 1 ++ ++#define FLOCK_VERIFY_READ 1 ++#define FLOCK_VERIFY_WRITE 2 ++ ++extern int locks_mandatory_locked(struct inode *); ++extern int locks_mandatory_area(int, struct inode *, struct file *, loff_t, size_t); ++ ++/* ++ * Candidates for mandatory locking have the setgid bit set ++ * but no group execute bit - an otherwise meaningless combination. ++ */ ++#define MANDATORY_LOCK(inode) \ ++ (IS_MANDLOCK(inode) && ((inode)->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID) ++ ++static inline int locks_verify_locked(struct inode *inode) ++{ ++ if (MANDATORY_LOCK(inode)) ++ return locks_mandatory_locked(inode); ++ return 0; ++} ++ ++static inline int locks_verify_area(int read_write, struct inode *inode, ++ struct file *filp, loff_t offset, ++ size_t count) ++{ ++ if (inode->i_flock && MANDATORY_LOCK(inode)) ++ return locks_mandatory_area(read_write, inode, filp, offset, count); ++ return 0; ++} ++ ++static inline int locks_verify_truncate(struct inode *inode, ++ struct file *filp, ++ loff_t size) ++{ ++ if (inode->i_flock && MANDATORY_LOCK(inode)) ++ return locks_mandatory_area( ++ FLOCK_VERIFY_WRITE, inode, filp, ++ size < inode->i_size ? size : inode->i_size, ++ (size < inode->i_size ? inode->i_size - size ++ : size - inode->i_size) ++ ); ++ return 0; ++} ++ ++static inline int get_lease(struct inode *inode, unsigned int mode) ++{ ++ if (inode->i_flock) ++ return __get_lease(inode, mode); ++ return 0; ++} ++ ++/* fs/open.c */ ++ ++asmlinkage long sys_open(const char *, int, int); ++asmlinkage long sys_close(unsigned int); /* yes, it's really unsigned */ ++extern int do_truncate(struct dentry *, loff_t start); ++ ++extern struct file *filp_open(const char *, int, int); ++extern struct file * dentry_open(struct dentry *, struct vfsmount *, int); ++extern int filp_close(struct file *, fl_owner_t id); ++extern char * getname(const char *); ++ ++/* fs/dcache.c */ ++extern void vfs_caches_init(unsigned long); ++ ++#define __getname() kmem_cache_alloc(names_cachep, SLAB_KERNEL) ++#define putname(name) kmem_cache_free(names_cachep, (void *)(name)) ++ ++enum {BDEV_FILE, BDEV_SWAP, BDEV_FS, BDEV_RAW}; ++extern int register_blkdev(unsigned int, const char *, struct block_device_operations *); ++extern int unregister_blkdev(unsigned int, const char *); ++extern struct block_device *bdget(dev_t); ++extern int bd_acquire(struct inode *inode); ++extern void bd_forget(struct inode *inode); ++extern void bdput(struct block_device *); ++extern struct char_device *cdget(dev_t); ++extern void cdput(struct char_device *); ++extern int blkdev_open(struct inode *, struct file *); ++extern int blkdev_close(struct inode *, struct file *); ++extern struct file_operations def_blk_fops; ++extern struct address_space_operations def_blk_aops; ++extern struct file_operations def_fifo_fops; ++extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long); ++extern int blkdev_get(struct block_device *, mode_t, unsigned, int); ++extern int blkdev_put(struct block_device *, int); ++ ++/* fs/devices.c */ ++extern const struct block_device_operations *get_blkfops(unsigned int); ++extern int register_chrdev(unsigned int, const char *, struct file_operations *); ++extern int unregister_chrdev(unsigned int, const char *); ++extern int chrdev_open(struct inode *, struct file *); ++extern const char * bdevname(kdev_t); ++extern const char * cdevname(kdev_t); ++extern const char * kdevname(kdev_t); ++extern void init_special_inode(struct inode *, umode_t, int); ++ ++/* Invalid inode operations -- fs/bad_inode.c */ ++extern void make_bad_inode(struct inode *); ++extern int is_bad_inode(struct inode *); ++ ++extern struct file_operations read_fifo_fops; ++extern struct file_operations write_fifo_fops; ++extern struct file_operations rdwr_fifo_fops; ++extern struct file_operations read_pipe_fops; ++extern struct file_operations write_pipe_fops; ++extern struct file_operations rdwr_pipe_fops; ++ ++extern int fs_may_remount_ro(struct super_block *); ++ ++extern int FASTCALL(try_to_free_buffers(struct page *, unsigned int)); ++extern void refile_buffer(struct buffer_head * buf); ++extern void create_empty_buffers(struct page *, kdev_t, unsigned long); ++extern void end_buffer_io_sync(struct buffer_head *bh, int uptodate); ++extern void end_buffer_io_async(struct buffer_head *bh, int uptodate); ++ ++/* reiserfs_writepage needs this */ ++extern void set_buffer_async_io(struct buffer_head *bh) ; ++ ++#define BUF_CLEAN 0 ++#define BUF_LOCKED 1 /* Buffers scheduled for write */ ++#define BUF_DIRTY 2 /* Dirty buffers, not yet scheduled for write */ ++#define NR_LIST 3 ++ ++static inline void get_bh(struct buffer_head * bh) ++{ ++ atomic_inc(&(bh)->b_count); ++} ++ ++static inline void put_bh(struct buffer_head *bh) ++{ ++ smp_mb__before_atomic_dec(); ++ atomic_dec(&bh->b_count); ++} ++ ++/* ++ * This is called by bh->b_end_io() handlers when I/O has completed. ++ */ ++static inline void mark_buffer_uptodate(struct buffer_head * bh, int on) ++{ ++ if (on) ++ set_bit(BH_Uptodate, &bh->b_state); ++ else ++ clear_bit(BH_Uptodate, &bh->b_state); ++} ++ ++#define atomic_set_buffer_clean(bh) test_and_clear_bit(BH_Dirty, &(bh)->b_state) ++ ++static inline void __mark_buffer_clean(struct buffer_head *bh) ++{ ++ refile_buffer(bh); ++} ++ ++static inline void mark_buffer_clean(struct buffer_head * bh) ++{ ++ if (atomic_set_buffer_clean(bh)) ++ __mark_buffer_clean(bh); ++} ++ ++extern void FASTCALL(__mark_dirty(struct buffer_head *bh)); ++extern void FASTCALL(__mark_buffer_dirty(struct buffer_head *bh)); ++extern void FASTCALL(mark_buffer_dirty(struct buffer_head *bh)); ++ ++extern void FASTCALL(buffer_insert_list(struct buffer_head *, struct list_head *)); ++ ++static inline void buffer_insert_inode_queue(struct buffer_head *bh, struct inode *inode) ++{ ++ buffer_insert_list(bh, &inode->i_dirty_buffers); ++} ++ ++static inline void buffer_insert_inode_data_queue(struct buffer_head *bh, struct inode *inode) ++{ ++ buffer_insert_list(bh, &inode->i_dirty_data_buffers); ++} ++ ++static inline int atomic_set_buffer_dirty(struct buffer_head *bh) ++{ ++ return test_and_set_bit(BH_Dirty, &bh->b_state); ++} ++ ++static inline void mark_buffer_async(struct buffer_head * bh, int on) ++{ ++ if (on) ++ set_bit(BH_Async, &bh->b_state); ++ else ++ clear_bit(BH_Async, &bh->b_state); ++} ++ ++static inline void set_buffer_attached(struct buffer_head *bh) ++{ ++ set_bit(BH_Attached, &bh->b_state); ++} ++ ++static inline void clear_buffer_attached(struct buffer_head *bh) ++{ ++ clear_bit(BH_Attached, &bh->b_state); ++} ++ ++static inline int buffer_attached(struct buffer_head *bh) ++{ ++ return test_bit(BH_Attached, &bh->b_state); ++} ++ ++/* ++ * If an error happens during the make_request, this function ++ * has to be recalled. It marks the buffer as clean and not ++ * uptodate, and it notifys the upper layer about the end ++ * of the I/O. ++ */ ++static inline void buffer_IO_error(struct buffer_head * bh) ++{ ++ mark_buffer_clean(bh); ++ /* ++ * b_end_io has to clear the BH_Uptodate bitflag in the error case! ++ */ ++ bh->b_end_io(bh, 0); ++} ++ ++static inline void mark_buffer_dirty_inode(struct buffer_head *bh, struct inode *inode) ++{ ++ mark_buffer_dirty(bh); ++ buffer_insert_inode_queue(bh, inode); ++} ++ ++extern void set_buffer_flushtime(struct buffer_head *); ++extern inline int get_buffer_flushtime(void); ++extern void balance_dirty(void); ++extern int check_disk_change(kdev_t); ++extern int invalidate_inodes(struct super_block *); ++extern int invalidate_device(kdev_t, int); ++extern void invalidate_inode_pages(struct inode *); ++extern void invalidate_inode_pages2(struct address_space *); ++extern void invalidate_inode_buffers(struct inode *); ++#define invalidate_buffers(dev) __invalidate_buffers((dev), 0) ++#define destroy_buffers(dev) __invalidate_buffers((dev), 1) ++extern void invalidate_bdev(struct block_device *, int); ++extern void __invalidate_buffers(kdev_t dev, int); ++extern void sync_inodes(kdev_t); ++extern void sync_unlocked_inodes(void); ++extern void write_inode_now(struct inode *, int); ++extern int sync_buffers(kdev_t, int); ++extern void sync_dev(kdev_t); ++extern int fsync_dev(kdev_t); ++extern int fsync_super(struct super_block *); ++extern int fsync_no_super(kdev_t); ++extern void sync_inodes_sb(struct super_block *); ++extern int fsync_buffers_list(struct list_head *); ++static inline int fsync_inode_buffers(struct inode *inode) ++{ ++ return fsync_buffers_list(&inode->i_dirty_buffers); ++} ++static inline int fsync_inode_data_buffers(struct inode *inode) ++{ ++ return fsync_buffers_list(&inode->i_dirty_data_buffers); ++} ++extern int inode_has_buffers(struct inode *); ++extern int do_fdatasync(struct file *); ++extern int filemap_fdatawrite(struct address_space *); ++extern int filemap_fdatasync(struct address_space *); ++extern int filemap_fdatawait(struct address_space *); ++extern void sync_supers(kdev_t dev, int wait); ++extern int bmap(struct inode *, int); ++extern int notify_change(struct dentry *, struct iattr *); ++extern int permission(struct inode *, int); ++extern int vfs_permission(struct inode *, int); ++extern int get_write_access(struct inode *); ++extern int deny_write_access(struct file *); ++static inline void put_write_access(struct inode * inode) ++{ ++ atomic_dec(&inode->i_writecount); ++} ++static inline void allow_write_access(struct file *file) ++{ ++ if (file) ++ atomic_inc(&file->f_dentry->d_inode->i_writecount); ++} ++extern int do_pipe(int *); ++ ++extern int open_namei(const char *, int, int, struct nameidata *); ++ ++extern int kernel_read(struct file *, unsigned long, char *, unsigned long); ++extern struct file * open_exec(const char *); ++ ++/* fs/dcache.c -- generic fs support functions */ ++extern int is_subdir(struct dentry *, struct dentry *); ++extern ino_t find_inode_number(struct dentry *, struct qstr *); ++ ++/* ++ * Kernel pointers have redundant information, so we can use a ++ * scheme where we can return either an error code or a dentry ++ * pointer with the same return value. ++ * ++ * This should be a per-architecture thing, to allow different ++ * error and pointer decisions. ++ */ ++static inline void *ERR_PTR(long error) ++{ ++ return (void *) error; ++} ++ ++static inline long PTR_ERR(const void *ptr) ++{ ++ return (long) ptr; ++} ++ ++static inline long IS_ERR(const void *ptr) ++{ ++ return (unsigned long)ptr > (unsigned long)-1000L; ++} ++ ++/* ++ * The bitmask for a lookup event: ++ * - follow links at the end ++ * - require a directory ++ * - ending slashes ok even for nonexistent files ++ * - internal "there are more path compnents" flag ++ */ ++#define LOOKUP_FOLLOW (1) ++#define LOOKUP_DIRECTORY (2) ++#define LOOKUP_CONTINUE (4) ++#define LOOKUP_POSITIVE (8) ++#define LOOKUP_PARENT (16) ++#define LOOKUP_NOALT (32) ++/* ++ * Type of the last component on LOOKUP_PARENT ++ */ ++enum {LAST_NORM, LAST_ROOT, LAST_DOT, LAST_DOTDOT, LAST_BIND}; ++ ++/* ++ * "descriptor" for what we're up to with a read for sendfile(). ++ * This allows us to use the same read code yet ++ * have multiple different users of the data that ++ * we read from a file. ++ * ++ * The simplest case just copies the data to user ++ * mode. ++ */ ++typedef struct { ++ size_t written; ++ size_t count; ++ char * buf; ++ int error; ++} read_descriptor_t; ++ ++typedef int (*read_actor_t)(read_descriptor_t *, struct page *, unsigned long, unsigned long); ++ ++/* needed for stackable file system support */ ++extern loff_t default_llseek(struct file *file, loff_t offset, int origin); ++ ++extern int FASTCALL(__user_walk(const char *, unsigned, struct nameidata *)); ++extern int FASTCALL(path_init(const char *, unsigned, struct nameidata *)); ++extern int FASTCALL(path_walk(const char *, struct nameidata *)); ++extern int FASTCALL(path_lookup(const char *, unsigned, struct nameidata *)); ++extern int FASTCALL(link_path_walk(const char *, struct nameidata *)); ++extern void path_release(struct nameidata *); ++extern int follow_down(struct vfsmount **, struct dentry **); ++extern int follow_up(struct vfsmount **, struct dentry **); ++extern struct dentry * lookup_one_len(const char *, struct dentry *, int); ++extern struct dentry * lookup_hash(struct qstr *, struct dentry *); ++#define user_path_walk(name,nd) __user_walk(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd) ++#define user_path_walk_link(name,nd) __user_walk(name, LOOKUP_POSITIVE, nd) ++ ++extern void inode_init_once(struct inode *); ++extern void __inode_init_once(struct inode *); ++extern void iput(struct inode *); ++extern void refile_inode(struct inode *inode); ++extern void force_delete(struct inode *); ++extern struct inode * igrab(struct inode *); ++extern struct inode * ilookup(struct super_block *, unsigned long); ++extern ino_t iunique(struct super_block *, ino_t); ++extern void unlock_new_inode(struct inode *); ++ ++typedef int (*find_inode_t)(struct inode *, unsigned long, void *); ++ ++extern struct inode * iget4_locked(struct super_block *, unsigned long, ++ find_inode_t, void *); ++ ++static inline struct inode *iget4(struct super_block *sb, unsigned long ino, ++ find_inode_t find_actor, void *opaque) ++{ ++ struct inode *inode = iget4_locked(sb, ino, find_actor, opaque); ++ ++ if (inode && (inode->i_state & I_NEW)) { ++ /* ++ * reiserfs-specific kludge that is expected to go away ASAP. ++ */ ++ if (sb->s_op->read_inode2) ++ sb->s_op->read_inode2(inode, opaque); ++ else ++ sb->s_op->read_inode(inode); ++ unlock_new_inode(inode); ++ } ++ ++ return inode; ++} ++ ++static inline struct inode *iget(struct super_block *sb, unsigned long ino) ++{ ++ struct inode *inode = iget4_locked(sb, ino, NULL, NULL); ++ ++ if (inode && (inode->i_state & I_NEW)) { ++ sb->s_op->read_inode(inode); ++ unlock_new_inode(inode); ++ } ++ ++ return inode; ++} ++ ++static inline struct inode *iget_locked(struct super_block *sb, unsigned long ino) ++{ ++ return iget4_locked(sb, ino, NULL, NULL); ++} ++ ++extern void clear_inode(struct inode *); ++extern struct inode *new_inode(struct super_block *sb); ++extern void remove_suid(struct inode *inode); ++ ++extern void insert_inode_hash(struct inode *); ++extern void remove_inode_hash(struct inode *); ++extern struct file * get_empty_filp(void); ++extern void file_move(struct file *f, struct list_head *list); ++extern struct buffer_head * get_hash_table(kdev_t, int, int); ++extern struct buffer_head * getblk(kdev_t, int, int); ++extern void ll_rw_block(int, int, struct buffer_head * bh[]); ++extern void submit_bh(int, struct buffer_head *); ++extern int is_read_only(kdev_t); ++extern void __brelse(struct buffer_head *); ++static inline void brelse(struct buffer_head *buf) ++{ ++ if (buf) ++ __brelse(buf); ++} ++extern void __bforget(struct buffer_head *); ++static inline void bforget(struct buffer_head *buf) ++{ ++ if (buf) ++ __bforget(buf); ++} ++extern int set_blocksize(kdev_t, int); ++extern int sb_set_blocksize(struct super_block *, int); ++extern int sb_min_blocksize(struct super_block *, int); ++extern struct buffer_head * bread(kdev_t, int, int); ++static inline struct buffer_head * sb_bread(struct super_block *sb, int block) ++{ ++ return bread(sb->s_dev, block, sb->s_blocksize); ++} ++static inline struct buffer_head * sb_getblk(struct super_block *sb, int block) ++{ ++ return getblk(sb->s_dev, block, sb->s_blocksize); ++} ++static inline struct buffer_head * sb_get_hash_table(struct super_block *sb, int block) ++{ ++ return get_hash_table(sb->s_dev, block, sb->s_blocksize); ++} ++extern void wakeup_bdflush(void); ++extern void wakeup_kupdate(void); ++extern void put_unused_buffer_head(struct buffer_head * bh); ++extern struct buffer_head * get_unused_buffer_head(int async); ++extern int block_dump; ++ ++extern int brw_page(int, struct page *, kdev_t, int [], int); ++ ++typedef int (get_block_t)(struct inode*,long,struct buffer_head*,int); ++ ++/* Generic buffer handling for block filesystems.. */ ++extern int try_to_release_page(struct page * page, int gfp_mask); ++extern int discard_bh_page(struct page *, unsigned long, int); ++#define block_flushpage(page, offset) discard_bh_page(page, offset, 1) ++#define block_invalidate_page(page) discard_bh_page(page, 0, 0) ++extern int block_symlink(struct inode *, const char *, int); ++extern int block_write_full_page(struct page*, get_block_t*); ++extern int block_read_full_page(struct page*, get_block_t*); ++extern int block_prepare_write(struct page*, unsigned, unsigned, get_block_t*); ++extern int cont_prepare_write(struct page*, unsigned, unsigned, get_block_t*, ++ unsigned long *); ++extern int generic_cont_expand(struct inode *inode, loff_t size) ; ++extern int block_commit_write(struct page *page, unsigned from, unsigned to); ++extern int block_sync_page(struct page *); ++ ++int generic_block_bmap(struct address_space *, long, get_block_t *); ++int generic_commit_write(struct file *, struct page *, unsigned, unsigned); ++int block_truncate_page(struct address_space *, loff_t, get_block_t *); ++extern int generic_direct_IO(int, struct inode *, struct kiobuf *, unsigned long, int, get_block_t *); ++extern int waitfor_one_page(struct page *); ++extern int writeout_one_page(struct page *); ++ ++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 inline ssize_t do_generic_direct_read(struct file *, char *, size_t, loff_t *); ++extern int precheck_file_write(struct file *, struct inode *, size_t *, loff_t *); ++extern ssize_t generic_file_write(struct file *, const char *, size_t, loff_t *); ++extern void do_generic_file_read(struct file *, loff_t *, read_descriptor_t *, read_actor_t); ++extern ssize_t do_generic_file_write(struct file *, const char *, size_t, loff_t *); ++extern ssize_t do_generic_direct_write(struct file *, const char *, size_t, loff_t *); ++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 ssize_t generic_read_dir(struct file *, char *, size_t, loff_t *); ++extern int generic_file_open(struct inode * inode, struct file * filp); ++ ++extern struct file_operations generic_ro_fops; ++ ++extern int vfs_readlink(struct dentry *, char *, int, const char *); ++extern int vfs_follow_link(struct nameidata *, const char *); ++extern int page_readlink(struct dentry *, char *, int); ++extern int page_follow_link(struct dentry *, struct nameidata *); ++extern struct inode_operations page_symlink_inode_operations; ++ ++extern int vfs_readdir(struct file *, filldir_t, void *); ++extern int dcache_dir_open(struct inode *, struct file *); ++extern int dcache_dir_close(struct inode *, struct file *); ++extern loff_t dcache_dir_lseek(struct file *, loff_t, int); ++extern int dcache_dir_fsync(struct file *, struct dentry *, int); ++extern int dcache_readdir(struct file *, void *, filldir_t); ++extern struct file_operations dcache_dir_ops; ++ ++extern struct file_system_type *get_fs_type(const char *name); ++extern struct super_block *get_super(kdev_t); ++extern void drop_super(struct super_block *sb); ++static inline int is_mounted(kdev_t dev) ++{ ++ struct super_block *sb = get_super(dev); ++ if (sb) { ++ drop_super(sb); ++ return 1; ++ } ++ return 0; ++} ++unsigned long generate_cluster(kdev_t, int b[], int); ++unsigned long generate_cluster_swab32(kdev_t, int b[], int); ++extern kdev_t ROOT_DEV; ++extern char root_device_name[]; ++ ++ ++extern void show_buffers(void); ++ ++#ifdef CONFIG_BLK_DEV_INITRD ++extern unsigned int real_root_dev; ++#endif ++ ++extern ssize_t char_read(struct file *, char *, size_t, loff_t *); ++extern ssize_t block_read(struct file *, char *, size_t, loff_t *); ++extern int read_ahead[]; ++ ++extern ssize_t char_write(struct file *, const char *, size_t, loff_t *); ++extern ssize_t block_write(struct file *, const char *, size_t, loff_t *); ++ ++extern int file_fsync(struct file *, struct dentry *, int); ++extern int generic_buffer_fdatasync(struct inode *inode, unsigned long start_idx, unsigned long end_idx); ++extern int generic_osync_inode(struct inode *, int); ++#define OSYNC_METADATA (1<<0) ++#define OSYNC_DATA (1<<1) ++#define OSYNC_INODE (1<<2) ++ ++extern int inode_change_ok(struct inode *, struct iattr *); ++extern int inode_setattr(struct inode *, struct iattr *); ++ ++/* kernel/fork.c */ ++extern int unshare_files(void); ++ ++/* ++ * Common dentry functions for inclusion in the VFS ++ * or in other stackable file systems. Some of these ++ * functions were in linux/fs/ C (VFS) files. ++ * ++ */ ++ ++/* ++ * Locking the parent is needed to: ++ * - serialize directory operations ++ * - make sure the parent doesn't change from ++ * under us in the middle of an operation. ++ * ++ * NOTE! Right now we'd rather use a "struct inode" ++ * for this, but as I expect things to move toward ++ * using dentries instead for most things it is ++ * probably better to start with the conceptually ++ * better interface of relying on a path of dentries. ++ */ ++static inline struct dentry *lock_parent(struct dentry *dentry) ++{ ++ struct dentry *dir = dget(dentry->d_parent); ++ ++ down(&dir->d_inode->i_sem); ++ return dir; ++} ++ ++static inline struct dentry *get_parent(struct dentry *dentry) ++{ ++ return dget(dentry->d_parent); ++} ++ ++static inline void unlock_dir(struct dentry *dir) ++{ ++ up(&dir->d_inode->i_sem); ++ dput(dir); ++} ++ ++/* ++ * Whee.. Deadlock country. Happily there are only two VFS ++ * operations that does this.. ++ */ ++static inline void double_down(struct semaphore *s1, struct semaphore *s2) ++{ ++ if (s1 != s2) { ++ if ((unsigned long) s1 < (unsigned long) s2) { ++ struct semaphore *tmp = s2; ++ s2 = s1; s1 = tmp; ++ } ++ down(s1); ++ } ++ down(s2); ++} ++ ++/* ++ * Ewwwwwwww... _triple_ lock. We are guaranteed that the 3rd argument is ++ * not equal to 1st and not equal to 2nd - the first case (target is parent of ++ * source) would be already caught, the second is plain impossible (target is ++ * its own parent and that case would be caught even earlier). Very messy. ++ * I _think_ that it works, but no warranties - please, look it through. ++ * Pox on bloody lusers who mandated overwriting rename() for directories... ++ */ ++ ++static inline void triple_down(struct semaphore *s1, ++ struct semaphore *s2, ++ struct semaphore *s3) ++{ ++ if (s1 != s2) { ++ if ((unsigned long) s1 < (unsigned long) s2) { ++ if ((unsigned long) s1 < (unsigned long) s3) { ++ struct semaphore *tmp = s3; ++ s3 = s1; s1 = tmp; ++ } ++ if ((unsigned long) s1 < (unsigned long) s2) { ++ struct semaphore *tmp = s2; ++ s2 = s1; s1 = tmp; ++ } ++ } else { ++ if ((unsigned long) s1 < (unsigned long) s3) { ++ struct semaphore *tmp = s3; ++ s3 = s1; s1 = tmp; ++ } ++ if ((unsigned long) s2 < (unsigned long) s3) { ++ struct semaphore *tmp = s3; ++ s3 = s2; s2 = tmp; ++ } ++ } ++ down(s1); ++ } else if ((unsigned long) s2 < (unsigned long) s3) { ++ struct semaphore *tmp = s3; ++ s3 = s2; s2 = tmp; ++ } ++ down(s2); ++ down(s3); ++} ++ ++static inline void double_up(struct semaphore *s1, struct semaphore *s2) ++{ ++ up(s1); ++ if (s1 != s2) ++ up(s2); ++} ++ ++static inline void triple_up(struct semaphore *s1, ++ struct semaphore *s2, ++ struct semaphore *s3) ++{ ++ up(s1); ++ if (s1 != s2) ++ up(s2); ++ up(s3); ++} ++ ++static inline void double_lock(struct dentry *d1, struct dentry *d2) ++{ ++ double_down(&d1->d_inode->i_sem, &d2->d_inode->i_sem); ++} ++ ++static inline void double_unlock(struct dentry *d1, struct dentry *d2) ++{ ++ double_up(&d1->d_inode->i_sem,&d2->d_inode->i_sem); ++ dput(d1); ++ dput(d2); ++} ++ ++#endif /* __KERNEL__ */ ++ ++#endif /* _LINUX_FS_H */ +--- ./linux/genhd.h 1970-01-01 00:00:00.000000000 +0000 ++++ ./linux/genhd.h 2004-08-20 03:16:52.152495040 +0000 +@@ -0,0 +1,318 @@ ++#ifndef _LINUX_GENHD_H ++#define _LINUX_GENHD_H ++ ++/* ++ * genhd.h Copyright (C) 1992 Drew Eckhardt ++ * Generic hard disk header file by ++ * Drew Eckhardt ++ * ++ * ++ */ ++ ++#include ++#include ++#include ++ ++enum { ++/* These three have identical behaviour; use the second one if DOS fdisk gets ++ confused about extended/logical partitions starting past cylinder 1023. */ ++ DOS_EXTENDED_PARTITION = 5, ++ LINUX_EXTENDED_PARTITION = 0x85, ++ WIN98_EXTENDED_PARTITION = 0x0f, ++ ++ LINUX_SWAP_PARTITION = 0x82, ++ LINUX_RAID_PARTITION = 0xfd, /* autodetect RAID partition */ ++ ++ SOLARIS_X86_PARTITION = LINUX_SWAP_PARTITION, ++ ++ DM6_PARTITION = 0x54, /* has DDO: use xlated geom & offset */ ++ EZD_PARTITION = 0x55, /* EZ-DRIVE */ ++ DM6_AUX1PARTITION = 0x51, /* no DDO: use xlated geom */ ++ DM6_AUX3PARTITION = 0x53, /* no DDO: use xlated geom */ ++ ++ FREEBSD_PARTITION = 0xa5, /* FreeBSD Partition ID */ ++ OPENBSD_PARTITION = 0xa6, /* OpenBSD Partition ID */ ++ NETBSD_PARTITION = 0xa9, /* NetBSD Partition ID */ ++ BSDI_PARTITION = 0xb7, /* BSDI Partition ID */ ++/* Ours is not to wonder why.. */ ++ BSD_PARTITION = FREEBSD_PARTITION, ++ MINIX_PARTITION = 0x81, /* Minix Partition ID */ ++ PLAN9_PARTITION = 0x39, /* Plan 9 Partition ID */ ++ UNIXWARE_PARTITION = 0x63, /* Partition ID, same as */ ++ /* GNU_HURD and SCO Unix */ ++}; ++ ++struct partition { ++ unsigned char boot_ind; /* 0x80 - active */ ++ unsigned char head; /* starting head */ ++ unsigned char sector; /* starting sector */ ++ unsigned char cyl; /* starting cylinder */ ++ unsigned char sys_ind; /* What partition type */ ++ unsigned char end_head; /* end head */ ++ unsigned char end_sector; /* end sector */ ++ unsigned char end_cyl; /* end cylinder */ ++ unsigned int start_sect; /* starting sector counting from 0 */ ++ unsigned int nr_sects; /* nr of sectors in partition */ ++} __attribute__((packed)); ++ ++#ifdef __KERNEL__ ++# include ++ ++struct hd_struct { ++ unsigned long start_sect; ++ unsigned long nr_sects; ++ devfs_handle_t de; /* primary (master) devfs entry */ ++#ifdef CONFIG_DEVFS_FS ++ int number; ++#endif /* CONFIG_DEVFS_FS */ ++#ifdef CONFIG_BLK_STATS ++ /* Performance stats: */ ++ unsigned int ios_in_flight; ++ unsigned int io_ticks; ++ unsigned int last_idle_time; ++ unsigned int last_queue_change; ++ unsigned int aveq; ++ ++ unsigned int rd_ios; ++ unsigned int rd_merges; ++ unsigned int rd_ticks; ++ unsigned int rd_sectors; ++ unsigned int wr_ios; ++ unsigned int wr_merges; ++ unsigned int wr_ticks; ++ unsigned int wr_sectors; ++#endif /* CONFIG_BLK_STATS */ ++}; ++ ++#define GENHD_FL_REMOVABLE 1 ++ ++struct gendisk { ++ int major; /* major number of driver */ ++ const char *major_name; /* name of major driver */ ++ int minor_shift; /* number of times minor is shifted to ++ get real minor */ ++ int max_p; /* maximum partitions per device */ ++ ++ struct hd_struct *part; /* [indexed by minor] */ ++ int *sizes; /* [idem], device size in blocks */ ++ int nr_real; /* number of real devices */ ++ ++ void *real_devices; /* internal use */ ++ struct gendisk *next; ++ struct block_device_operations *fops; ++ ++ devfs_handle_t *de_arr; /* one per physical disc */ ++ char *flags; /* one per physical disc */ ++}; ++ ++/* drivers/block/genhd.c */ ++extern struct gendisk *gendisk_head; ++ ++extern void add_gendisk(struct gendisk *gp); ++extern void del_gendisk(struct gendisk *gp); ++extern struct gendisk *get_gendisk(kdev_t dev); ++extern int walk_gendisk(int (*walk)(struct gendisk *, void *), void *); ++ ++#endif /* __KERNEL__ */ ++ ++#ifdef CONFIG_SOLARIS_X86_PARTITION ++ ++#define SOLARIS_X86_NUMSLICE 8 ++#define SOLARIS_X86_VTOC_SANE (0x600DDEEEUL) ++ ++struct solaris_x86_slice { ++ ushort s_tag; /* ID tag of partition */ ++ ushort s_flag; /* permission flags */ ++ unsigned int s_start; /* start sector no of partition */ ++ unsigned int s_size; /* # of blocks in partition */ ++}; ++ ++struct solaris_x86_vtoc { ++ unsigned int v_bootinfo[3]; /* info needed by mboot (unsupported) */ ++ unsigned int v_sanity; /* to verify vtoc sanity */ ++ unsigned int v_version; /* layout version */ ++ char v_volume[8]; /* volume name */ ++ ushort v_sectorsz; /* sector size in bytes */ ++ ushort v_nparts; /* number of partitions */ ++ unsigned int v_reserved[10]; /* free space */ ++ struct solaris_x86_slice ++ v_slice[SOLARIS_X86_NUMSLICE]; /* slice headers */ ++ unsigned int timestamp[SOLARIS_X86_NUMSLICE]; /* timestamp (unsupported) */ ++ char v_asciilabel[128]; /* for compatibility */ ++}; ++ ++#endif /* CONFIG_SOLARIS_X86_PARTITION */ ++ ++#ifdef CONFIG_BSD_DISKLABEL ++/* ++ * BSD disklabel support by Yossi Gottlieb ++ * updated by Marc Espie ++ */ ++ ++/* check against BSD src/sys/sys/disklabel.h for consistency */ ++ ++#define BSD_DISKMAGIC (0x82564557UL) /* The disk magic number */ ++#define BSD_MAXPARTITIONS 8 ++#define OPENBSD_MAXPARTITIONS 16 ++#define BSD_FS_UNUSED 0 /* disklabel unused partition entry ID */ ++struct bsd_disklabel { ++ __u32 d_magic; /* the magic number */ ++ __s16 d_type; /* drive type */ ++ __s16 d_subtype; /* controller/d_type specific */ ++ char d_typename[16]; /* type name, e.g. "eagle" */ ++ char d_packname[16]; /* pack identifier */ ++ __u32 d_secsize; /* # of bytes per sector */ ++ __u32 d_nsectors; /* # of data sectors per track */ ++ __u32 d_ntracks; /* # of tracks per cylinder */ ++ __u32 d_ncylinders; /* # of data cylinders per unit */ ++ __u32 d_secpercyl; /* # of data sectors per cylinder */ ++ __u32 d_secperunit; /* # of data sectors per unit */ ++ __u16 d_sparespertrack; /* # of spare sectors per track */ ++ __u16 d_sparespercyl; /* # of spare sectors per cylinder */ ++ __u32 d_acylinders; /* # of alt. cylinders per unit */ ++ __u16 d_rpm; /* rotational speed */ ++ __u16 d_interleave; /* hardware sector interleave */ ++ __u16 d_trackskew; /* sector 0 skew, per track */ ++ __u16 d_cylskew; /* sector 0 skew, per cylinder */ ++ __u32 d_headswitch; /* head switch time, usec */ ++ __u32 d_trkseek; /* track-to-track seek, usec */ ++ __u32 d_flags; /* generic flags */ ++#define NDDATA 5 ++ __u32 d_drivedata[NDDATA]; /* drive-type specific information */ ++#define NSPARE 5 ++ __u32 d_spare[NSPARE]; /* reserved for future use */ ++ __u32 d_magic2; /* the magic number (again) */ ++ __u16 d_checksum; /* xor of data incl. partitions */ ++ ++ /* filesystem and partition information: */ ++ __u16 d_npartitions; /* number of partitions in following */ ++ __u32 d_bbsize; /* size of boot area at sn0, bytes */ ++ __u32 d_sbsize; /* max size of fs superblock, bytes */ ++ struct bsd_partition { /* the partition table */ ++ __u32 p_size; /* number of sectors in partition */ ++ __u32 p_offset; /* starting sector */ ++ __u32 p_fsize; /* filesystem basic fragment size */ ++ __u8 p_fstype; /* filesystem type, see below */ ++ __u8 p_frag; /* filesystem fragments per block */ ++ __u16 p_cpg; /* filesystem cylinders per group */ ++ } d_partitions[BSD_MAXPARTITIONS]; /* actually may be more */ ++}; ++ ++#endif /* CONFIG_BSD_DISKLABEL */ ++ ++#ifdef CONFIG_UNIXWARE_DISKLABEL ++/* ++ * Unixware slices support by Andrzej Krzysztofowicz ++ * and Krzysztof G. Baranowski ++ */ ++ ++#define UNIXWARE_DISKMAGIC (0xCA5E600DUL) /* The disk magic number */ ++#define UNIXWARE_DISKMAGIC2 (0x600DDEEEUL) /* The slice table magic nr */ ++#define UNIXWARE_NUMSLICE 16 ++#define UNIXWARE_FS_UNUSED 0 /* Unused slice entry ID */ ++ ++struct unixware_slice { ++ __u16 s_label; /* label */ ++ __u16 s_flags; /* permission flags */ ++ __u32 start_sect; /* starting sector */ ++ __u32 nr_sects; /* number of sectors in slice */ ++}; ++ ++struct unixware_disklabel { ++ __u32 d_type; /* drive type */ ++ __u32 d_magic; /* the magic number */ ++ __u32 d_version; /* version number */ ++ char d_serial[12]; /* serial number of the device */ ++ __u32 d_ncylinders; /* # of data cylinders per device */ ++ __u32 d_ntracks; /* # of tracks per cylinder */ ++ __u32 d_nsectors; /* # of data sectors per track */ ++ __u32 d_secsize; /* # of bytes per sector */ ++ __u32 d_part_start; /* # of first sector of this partition */ ++ __u32 d_unknown1[12]; /* ? */ ++ __u32 d_alt_tbl; /* byte offset of alternate table */ ++ __u32 d_alt_len; /* byte length of alternate table */ ++ __u32 d_phys_cyl; /* # of physical cylinders per device */ ++ __u32 d_phys_trk; /* # of physical tracks per cylinder */ ++ __u32 d_phys_sec; /* # of physical sectors per track */ ++ __u32 d_phys_bytes; /* # of physical bytes per sector */ ++ __u32 d_unknown2; /* ? */ ++ __u32 d_unknown3; /* ? */ ++ __u32 d_pad[8]; /* pad */ ++ ++ struct unixware_vtoc { ++ __u32 v_magic; /* the magic number */ ++ __u32 v_version; /* version number */ ++ char v_name[8]; /* volume name */ ++ __u16 v_nslices; /* # of slices */ ++ __u16 v_unknown1; /* ? */ ++ __u32 v_reserved[10]; /* reserved */ ++ struct unixware_slice ++ v_slice[UNIXWARE_NUMSLICE]; /* slice headers */ ++ } vtoc; ++ ++}; /* 408 */ ++ ++#endif /* CONFIG_UNIXWARE_DISKLABEL */ ++ ++#ifdef CONFIG_MINIX_SUBPARTITION ++# define MINIX_NR_SUBPARTITIONS 4 ++#endif /* CONFIG_MINIX_SUBPARTITION */ ++ ++#ifdef __KERNEL__ ++ ++char *disk_name (struct gendisk *hd, int minor, char *buf); ++ ++/* ++ * Account for the completion of an IO request (used by drivers which ++ * bypass the normal end_request processing) ++ */ ++struct request; ++ ++#ifdef CONFIG_BLK_STATS ++extern void disk_round_stats(struct hd_struct *hd); ++extern void req_new_io(struct request *req, int merge, int sectors); ++extern void req_merged_io(struct request *req); ++extern void req_finished_io(struct request *req); ++#else ++static inline void req_new_io(struct request *req, int merge, int sectors) { } ++static inline void req_merged_io(struct request *req) { } ++static inline void req_finished_io(struct request *req) { } ++#endif /* CONFIG_BLK_STATS */ ++ ++extern void devfs_register_partitions (struct gendisk *dev, int minor, ++ int unregister); ++ ++ ++ ++/* ++ * FIXME: this should use genhd->minor_shift, but that is slow to look up. ++ */ ++static inline unsigned int disk_index (kdev_t dev) ++{ ++ int major = MAJOR(dev); ++ int minor = MINOR(dev); ++ unsigned int index; ++ ++ switch (major) { ++ case DAC960_MAJOR+0: ++ index = (minor & 0x00f8) >> 3; ++ break; ++ case SCSI_DISK0_MAJOR: ++ index = (minor & 0x00f0) >> 4; ++ break; ++ case IDE0_MAJOR: /* same as HD_MAJOR */ ++ case XT_DISK_MAJOR: ++ index = (minor & 0x0040) >> 6; ++ break; ++ case IDE1_MAJOR: ++ index = ((minor & 0x0040) >> 6) + 2; ++ break; ++ default: ++ return 0; ++ } ++ return index; ++} ++ ++#endif ++ ++#endif +--- ./linux/hdreg.h 1970-01-01 00:00:00.000000000 +0000 ++++ ./linux/hdreg.h 2004-08-20 03:17:00.838174616 +0000 +@@ -0,0 +1,746 @@ ++#ifndef _LINUX_HDREG_H ++#define _LINUX_HDREG_H ++ ++/* ++ * This file contains some defines for the AT-hd-controller. ++ * Various sources. ++ */ ++ ++#define HD_IRQ 14 /* the standard disk interrupt */ ++ ++/* ide.c has its own port definitions in "ide.h" */ ++ ++/* Hd controller regs. Ref: IBM AT Bios-listing */ ++#define HD_DATA 0x1f0 /* _CTL when writing */ ++#define HD_ERROR 0x1f1 /* see err-bits */ ++#define HD_NSECTOR 0x1f2 /* nr of sectors to read/write */ ++#define HD_SECTOR 0x1f3 /* starting sector */ ++#define HD_LCYL 0x1f4 /* starting cylinder */ ++#define HD_HCYL 0x1f5 /* high byte of starting cyl */ ++#define HD_CURRENT 0x1f6 /* 101dhhhh , d=drive, hhhh=head */ ++#define HD_STATUS 0x1f7 /* see status-bits */ ++#define HD_FEATURE HD_ERROR /* same io address, read=error, write=feature */ ++#define HD_PRECOMP HD_FEATURE /* obsolete use of this port - predates IDE */ ++#define HD_COMMAND HD_STATUS /* same io address, read=status, write=cmd */ ++ ++#define HD_CMD 0x3f6 /* used for resets */ ++#define HD_ALTSTATUS 0x3f6 /* same as HD_STATUS but doesn't clear irq */ ++ ++/* remainder is shared between hd.c, ide.c, ide-cd.c, and the hdparm utility */ ++ ++/* Bits of HD_STATUS */ ++#define ERR_STAT 0x01 ++#define INDEX_STAT 0x02 ++#define ECC_STAT 0x04 /* Corrected error */ ++#define DRQ_STAT 0x08 ++#define SEEK_STAT 0x10 ++#define SRV_STAT 0x10 ++#define WRERR_STAT 0x20 ++#define READY_STAT 0x40 ++#define BUSY_STAT 0x80 ++ ++/* Bits for HD_ERROR */ ++#define MARK_ERR 0x01 /* Bad address mark */ ++#define TRK0_ERR 0x02 /* couldn't find track 0 */ ++#define ABRT_ERR 0x04 /* Command aborted */ ++#define MCR_ERR 0x08 /* media change request */ ++#define ID_ERR 0x10 /* ID field not found */ ++#define MC_ERR 0x20 /* media changed */ ++#define ECC_ERR 0x40 /* Uncorrectable ECC error */ ++#define BBD_ERR 0x80 /* pre-EIDE meaning: block marked bad */ ++#define ICRC_ERR 0x80 /* new meaning: CRC error during transfer */ ++ ++/* Bits of HD_NSECTOR */ ++#define CD 0x01 ++#define IO 0x02 ++#define REL 0x04 ++#define TAG_MASK 0xf8 ++ ++ ++/* ++ * Command Header sizes for IOCTL commands ++ * HDIO_DRIVE_CMD, HDIO_DRIVE_TASK, and HDIO_DRIVE_TASKFILE ++ */ ++ ++#if 0 ++#include ++typedef ide_ioreg_t task_ioreg_t; ++#else ++typedef unsigned char task_ioreg_t; ++#endif ++ ++typedef unsigned long sata_ioreg_t; ++ ++#define HDIO_DRIVE_CMD_HDR_SIZE 4*sizeof(task_ioreg_t) ++#define HDIO_DRIVE_TASK_HDR_SIZE 8*sizeof(task_ioreg_t) ++#define HDIO_DRIVE_HOB_HDR_SIZE 8*sizeof(task_ioreg_t) ++ ++#define IDE_DRIVE_TASK_INVALID -1 ++#define IDE_DRIVE_TASK_NO_DATA 0 ++#define IDE_DRIVE_TASK_SET_XFER 1 ++ ++#define IDE_DRIVE_TASK_IN 2 ++ ++#define IDE_DRIVE_TASK_OUT 3 ++#define IDE_DRIVE_TASK_RAW_WRITE 4 ++ ++struct hd_drive_cmd_hdr { ++ task_ioreg_t command; ++ task_ioreg_t sector_number; ++ task_ioreg_t feature; ++ task_ioreg_t sector_count; ++}; ++ ++typedef struct hd_drive_task_hdr { ++ task_ioreg_t data; ++ task_ioreg_t feature; ++ task_ioreg_t sector_count; ++ task_ioreg_t sector_number; ++ task_ioreg_t low_cylinder; ++ task_ioreg_t high_cylinder; ++ task_ioreg_t device_head; ++ task_ioreg_t command; ++} task_struct_t; ++ ++typedef struct hd_drive_hob_hdr { ++ task_ioreg_t data; ++ task_ioreg_t feature; ++ task_ioreg_t sector_count; ++ task_ioreg_t sector_number; ++ task_ioreg_t low_cylinder; ++ task_ioreg_t high_cylinder; ++ task_ioreg_t device_head; ++ task_ioreg_t control; ++} hob_struct_t; ++ ++typedef union ide_reg_valid_s { ++ unsigned all : 16; ++ struct { ++ unsigned data : 1; ++ unsigned error_feature : 1; ++ unsigned sector : 1; ++ unsigned nsector : 1; ++ unsigned lcyl : 1; ++ unsigned hcyl : 1; ++ unsigned select : 1; ++ unsigned status_command : 1; ++ ++ unsigned data_hob : 1; ++ unsigned error_feature_hob : 1; ++ unsigned sector_hob : 1; ++ unsigned nsector_hob : 1; ++ unsigned lcyl_hob : 1; ++ unsigned hcyl_hob : 1; ++ unsigned select_hob : 1; ++ unsigned control_hob : 1; ++ } b; ++} ide_reg_valid_t; ++ ++/* ++ * Define standard taskfile in/out register ++ */ ++#define IDE_TASKFILE_STD_OUT_FLAGS 0xFE ++#define IDE_TASKFILE_STD_IN_FLAGS 0xFE ++#define IDE_HOB_STD_OUT_FLAGS 0x3C ++#define IDE_HOB_STD_IN_FLAGS 0x3C ++ ++typedef struct ide_task_request_s { ++ task_ioreg_t io_ports[8]; ++ task_ioreg_t hob_ports[8]; ++ ide_reg_valid_t out_flags; ++ ide_reg_valid_t in_flags; ++ int data_phase; ++ int req_cmd; ++ unsigned long out_size; ++ unsigned long in_size; ++} ide_task_request_t; ++ ++typedef struct ide_ioctl_request_s { ++ ide_task_request_t *task_request; ++ unsigned char *out_buffer; ++ unsigned char *in_buffer; ++} ide_ioctl_request_t; ++ ++#define TASKFILE_INVALID 0x7fff ++#define TASKFILE_48 0x8000 ++ ++#define TASKFILE_NO_DATA 0x0000 ++ ++#define TASKFILE_IN 0x0001 ++#define TASKFILE_MULTI_IN 0x0002 ++ ++#define TASKFILE_OUT 0x0004 ++#define TASKFILE_MULTI_OUT 0x0008 ++#define TASKFILE_IN_OUT 0x0010 ++ ++#define TASKFILE_IN_DMA 0x0020 ++#define TASKFILE_OUT_DMA 0x0040 ++#define TASKFILE_IN_DMAQ 0x0080 ++#define TASKFILE_OUT_DMAQ 0x0100 ++ ++#define TASKFILE_P_IN 0x0200 ++#define TASKFILE_P_OUT 0x0400 ++#define TASKFILE_P_IN_DMA 0x0800 ++#define TASKFILE_P_OUT_DMA 0x1000 ++#define TASKFILE_P_IN_DMAQ 0x2000 ++#define TASKFILE_P_OUT_DMAQ 0x4000 ++ ++/* ATA/ATAPI Commands pre T13 Spec */ ++#define WIN_NOP 0x00 ++/* ++ * 0x01->0x02 Reserved ++ */ ++#define CFA_REQ_EXT_ERROR_CODE 0x03 /* CFA Request Extended Error Code */ ++/* ++ * 0x04->0x07 Reserved ++ */ ++#define WIN_SRST 0x08 /* ATAPI soft reset command */ ++#define WIN_DEVICE_RESET 0x08 ++/* ++ * 0x09->0x0F Reserved ++ */ ++#define WIN_RECAL 0x10 ++#define WIN_RESTORE WIN_RECAL ++/* ++ * 0x10->0x1F Reserved ++ */ ++#define WIN_READ 0x20 /* 28-Bit */ ++#define WIN_READ_ONCE 0x21 /* 28-Bit without retries */ ++#define WIN_READ_LONG 0x22 /* 28-Bit */ ++#define WIN_READ_LONG_ONCE 0x23 /* 28-Bit without retries */ ++#define WIN_READ_EXT 0x24 /* 48-Bit */ ++#define WIN_READDMA_EXT 0x25 /* 48-Bit */ ++#define WIN_READDMA_QUEUED_EXT 0x26 /* 48-Bit */ ++#define WIN_READ_NATIVE_MAX_EXT 0x27 /* 48-Bit */ ++/* ++ * 0x28 ++ */ ++#define WIN_MULTREAD_EXT 0x29 /* 48-Bit */ ++/* ++ * 0x2A->0x2F Reserved ++ */ ++#define WIN_WRITE 0x30 /* 28-Bit */ ++#define WIN_WRITE_ONCE 0x31 /* 28-Bit without retries */ ++#define WIN_WRITE_LONG 0x32 /* 28-Bit */ ++#define WIN_WRITE_LONG_ONCE 0x33 /* 28-Bit without retries */ ++#define WIN_WRITE_EXT 0x34 /* 48-Bit */ ++#define WIN_WRITEDMA_EXT 0x35 /* 48-Bit */ ++#define WIN_WRITEDMA_QUEUED_EXT 0x36 /* 48-Bit */ ++#define WIN_SET_MAX_EXT 0x37 /* 48-Bit */ ++#define CFA_WRITE_SECT_WO_ERASE 0x38 /* CFA Write Sectors without erase */ ++#define WIN_MULTWRITE_EXT 0x39 /* 48-Bit */ ++/* ++ * 0x3A->0x3B Reserved ++ */ ++#define WIN_WRITE_VERIFY 0x3C /* 28-Bit */ ++/* ++ * 0x3D->0x3F Reserved ++ */ ++#define WIN_VERIFY 0x40 /* 28-Bit - Read Verify Sectors */ ++#define WIN_VERIFY_ONCE 0x41 /* 28-Bit - without retries */ ++#define WIN_VERIFY_EXT 0x42 /* 48-Bit */ ++/* ++ * 0x43->0x4F Reserved ++ */ ++#define WIN_FORMAT 0x50 ++/* ++ * 0x51->0x5F Reserved ++ */ ++#define WIN_INIT 0x60 ++/* ++ * 0x61->0x5F Reserved ++ */ ++#define WIN_SEEK 0x70 /* 0x70-0x7F Reserved */ ++#define CFA_TRANSLATE_SECTOR 0x87 /* CFA Translate Sector */ ++#define WIN_DIAGNOSE 0x90 ++#define WIN_SPECIFY 0x91 /* set drive geometry translation */ ++#define WIN_DOWNLOAD_MICROCODE 0x92 ++#define WIN_STANDBYNOW2 0x94 ++#define WIN_STANDBY2 0x96 ++#define WIN_SETIDLE2 0x97 ++#define WIN_CHECKPOWERMODE2 0x98 ++#define WIN_SLEEPNOW2 0x99 ++/* ++ * 0x9A VENDOR ++ */ ++#define WIN_PACKETCMD 0xA0 /* Send a packet command. */ ++#define WIN_PIDENTIFY 0xA1 /* identify ATAPI device */ ++#define WIN_QUEUED_SERVICE 0xA2 ++#define WIN_SMART 0xB0 /* self-monitoring and reporting */ ++#define CFA_ERASE_SECTORS 0xC0 ++#define WIN_MULTREAD 0xC4 /* read sectors using multiple mode*/ ++#define WIN_MULTWRITE 0xC5 /* write sectors using multiple mode */ ++#define WIN_SETMULT 0xC6 /* enable/disable multiple mode */ ++#define WIN_READDMA_QUEUED 0xC7 /* read sectors using Queued DMA transfers */ ++#define WIN_READDMA 0xC8 /* read sectors using DMA transfers */ ++#define WIN_READDMA_ONCE 0xC9 /* 28-Bit - without retries */ ++#define WIN_WRITEDMA 0xCA /* write sectors using DMA transfers */ ++#define WIN_WRITEDMA_ONCE 0xCB /* 28-Bit - without retries */ ++#define WIN_WRITEDMA_QUEUED 0xCC /* write sectors using Queued DMA transfers */ ++#define CFA_WRITE_MULTI_WO_ERASE 0xCD /* CFA Write multiple without erase */ ++#define WIN_GETMEDIASTATUS 0xDA ++#define WIN_ACKMEDIACHANGE 0xDB /* ATA-1, ATA-2 vendor */ ++#define WIN_POSTBOOT 0xDC ++#define WIN_PREBOOT 0xDD ++#define WIN_DOORLOCK 0xDE /* lock door on removable drives */ ++#define WIN_DOORUNLOCK 0xDF /* unlock door on removable drives */ ++#define WIN_STANDBYNOW1 0xE0 ++#define WIN_IDLEIMMEDIATE 0xE1 /* force drive to become "ready" */ ++#define WIN_STANDBY 0xE2 /* Set device in Standby Mode */ ++#define WIN_SETIDLE1 0xE3 ++#define WIN_READ_BUFFER 0xE4 /* force read only 1 sector */ ++#define WIN_CHECKPOWERMODE1 0xE5 ++#define WIN_SLEEPNOW1 0xE6 ++#define WIN_FLUSH_CACHE 0xE7 ++#define WIN_WRITE_BUFFER 0xE8 /* force write only 1 sector */ ++#define WIN_WRITE_SAME 0xE9 /* read ata-2 to use */ ++ /* SET_FEATURES 0x22 or 0xDD */ ++#define WIN_FLUSH_CACHE_EXT 0xEA /* 48-Bit */ ++#define WIN_IDENTIFY 0xEC /* ask drive to identify itself */ ++#define WIN_MEDIAEJECT 0xED ++#define WIN_IDENTIFY_DMA 0xEE /* same as WIN_IDENTIFY, but DMA */ ++#define WIN_SETFEATURES 0xEF /* set special drive features */ ++#define EXABYTE_ENABLE_NEST 0xF0 ++#define WIN_SECURITY_SET_PASS 0xF1 ++#define WIN_SECURITY_UNLOCK 0xF2 ++#define WIN_SECURITY_ERASE_PREPARE 0xF3 ++#define WIN_SECURITY_ERASE_UNIT 0xF4 ++#define WIN_SECURITY_FREEZE_LOCK 0xF5 ++#define WIN_SECURITY_DISABLE 0xF6 ++#define WIN_READ_NATIVE_MAX 0xF8 /* return the native maximum address */ ++#define WIN_SET_MAX 0xF9 ++#define DISABLE_SEAGATE 0xFB ++ ++/* WIN_SMART sub-commands */ ++ ++#define SMART_READ_VALUES 0xD0 ++#define SMART_READ_THRESHOLDS 0xD1 ++#define SMART_AUTOSAVE 0xD2 ++#define SMART_SAVE 0xD3 ++#define SMART_IMMEDIATE_OFFLINE 0xD4 ++#define SMART_READ_LOG_SECTOR 0xD5 ++#define SMART_WRITE_LOG_SECTOR 0xD6 ++#define SMART_WRITE_THRESHOLDS 0xD7 ++#define SMART_ENABLE 0xD8 ++#define SMART_DISABLE 0xD9 ++#define SMART_STATUS 0xDA ++#define SMART_AUTO_OFFLINE 0xDB ++ ++/* Password used in TF4 & TF5 executing SMART commands */ ++ ++#define SMART_LCYL_PASS 0x4F ++#define SMART_HCYL_PASS 0xC2 ++ ++/* WIN_SETFEATURES sub-commands */ ++#define SETFEATURES_EN_8BIT 0x01 /* Enable 8-Bit Transfers */ ++#define SETFEATURES_EN_WCACHE 0x02 /* Enable write cache */ ++#define SETFEATURES_XFER 0x03 /* Set transfer mode */ ++# define XFER_UDMA_7 0x47 /* 0100|0111 */ ++# define XFER_UDMA_6 0x46 /* 0100|0110 */ ++# define XFER_UDMA_5 0x45 /* 0100|0101 */ ++# define XFER_UDMA_4 0x44 /* 0100|0100 */ ++# define XFER_UDMA_3 0x43 /* 0100|0011 */ ++# define XFER_UDMA_2 0x42 /* 0100|0010 */ ++# define XFER_UDMA_1 0x41 /* 0100|0001 */ ++# define XFER_UDMA_0 0x40 /* 0100|0000 */ ++# define XFER_MW_DMA_2 0x22 /* 0010|0010 */ ++# define XFER_MW_DMA_1 0x21 /* 0010|0001 */ ++# define XFER_MW_DMA_0 0x20 /* 0010|0000 */ ++# define XFER_SW_DMA_2 0x12 /* 0001|0010 */ ++# define XFER_SW_DMA_1 0x11 /* 0001|0001 */ ++# define XFER_SW_DMA_0 0x10 /* 0001|0000 */ ++# define XFER_PIO_4 0x0C /* 0000|1100 */ ++# define XFER_PIO_3 0x0B /* 0000|1011 */ ++# define XFER_PIO_2 0x0A /* 0000|1010 */ ++# define XFER_PIO_1 0x09 /* 0000|1001 */ ++# define XFER_PIO_0 0x08 /* 0000|1000 */ ++# define XFER_PIO_SLOW 0x00 /* 0000|0000 */ ++#define SETFEATURES_DIS_DEFECT 0x04 /* Disable Defect Management */ ++#define SETFEATURES_EN_APM 0x05 /* Enable advanced power management */ ++#define SETFEATURES_EN_SAME_R 0x22 /* for a region ATA-1 */ ++#define SETFEATURES_DIS_MSN 0x31 /* Disable Media Status Notification */ ++#define SETFEATURES_DIS_RETRY 0x33 /* Disable Retry */ ++#define SETFEATURES_EN_AAM 0x42 /* Enable Automatic Acoustic Management */ ++#define SETFEATURES_RW_LONG 0x44 /* Set Lenght of VS bytes */ ++#define SETFEATURES_SET_CACHE 0x54 /* Set Cache segments to SC Reg. Val */ ++#define SETFEATURES_DIS_RLA 0x55 /* Disable read look-ahead feature */ ++#define SETFEATURES_EN_RI 0x5D /* Enable release interrupt */ ++#define SETFEATURES_EN_SI 0x5E /* Enable SERVICE interrupt */ ++#define SETFEATURES_DIS_RPOD 0x66 /* Disable reverting to power on defaults */ ++#define SETFEATURES_DIS_ECC 0x77 /* Disable ECC byte count */ ++#define SETFEATURES_DIS_8BIT 0x81 /* Disable 8-Bit Transfers */ ++#define SETFEATURES_DIS_WCACHE 0x82 /* Disable write cache */ ++#define SETFEATURES_EN_DEFECT 0x84 /* Enable Defect Management */ ++#define SETFEATURES_DIS_APM 0x85 /* Disable advanced power management */ ++#define SETFEATURES_EN_ECC 0x88 /* Enable ECC byte count */ ++#define SETFEATURES_EN_MSN 0x95 /* Enable Media Status Notification */ ++#define SETFEATURES_EN_RETRY 0x99 /* Enable Retry */ ++#define SETFEATURES_EN_RLA 0xAA /* Enable read look-ahead feature */ ++#define SETFEATURES_PREFETCH 0xAB /* Sets drive prefetch value */ ++#define SETFEATURES_EN_REST 0xAC /* ATA-1 */ ++#define SETFEATURES_4B_RW_LONG 0xBB /* Set Lenght of 4 bytes */ ++#define SETFEATURES_DIS_AAM 0xC2 /* Disable Automatic Acoustic Management */ ++#define SETFEATURES_EN_RPOD 0xCC /* Enable reverting to power on defaults */ ++#define SETFEATURES_DIS_RI 0xDD /* Disable release interrupt ATAPI */ ++#define SETFEATURES_EN_SAME_M 0xDD /* for a entire device ATA-1 */ ++#define SETFEATURES_DIS_SI 0xDE /* Disable SERVICE interrupt ATAPI */ ++ ++/* WIN_SECURITY sub-commands */ ++ ++#define SECURITY_SET_PASSWORD 0xBA ++#define SECURITY_UNLOCK 0xBB ++#define SECURITY_ERASE_PREPARE 0xBC ++#define SECURITY_ERASE_UNIT 0xBD ++#define SECURITY_FREEZE_LOCK 0xBE ++#define SECURITY_DISABLE_PASSWORD 0xBF ++ ++struct hd_geometry { ++ unsigned char heads; ++ unsigned char sectors; ++ unsigned short cylinders; ++ unsigned long start; ++}; ++ ++/* BIG GEOMETRY */ ++struct hd_big_geometry { ++ unsigned char heads; ++ unsigned char sectors; ++ unsigned int cylinders; ++ unsigned long start; ++}; ++ ++/* hd/ide ctl's that pass (arg) ptrs to user space are numbered 0x030n/0x031n */ ++#define HDIO_GETGEO 0x0301 /* get device geometry */ ++#define HDIO_GET_UNMASKINTR 0x0302 /* get current unmask setting */ ++#define HDIO_GET_MULTCOUNT 0x0304 /* get current IDE blockmode setting */ ++#define HDIO_GET_QDMA 0x0305 /* get use-qdma flag */ ++ ++#define HDIO_SET_XFER 0x0306 /* set transfer rate via proc */ ++ ++#define HDIO_OBSOLETE_IDENTITY 0x0307 /* OBSOLETE, DO NOT USE: returns 142 bytes */ ++#define HDIO_GET_KEEPSETTINGS 0x0308 /* get keep-settings-on-reset flag */ ++#define HDIO_GET_32BIT 0x0309 /* get current io_32bit setting */ ++#define HDIO_GET_NOWERR 0x030a /* get ignore-write-error flag */ ++#define HDIO_GET_DMA 0x030b /* get use-dma flag */ ++#define HDIO_GET_NICE 0x030c /* get nice flags */ ++#define HDIO_GET_IDENTITY 0x030d /* get IDE identification info */ ++#define HDIO_GET_WCACHE 0x030e /* get write cache mode on|off */ ++#define HDIO_GET_ACOUSTIC 0x030f /* get acoustic value */ ++#define HDIO_GET_ADDRESS 0x0310 /* */ ++ ++#define HDIO_GET_BUSSTATE 0x031a /* get the bus state of the hwif */ ++#define HDIO_TRISTATE_HWIF 0x031b /* execute a channel tristate */ ++#define HDIO_DRIVE_RESET 0x031c /* execute a device reset */ ++#define HDIO_DRIVE_TASKFILE 0x031d /* execute raw taskfile */ ++#define HDIO_DRIVE_TASK 0x031e /* execute task and special drive command */ ++#define HDIO_DRIVE_CMD 0x031f /* execute a special drive command */ ++ ++#define HDIO_DRIVE_CMD_AEB HDIO_DRIVE_TASK ++ ++/* hd/ide ctl's that pass (arg) non-ptr values are numbered 0x032n/0x033n */ ++#define HDIO_SET_MULTCOUNT 0x0321 /* change IDE blockmode */ ++#define HDIO_SET_UNMASKINTR 0x0322 /* permit other irqs during I/O */ ++#define HDIO_SET_KEEPSETTINGS 0x0323 /* keep ioctl settings on reset */ ++#define HDIO_SET_32BIT 0x0324 /* change io_32bit flags */ ++#define HDIO_SET_NOWERR 0x0325 /* change ignore-write-error flag */ ++#define HDIO_SET_DMA 0x0326 /* change use-dma flag */ ++#define HDIO_SET_PIO_MODE 0x0327 /* reconfig interface to new speed */ ++#define HDIO_SCAN_HWIF 0x0328 /* register and (re)scan interface */ ++#define HDIO_SET_NICE 0x0329 /* set nice flags */ ++#define HDIO_UNREGISTER_HWIF 0x032a /* unregister interface */ ++#define HDIO_SET_WCACHE 0x032b /* change write cache enable-disable */ ++#define HDIO_SET_ACOUSTIC 0x032c /* change acoustic behavior */ ++#define HDIO_SET_BUSSTATE 0x032d /* set the bus state of the hwif */ ++#define HDIO_SET_QDMA 0x032e /* change use-qdma flag */ ++#define HDIO_SET_ADDRESS 0x032f /* change lba addressing modes */ ++ ++/* bus states */ ++enum { ++ BUSSTATE_OFF = 0, ++ BUSSTATE_ON, ++ BUSSTATE_TRISTATE ++}; ++ ++/* hd/ide ctl's that pass (arg) ptrs to user space are numbered 0x033n/0x033n */ ++#define HDIO_GETGEO_BIG 0x0330 /* */ ++#define HDIO_GETGEO_BIG_RAW 0x0331 /* */ ++ ++#define HDIO_SET_IDE_SCSI 0x0338 ++#define HDIO_SET_SCSI_IDE 0x0339 ++ ++#define __NEW_HD_DRIVE_ID ++/* structure returned by HDIO_GET_IDENTITY, ++ * as per ANSI NCITS ATA6 rev.1b spec ++ */ ++struct hd_driveid { ++ unsigned short config; /* lots of obsolete bit flags */ ++ unsigned short cyls; /* Obsolete, "physical" cyls */ ++ unsigned short reserved2; /* reserved (word 2) */ ++ unsigned short heads; /* Obsolete, "physical" heads */ ++ unsigned short track_bytes; /* unformatted bytes per track */ ++ unsigned short sector_bytes; /* unformatted bytes per sector */ ++ unsigned short sectors; /* Obsolete, "physical" sectors per track */ ++ unsigned short vendor0; /* vendor unique */ ++ unsigned short vendor1; /* vendor unique */ ++ unsigned short vendor2; /* Retired vendor unique */ ++ unsigned char serial_no[20]; /* 0 = not_specified */ ++ unsigned short buf_type; /* Retired */ ++ unsigned short buf_size; /* Retired, 512 byte increments ++ * 0 = not_specified ++ */ ++ unsigned short ecc_bytes; /* for r/w long cmds; 0 = not_specified */ ++ unsigned char fw_rev[8]; /* 0 = not_specified */ ++ unsigned char model[40]; /* 0 = not_specified */ ++ unsigned char max_multsect; /* 0=not_implemented */ ++ unsigned char vendor3; /* vendor unique */ ++ unsigned short dword_io; /* 0=not_implemented; 1=implemented */ ++ unsigned char vendor4; /* vendor unique */ ++ unsigned char capability; /* (upper byte of word 49) ++ * 3: IORDYsup ++ * 2: IORDYsw ++ * 1: LBA ++ * 0: DMA ++ */ ++ unsigned short reserved50; /* reserved (word 50) */ ++ unsigned char vendor5; /* Obsolete, vendor unique */ ++ unsigned char tPIO; /* Obsolete, 0=slow, 1=medium, 2=fast */ ++ unsigned char vendor6; /* Obsolete, vendor unique */ ++ unsigned char tDMA; /* Obsolete, 0=slow, 1=medium, 2=fast */ ++ unsigned short field_valid; /* (word 53) ++ * 2: ultra_ok word 88 ++ * 1: eide_ok words 64-70 ++ * 0: cur_ok words 54-58 ++ */ ++ unsigned short cur_cyls; /* Obsolete, logical cylinders */ ++ unsigned short cur_heads; /* Obsolete, l heads */ ++ unsigned short cur_sectors; /* Obsolete, l sectors per track */ ++ unsigned short cur_capacity0; /* Obsolete, l total sectors on drive */ ++ unsigned short cur_capacity1; /* Obsolete, (2 words, misaligned int) */ ++ unsigned char multsect; /* current multiple sector count */ ++ unsigned char multsect_valid; /* when (bit0==1) multsect is ok */ ++ unsigned int lba_capacity; /* Obsolete, total number of sectors */ ++ unsigned short dma_1word; /* Obsolete, single-word dma info */ ++ unsigned short dma_mword; /* multiple-word dma info */ ++ unsigned short eide_pio_modes; /* bits 0:mode3 1:mode4 */ ++ unsigned short eide_dma_min; /* min mword dma cycle time (ns) */ ++ unsigned short eide_dma_time; /* recommended mword dma cycle time (ns) */ ++ unsigned short eide_pio; /* min cycle time (ns), no IORDY */ ++ unsigned short eide_pio_iordy; /* min cycle time (ns), with IORDY */ ++ unsigned short words69_70[2]; /* reserved words 69-70 ++ * future command overlap and queuing ++ */ ++ /* HDIO_GET_IDENTITY currently returns only words 0 through 70 */ ++ unsigned short words71_74[4]; /* reserved words 71-74 ++ * for IDENTIFY PACKET DEVICE command ++ */ ++ unsigned short queue_depth; /* (word 75) ++ * 15:5 reserved ++ * 4:0 Maximum queue depth -1 ++ */ ++ unsigned short words76_79[4]; /* reserved words 76-79 */ ++ unsigned short major_rev_num; /* (word 80) */ ++ unsigned short minor_rev_num; /* (word 81) */ ++ unsigned short command_set_1; /* (word 82) supported ++ * 15: Obsolete ++ * 14: NOP command ++ * 13: READ_BUFFER ++ * 12: WRITE_BUFFER ++ * 11: Obsolete ++ * 10: Host Protected Area ++ * 9: DEVICE Reset ++ * 8: SERVICE Interrupt ++ * 7: Release Interrupt ++ * 6: look-ahead ++ * 5: write cache ++ * 4: PACKET Command ++ * 3: Power Management Feature Set ++ * 2: Removable Feature Set ++ * 1: Security Feature Set ++ * 0: SMART Feature Set ++ */ ++ unsigned short command_set_2; /* (word 83) ++ * 15: Shall be ZERO ++ * 14: Shall be ONE ++ * 13: FLUSH CACHE EXT ++ * 12: FLUSH CACHE ++ * 11: Device Configuration Overlay ++ * 10: 48-bit Address Feature Set ++ * 9: Automatic Acoustic Management ++ * 8: SET MAX security ++ * 7: reserved 1407DT PARTIES ++ * 6: SetF sub-command Power-Up ++ * 5: Power-Up in Standby Feature Set ++ * 4: Removable Media Notification ++ * 3: APM Feature Set ++ * 2: CFA Feature Set ++ * 1: READ/WRITE DMA QUEUED ++ * 0: Download MicroCode ++ */ ++ unsigned short cfsse; /* (word 84) ++ * cmd set-feature supported extensions ++ * 15: Shall be ZERO ++ * 14: Shall be ONE ++ * 13:6 reserved ++ * 5: General Purpose Logging ++ * 4: Streaming Feature Set ++ * 3: Media Card Pass Through ++ * 2: Media Serial Number Valid ++ * 1: SMART selt-test supported ++ * 0: SMART error logging ++ */ ++ unsigned short cfs_enable_1; /* (word 85) ++ * command set-feature enabled ++ * 15: Obsolete ++ * 14: NOP command ++ * 13: READ_BUFFER ++ * 12: WRITE_BUFFER ++ * 11: Obsolete ++ * 10: Host Protected Area ++ * 9: DEVICE Reset ++ * 8: SERVICE Interrupt ++ * 7: Release Interrupt ++ * 6: look-ahead ++ * 5: write cache ++ * 4: PACKET Command ++ * 3: Power Management Feature Set ++ * 2: Removable Feature Set ++ * 1: Security Feature Set ++ * 0: SMART Feature Set ++ */ ++ unsigned short cfs_enable_2; /* (word 86) ++ * command set-feature enabled ++ * 15: Shall be ZERO ++ * 14: Shall be ONE ++ * 13: FLUSH CACHE EXT ++ * 12: FLUSH CACHE ++ * 11: Device Configuration Overlay ++ * 10: 48-bit Address Feature Set ++ * 9: Automatic Acoustic Management ++ * 8: SET MAX security ++ * 7: reserved 1407DT PARTIES ++ * 6: SetF sub-command Power-Up ++ * 5: Power-Up in Standby Feature Set ++ * 4: Removable Media Notification ++ * 3: APM Feature Set ++ * 2: CFA Feature Set ++ * 1: READ/WRITE DMA QUEUED ++ * 0: Download MicroCode ++ */ ++ unsigned short csf_default; /* (word 87) ++ * command set-feature default ++ * 15: Shall be ZERO ++ * 14: Shall be ONE ++ * 13:6 reserved ++ * 5: General Purpose Logging enabled ++ * 4: Valid CONFIGURE STREAM executed ++ * 3: Media Card Pass Through enabled ++ * 2: Media Serial Number Valid ++ * 1: SMART selt-test supported ++ * 0: SMART error logging ++ */ ++ unsigned short dma_ultra; /* (word 88) */ ++ unsigned short trseuc; /* time required for security erase */ ++ unsigned short trsEuc; /* time required for enhanced erase */ ++ unsigned short CurAPMvalues; /* current APM values */ ++ unsigned short mprc; /* master password revision code */ ++ unsigned short hw_config; /* hardware config (word 93) ++ * 15: Shall be ZERO ++ * 14: Shall be ONE ++ * 13: ++ * 12: ++ * 11: ++ * 10: ++ * 9: ++ * 8: ++ * 7: ++ * 6: ++ * 5: ++ * 4: ++ * 3: ++ * 2: ++ * 1: ++ * 0: Shall be ONE ++ */ ++ unsigned short acoustic; /* (word 94) ++ * 15:8 Vendor's recommended value ++ * 7:0 current value ++ */ ++ unsigned short msrqs; /* min stream request size */ ++ unsigned short sxfert; /* stream transfer time */ ++ unsigned short sal; /* stream access latency */ ++ unsigned int spg; /* stream performance granularity */ ++ unsigned long long lba_capacity_2;/* 48-bit total number of sectors */ ++ unsigned short words104_125[22];/* reserved words 104-125 */ ++ unsigned short last_lun; /* (word 126) */ ++ unsigned short word127; /* (word 127) Feature Set ++ * Removable Media Notification ++ * 15:2 reserved ++ * 1:0 00 = not supported ++ * 01 = supported ++ * 10 = reserved ++ * 11 = reserved ++ */ ++ unsigned short dlf; /* (word 128) ++ * device lock function ++ * 15:9 reserved ++ * 8 security level 1:max 0:high ++ * 7:6 reserved ++ * 5 enhanced erase ++ * 4 expire ++ * 3 frozen ++ * 2 locked ++ * 1 en/disabled ++ * 0 capability ++ */ ++ unsigned short csfo; /* (word 129) ++ * current set features options ++ * 15:4 reserved ++ * 3: auto reassign ++ * 2: reverting ++ * 1: read-look-ahead ++ * 0: write cache ++ */ ++ unsigned short words130_155[26];/* reserved vendor words 130-155 */ ++ unsigned short word156; /* reserved vendor word 156 */ ++ unsigned short words157_159[3];/* reserved vendor words 157-159 */ ++ unsigned short cfa_power; /* (word 160) CFA Power Mode ++ * 15 word 160 supported ++ * 14 reserved ++ * 13 ++ * 12 ++ * 11:0 ++ */ ++ unsigned short words161_175[15];/* Reserved for CFA */ ++ unsigned short words176_205[30];/* Current Media Serial Number */ ++ unsigned short words206_254[49];/* reserved words 206-254 */ ++ unsigned short integrity_word; /* (word 255) ++ * 15:8 Checksum ++ * 7:0 Signature ++ */ ++}; ++ ++/* ++ * IDE "nice" flags. These are used on a per drive basis to determine ++ * when to be nice and give more bandwidth to the other devices which ++ * share the same IDE bus. ++ */ ++#define IDE_NICE_DSC_OVERLAP (0) /* per the DSC overlap protocol */ ++#define IDE_NICE_ATAPI_OVERLAP (1) /* not supported yet */ ++#define IDE_NICE_0 (2) /* when sure that it won't affect us */ ++#define IDE_NICE_1 (3) /* when probably won't affect us much */ ++#define IDE_NICE_2 (4) /* when we know it's on our expense */ ++ ++#ifdef __KERNEL__ ++/* ++ * These routines are used for kernel command line parameters from main.c: ++ */ ++#include ++ ++#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE) ++int ide_register(int io_port, int ctl_port, int irq); ++int ide_unregister(unsigned int); ++#endif /* CONFIG_BLK_DEV_IDE || CONFIG_BLK_DEV_IDE_MODULE */ ++ ++#endif /* __KERNEL__ */ ++ ++#endif /* _LINUX_HDREG_H */ +--- ./linux/list.h 1970-01-01 00:00:00.000000000 +0000 ++++ ./linux/list.h 2004-08-20 03:20:02.312586312 +0000 +@@ -0,0 +1,259 @@ ++#ifndef _LINUX_LIST_H ++#define _LINUX_LIST_H ++ ++#if defined(__KERNEL__) || defined(_LVM_H_INCLUDE) ++ ++#include ++ ++/* ++ * Simple doubly linked list implementation. ++ * ++ * Some of the internal functions ("__xxx") are useful when ++ * manipulating whole lists rather than single entries, as ++ * sometimes we already know the next/prev entries and we can ++ * generate better code by using them directly rather than ++ * using the generic single-entry routines. ++ */ ++ ++struct list_head { ++ struct list_head *next, *prev; ++}; ++ ++#define LIST_HEAD_INIT(name) { &(name), &(name) } ++ ++#define LIST_HEAD(name) \ ++ struct list_head name = LIST_HEAD_INIT(name) ++ ++#define INIT_LIST_HEAD(ptr) do { \ ++ (ptr)->next = (ptr); (ptr)->prev = (ptr); \ ++} while (0) ++ ++/* ++ * Insert a new entry between two known consecutive entries. ++ * ++ * This is only for internal list manipulation where we know ++ * the prev/next entries already! ++ */ ++static inline void __list_add(struct list_head *new, ++ struct list_head *prev, ++ struct list_head *next) ++{ ++ next->prev = new; ++ new->next = next; ++ new->prev = prev; ++ prev->next = new; ++} ++ ++/** ++ * list_add - add a new entry ++ * @new: new entry to be added ++ * @head: list head to add it after ++ * ++ * Insert a new entry after the specified head. ++ * This is good for implementing stacks. ++ */ ++static inline void list_add(struct list_head *new, struct list_head *head) ++{ ++ __list_add(new, head, head->next); ++} ++ ++/** ++ * list_add_tail - add a new entry ++ * @new: new entry to be added ++ * @head: list head to add it before ++ * ++ * Insert a new entry before the specified head. ++ * This is useful for implementing queues. ++ */ ++static inline void list_add_tail(struct list_head *new, struct list_head *head) ++{ ++ __list_add(new, head->prev, head); ++} ++ ++/* ++ * Delete a list entry by making the prev/next entries ++ * point to each other. ++ * ++ * This is only for internal list manipulation where we know ++ * the prev/next entries already! ++ */ ++static inline void __list_del(struct list_head *prev, struct list_head *next) ++{ ++ next->prev = prev; ++ prev->next = next; ++} ++ ++/** ++ * list_del - deletes entry from list. ++ * @entry: the element to delete from the list. ++ * Note: list_empty on entry does not return true after this, the entry is in an undefined state. ++ */ ++static inline void list_del(struct list_head *entry) ++{ ++ __list_del(entry->prev, entry->next); ++ entry->next = (void *) 0; ++ entry->prev = (void *) 0; ++} ++ ++/** ++ * list_del_init - deletes entry from list and reinitialize it. ++ * @entry: the element to delete from the list. ++ */ ++static inline void list_del_init(struct list_head *entry) ++{ ++ __list_del(entry->prev, entry->next); ++ INIT_LIST_HEAD(entry); ++} ++ ++/** ++ * list_move - delete from one list and add as another's head ++ * @list: the entry to move ++ * @head: the head that will precede our entry ++ */ ++static inline void list_move(struct list_head *list, struct list_head *head) ++{ ++ __list_del(list->prev, list->next); ++ list_add(list, head); ++} ++ ++/** ++ * list_move_tail - delete from one list and add as another's tail ++ * @list: the entry to move ++ * @head: the head that will follow our entry ++ */ ++static inline void list_move_tail(struct list_head *list, ++ struct list_head *head) ++{ ++ __list_del(list->prev, list->next); ++ list_add_tail(list, head); ++} ++ ++/** ++ * list_empty - tests whether a list is empty ++ * @head: the list to test. ++ */ ++static inline int list_empty(struct list_head *head) ++{ ++ return head->next == head; ++} ++ ++static inline void __list_splice(struct list_head *list, ++ struct list_head *head) ++{ ++ struct list_head *first = list->next; ++ struct list_head *last = list->prev; ++ struct list_head *at = head->next; ++ ++ first->prev = head; ++ head->next = first; ++ ++ last->next = at; ++ at->prev = last; ++} ++ ++/** ++ * list_splice - join two lists ++ * @list: the new list to add. ++ * @head: the place to add it in the first list. ++ */ ++static inline void list_splice(struct list_head *list, struct list_head *head) ++{ ++ if (!list_empty(list)) ++ __list_splice(list, head); ++} ++ ++/** ++ * list_splice_init - join two lists and reinitialise the emptied list. ++ * @list: the new list to add. ++ * @head: the place to add it in the first list. ++ * ++ * The list at @list is reinitialised ++ */ ++static inline void list_splice_init(struct list_head *list, ++ struct list_head *head) ++{ ++ if (!list_empty(list)) { ++ __list_splice(list, head); ++ INIT_LIST_HEAD(list); ++ } ++} ++ ++/** ++ * list_entry - get the struct for this entry ++ * @ptr: the &struct list_head pointer. ++ * @type: the type of the struct this is embedded in. ++ * @member: the name of the list_struct within the struct. ++ */ ++#define list_entry(ptr, type, member) \ ++ ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) ++ ++/** ++ * list_for_each - iterate over a list ++ * @pos: the &struct list_head to use as a loop counter. ++ * @head: the head for your list. ++ */ ++#define list_for_each(pos, head) \ ++ for (pos = (head)->next, prefetch(pos->next); pos != (head); \ ++ pos = pos->next, prefetch(pos->next)) ++/** ++ * list_for_each_prev - iterate over a list backwards ++ * @pos: the &struct list_head to use as a loop counter. ++ * @head: the head for your list. ++ */ ++#define list_for_each_prev(pos, head) \ ++ for (pos = (head)->prev, prefetch(pos->prev); pos != (head); \ ++ pos = pos->prev, prefetch(pos->prev)) ++ ++/** ++ * list_for_each_safe - iterate over a list safe against removal of list entry ++ * @pos: the &struct list_head to use as a loop counter. ++ * @n: another &struct list_head to use as temporary storage ++ * @head: the head for your list. ++ */ ++#define list_for_each_safe(pos, n, head) \ ++ for (pos = (head)->next, n = pos->next; pos != (head); \ ++ pos = n, n = pos->next) ++ ++/** ++ * list_for_each_entry - iterate over list of given type ++ * @pos: the type * to use as a loop counter. ++ * @head: the head for your list. ++ * @member: the name of the list_struct within the struct. ++ */ ++#define list_for_each_entry(pos, head, member) \ ++ for (pos = list_entry((head)->next, typeof(*pos), member), \ ++ prefetch(pos->member.next); \ ++ &pos->member != (head); \ ++ pos = list_entry(pos->member.next, typeof(*pos), member), \ ++ prefetch(pos->member.next)) ++ ++/** ++ * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry ++ * @pos: the type * to use as a loop counter. ++ * @n: another type * to use as temporary storage ++ * @head: the head for your list. ++ * @member: the name of the list_struct within the struct. ++ */ ++#define list_for_each_entry_safe(pos, n, head, member) \ ++ for (pos = list_entry((head)->next, typeof(*pos), member), \ ++ n = list_entry(pos->member.next, typeof(*pos), member); \ ++ &pos->member != (head); \ ++ pos = n, n = list_entry(n->member.next, typeof(*n), member)) ++ ++/** ++ * list_for_each_entry_continue - iterate over list of given type ++ * continuing after existing point ++ * @pos: the type * to use as a loop counter. ++ * @head: the head for your list. ++ * @member: the name of the list_struct within the struct. ++ */ ++#define list_for_each_entry_continue(pos, head, member) \ ++ for (pos = list_entry(pos->member.next, typeof(*pos), member), \ ++ prefetch(pos->member.next); \ ++ &pos->member != (head); \ ++ pos = list_entry(pos->member.next, typeof(*pos), member), \ ++ prefetch(pos->member.next)) ++ ++#endif /* __KERNEL__ || _LVM_H_INCLUDE */ ++ ++#endif +--- ./linux/types.h 1970-01-01 00:00:00.000000000 +0000 ++++ ./linux/types.h 2004-08-20 03:17:15.071010896 +0000 +@@ -0,0 +1,137 @@ ++#ifndef _LINUX_TYPES_H ++#define _LINUX_TYPES_H ++ ++#ifdef __KERNEL__ ++#include ++ ++#define BITS_TO_LONGS(bits) \ ++ (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG) ++#define DECLARE_BITMAP(name,bits) \ ++ unsigned long name[BITS_TO_LONGS(bits)] ++#define CLEAR_BITMAP(name,bits) \ ++ memset(name, 0, BITS_TO_LONGS(bits)*sizeof(unsigned long)) ++#endif ++ ++#include ++#include ++ ++#ifndef __KERNEL_STRICT_NAMES ++ ++typedef __kernel_fd_set fd_set; ++typedef __kernel_dev_t dev_t; ++typedef __kernel_ino_t ino_t; ++typedef __kernel_mode_t mode_t; ++typedef __kernel_nlink_t nlink_t; ++typedef __kernel_off_t off_t; ++typedef __kernel_pid_t pid_t; ++typedef __kernel_daddr_t daddr_t; ++typedef __kernel_key_t key_t; ++typedef __kernel_suseconds_t suseconds_t; ++ ++#ifdef __KERNEL__ ++typedef __kernel_uid32_t uid_t; ++typedef __kernel_gid32_t gid_t; ++typedef __kernel_uid16_t uid16_t; ++typedef __kernel_gid16_t gid16_t; ++ ++#ifdef CONFIG_UID16 ++/* This is defined by include/asm-{arch}/posix_types.h */ ++typedef __kernel_old_uid_t old_uid_t; ++typedef __kernel_old_gid_t old_gid_t; ++#endif /* CONFIG_UID16 */ ++ ++/* libc5 includes this file to define uid_t, thus uid_t can never change ++ * when it is included by non-kernel code ++ */ ++#else ++typedef __kernel_uid_t uid_t; ++typedef __kernel_gid_t gid_t; ++#endif /* __KERNEL__ */ ++ ++#if defined(__GNUC__) ++typedef __kernel_loff_t loff_t; ++#endif ++ ++/* ++ * The following typedefs are also protected by individual ifdefs for ++ * historical reasons: ++ */ ++#ifndef _SIZE_T ++#define _SIZE_T ++typedef __kernel_size_t size_t; ++#endif ++ ++#ifndef _SSIZE_T ++#define _SSIZE_T ++typedef __kernel_ssize_t ssize_t; ++#endif ++ ++#ifndef _PTRDIFF_T ++#define _PTRDIFF_T ++typedef __kernel_ptrdiff_t ptrdiff_t; ++#endif ++ ++#ifndef _TIME_T ++#define _TIME_T ++typedef __kernel_time_t time_t; ++#endif ++ ++#ifndef _CLOCK_T ++#define _CLOCK_T ++typedef __kernel_clock_t clock_t; ++#endif ++ ++#ifndef _CADDR_T ++#define _CADDR_T ++typedef __kernel_caddr_t caddr_t; ++#endif ++ ++/* bsd */ ++typedef unsigned char u_char; ++typedef unsigned short u_short; ++typedef unsigned int u_int; ++typedef unsigned long u_long; ++ ++/* sysv */ ++typedef unsigned char unchar; ++typedef unsigned short ushort; ++typedef unsigned int uint; ++typedef unsigned long ulong; ++ ++#ifndef __BIT_TYPES_DEFINED__ ++#define __BIT_TYPES_DEFINED__ ++ ++typedef __u8 u_int8_t; ++typedef __s8 int8_t; ++typedef __u16 u_int16_t; ++typedef __s16 int16_t; ++typedef __u32 u_int32_t; ++typedef __s32 int32_t; ++ ++#endif /* !(__BIT_TYPES_DEFINED__) */ ++ ++typedef __u8 uint8_t; ++typedef __u16 uint16_t; ++typedef __u32 uint32_t; ++ ++#if defined(__GNUC__) && !defined(__STRICT_ANSI__) ++typedef __u64 uint64_t; ++typedef __u64 u_int64_t; ++typedef __s64 int64_t; ++#endif ++ ++#endif /* __KERNEL_STRICT_NAMES */ ++ ++/* ++ * Below are truly Linux-specific types that should never collide with ++ * any application/library that wants linux/types.h. ++ */ ++ ++struct ustat { ++ __kernel_daddr_t f_tfree; ++ __kernel_ino_t f_tinode; ++ char f_fname[6]; ++ char f_fpack[6]; ++}; ++ ++#endif /* _LINUX_TYPES_H */ +--- ./linux/vfs.h 1970-01-01 00:00:00.000000000 +0000 ++++ ./linux/vfs.h 2004-08-20 03:18:36.751593560 +0000 +@@ -0,0 +1,6 @@ ++#ifndef _LINUX_VFS_H ++#define _LINUX_VFS_H ++ ++#include ++ ++#endif