diff options
| author | Jeff Garzik <jgarzik@redhat.com> | 2002-12-01 12:41:57 -0500 |
|---|---|---|
| committer | Jeff Garzik <jgarzik@redhat.com> | 2002-12-01 12:41:57 -0500 |
| commit | eccb5ce4b6fec9da2edc4156c3f3b062621a6596 (patch) | |
| tree | d7cf02705ea01b506a9c14492153b93d2793ca6b | |
| parent | f1d4b51f15c188e114cbd0a2ff3f89dfd13236b7 (diff) | |
| parent | 810408f08f012fe40b94e32cac21b5d485eb0018 (diff) | |
Merge redhat.com:/home/jgarzik/repo/linus-2.5
into redhat.com:/home/jgarzik/repo/misc-2.5
| -rw-r--r-- | drivers/pci/pci.c | 2 | ||||
| -rw-r--r-- | fs/fcntl.c | 38 | ||||
| -rw-r--r-- | fs/proc/generic.c | 21 | ||||
| -rw-r--r-- | include/linux/pci.h | 45 |
4 files changed, 76 insertions, 30 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 5c7a4c036755..c973c999ef00 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -88,6 +88,8 @@ pci_max_busnr(void) * %PCI_CAP_ID_MSI Message Signalled Interrupts * * %PCI_CAP_ID_CHSWP CompactPCI HotSwap + * + * %PCI_CAP_ID_PCIX PCI-X */ int pci_find_capability(struct pci_dev *dev, int cap) diff --git a/fs/fcntl.c b/fs/fcntl.c index 041b84ffd0ce..fae2022ada19 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c @@ -75,8 +75,8 @@ static int expand_files(struct files_struct *files, int nr) /* * locate_fd finds a free file descriptor in the open_fds fdset, - * expanding the fd arrays if necessary. The files write lock will be - * held on exit to ensure that the fd can be entered atomically. + * expanding the fd arrays if necessary. Must be called with the + * file_lock held for write. */ static int locate_fd(struct files_struct *files, @@ -86,8 +86,6 @@ static int locate_fd(struct files_struct *files, int error; int start; - write_lock(&files->file_lock); - error = -EINVAL; if (orig_start >= current->rlim[RLIMIT_NOFILE].rlim_cur) goto out; @@ -131,30 +129,24 @@ out: return error; } -static inline void allocate_fd(struct files_struct *files, - struct file *file, int fd) -{ - FD_SET(fd, files->open_fds); - FD_CLR(fd, files->close_on_exec); - write_unlock(&files->file_lock); - fd_install(fd, file); -} - static int dupfd(struct file *file, int start) { struct files_struct * files = current->files; - int ret; + int fd; - ret = locate_fd(files, file, start); - if (ret < 0) - goto out_putf; - allocate_fd(files, file, ret); - return ret; + write_lock(&files->file_lock); + fd = locate_fd(files, file, start); + if (fd >= 0) { + FD_SET(fd, files->open_fds); + FD_CLR(fd, files->close_on_exec); + write_unlock(&files->file_lock); + fd_install(fd, file); + } else { + write_unlock(&files->file_lock); + fput(file); + } -out_putf: - write_unlock(&files->file_lock); - fput(file); - return ret; + return fd; } asmlinkage long sys_dup2(unsigned int oldfd, unsigned int newfd) diff --git a/fs/proc/generic.c b/fs/proc/generic.c index bab86d71ed00..bcc4fac3f1ff 100644 --- a/fs/proc/generic.c +++ b/fs/proc/generic.c @@ -488,7 +488,11 @@ struct proc_dir_entry *proc_symlink(const char *name, ent->data = kmalloc((ent->size=strlen(dest))+1, GFP_KERNEL); if (ent->data) { strcpy((char*)ent->data,dest); - proc_register(parent, ent); + if (proc_register(parent, ent) < 0) { + kfree(ent->data); + kfree(ent); + ent = NULL; + } } else { kfree(ent); ent = NULL; @@ -505,7 +509,10 @@ struct proc_dir_entry *proc_mknod(const char *name, mode_t mode, ent = proc_create(&parent,name,mode,1); if (ent) { ent->rdev = rdev; - proc_register(parent, ent); + if (proc_register(parent, ent) < 0) { + kfree(ent); + ent = NULL; + } } return ent; } @@ -520,7 +527,10 @@ struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *paren ent->proc_fops = &proc_dir_operations; ent->proc_iops = &proc_dir_inode_operations; - proc_register(parent, ent); + if (proc_register(parent, ent) < 0) { + kfree(ent); + ent = NULL; + } } return ent; } @@ -549,7 +559,10 @@ struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode, ent->proc_fops = &proc_dir_operations; ent->proc_iops = &proc_dir_inode_operations; } - proc_register(parent, ent); + if (proc_register(parent, ent) < 0) { + kfree(ent); + ent = NULL; + } } return ent; } diff --git a/include/linux/pci.h b/include/linux/pci.h index 30c4a9dbc855..eede29dc50ad 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -65,9 +65,9 @@ #define PCI_HEADER_TYPE_CARDBUS 2 #define PCI_BIST 0x0f /* 8 bits */ -#define PCI_BIST_CODE_MASK 0x0f /* Return result */ -#define PCI_BIST_START 0x40 /* 1 to start BIST, 2 secs or less */ -#define PCI_BIST_CAPABLE 0x80 /* 1 if BIST capable */ +#define PCI_BIST_CODE_MASK 0x0f /* Return result */ +#define PCI_BIST_START 0x40 /* 1 to start BIST, 2 secs or less */ +#define PCI_BIST_CAPABLE 0x80 /* 1 if BIST capable */ /* * Base addresses specify locations in memory or I/O space. @@ -195,6 +195,7 @@ #define PCI_CAP_ID_SLOTID 0x04 /* Slot Identification */ #define PCI_CAP_ID_MSI 0x05 /* Message Signalled Interrupts */ #define PCI_CAP_ID_CHSWP 0x06 /* CompactPCI HotSwap */ +#define PCI_CAP_ID_PCIX 0x07 /* PCI-X */ #define PCI_CAP_LIST_NEXT 1 /* Next capability in the list */ #define PCI_CAP_FLAGS 2 /* Capability defined flags (16 bits) */ #define PCI_CAP_SIZEOF 4 @@ -251,6 +252,13 @@ #define PCI_AGP_COMMAND_RATE1 0x0001 /* Use 1x rate */ #define PCI_AGP_SIZEOF 12 +/* Vital Product Data */ + +#define PCI_VPD_ADDR 2 /* Address to access (15 bits!) */ +#define PCI_VPD_ADDR_MASK 0x7fff /* Address mask */ +#define PCI_VPD_ADDR_F 0x8000 /* Write 0, 1 indicates completion */ +#define PCI_VPD_DATA 4 /* 32-bits of data returned here */ + /* Slot Identification */ #define PCI_SID_ESR 2 /* Expansion Slot Register */ @@ -271,6 +279,37 @@ #define PCI_MSI_DATA_32 8 /* 16 bits of data for 32-bit devices */ #define PCI_MSI_DATA_64 12 /* 16 bits of data for 64-bit devices */ +/* CompactPCI Hotswap Register */ + +#define PCI_CHSWP_CSR 2 /* Control and Status Register */ +#define PCI_CHSWP_DHA 0x01 /* Device Hiding Arm */ +#define PCI_CHSWP_EIM 0x02 /* ENUM# Signal Mask */ +#define PCI_CHSWP_PIE 0x04 /* Pending Insert or Extract */ +#define PCI_CHSWP_LOO 0x08 /* LED On / Off */ +#define PCI_CHSWP_PI 0x30 /* Programming Interface */ +#define PCI_CHSWP_EXT 0x40 /* ENUM# status - extraction */ +#define PCI_CHSWP_INS 0x80 /* ENUM# status - insertion */ + +/* PCI-X registers */ + +#define PCI_X_CMD 2 /* Modes & Features */ +#define PCI_X_CMD_DPERR_E 0x0001 /* Data Parity Error Recovery Enable */ +#define PCI_X_CMD_ERO 0x0002 /* Enable Relaxed Ordering */ +#define PCI_X_CMD_MAX_READ 0x000c /* Max Memory Read Byte Count */ +#define PCI_X_CMD_MAX_SPLIT 0x0070 /* Max Outstanding Split Transactions */ +#define PCI_X_DEVFN 4 /* A copy of devfn. */ +#define PCI_X_BUSNR 5 /* Bus segment number */ +#define PCI_X_STATUS 6 /* PCI-X capabilities */ +#define PCI_X_STATUS_64BIT 0x0001 /* 64-bit device */ +#define PCI_X_STATUS_133MHZ 0x0002 /* 133 MHz capable */ +#define PCI_X_STATUS_SPL_DISC 0x0004 /* Split Completion Discarded */ +#define PCI_X_STATUS_UNX_SPL 0x0008 /* Unexpected Split Completion */ +#define PCI_X_STATUS_COMPLEX 0x0010 /* Device Complexity */ +#define PCI_X_STATUS_MAX_READ 0x0060 /* Designed Maximum Memory Read Count */ +#define PCI_X_STATUS_MAX_SPLIT 0x0380 /* Design Max Outstanding Split Trans */ +#define PCI_X_STATUS_MAX_CUM 0x1c00 /* Designed Max Cumulative Read Size */ +#define PCI_X_STATUS_SPL_ERR 0x2000 /* Rcvd Split Completion Error Msg */ + /* Include the ID list */ #include <linux/pci_ids.h> |
