diff options
| author | Nicholas Bellinger <nab@linux-iscsi.org> | 2011-01-16 16:21:04 -0500 |
|---|---|---|
| committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2011-01-16 16:21:04 -0500 |
| commit | f652f6c5b7cfdf139f4155d78f397e99ae1c4acc (patch) | |
| tree | 71c6344688bf56ea6aaf18c586ab69ff4f077ade /include/linux/genhd.h | |
| parent | 140e3008e7fe1526cbb12f8f07dbc273ac713b75 (diff) | |
| parent | c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5 (diff) | |
Merge branch 'master' of /pub/scm/linux/kernel/git/jejb/scsi-post-merge-2.6 into for-linus
Diffstat (limited to 'include/linux/genhd.h')
| -rw-r--r-- | include/linux/genhd.h | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 13893aa2ac9d..c0d5f6945c1e 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h | |||
| @@ -115,6 +115,7 @@ struct hd_struct { | |||
| 115 | #else | 115 | #else |
| 116 | struct disk_stats dkstats; | 116 | struct disk_stats dkstats; |
| 117 | #endif | 117 | #endif |
| 118 | atomic_t ref; | ||
| 118 | struct rcu_head rcu_head; | 119 | struct rcu_head rcu_head; |
| 119 | }; | 120 | }; |
| 120 | 121 | ||
| @@ -597,6 +598,7 @@ extern struct hd_struct * __must_check add_partition(struct gendisk *disk, | |||
| 597 | sector_t len, int flags, | 598 | sector_t len, int flags, |
| 598 | struct partition_meta_info | 599 | struct partition_meta_info |
| 599 | *info); | 600 | *info); |
| 601 | extern void __delete_partition(struct hd_struct *); | ||
| 600 | extern void delete_partition(struct gendisk *, int); | 602 | extern void delete_partition(struct gendisk *, int); |
| 601 | extern void printk_all_partitions(void); | 603 | extern void printk_all_partitions(void); |
| 602 | 604 | ||
| @@ -625,6 +627,29 @@ extern ssize_t part_fail_store(struct device *dev, | |||
| 625 | const char *buf, size_t count); | 627 | const char *buf, size_t count); |
| 626 | #endif /* CONFIG_FAIL_MAKE_REQUEST */ | 628 | #endif /* CONFIG_FAIL_MAKE_REQUEST */ |
| 627 | 629 | ||
| 630 | static inline void hd_ref_init(struct hd_struct *part) | ||
| 631 | { | ||
| 632 | atomic_set(&part->ref, 1); | ||
| 633 | smp_mb(); | ||
| 634 | } | ||
| 635 | |||
| 636 | static inline void hd_struct_get(struct hd_struct *part) | ||
| 637 | { | ||
| 638 | atomic_inc(&part->ref); | ||
| 639 | smp_mb__after_atomic_inc(); | ||
| 640 | } | ||
| 641 | |||
| 642 | static inline int hd_struct_try_get(struct hd_struct *part) | ||
| 643 | { | ||
| 644 | return atomic_inc_not_zero(&part->ref); | ||
| 645 | } | ||
| 646 | |||
| 647 | static inline void hd_struct_put(struct hd_struct *part) | ||
| 648 | { | ||
| 649 | if (atomic_dec_and_test(&part->ref)) | ||
| 650 | __delete_partition(part); | ||
| 651 | } | ||
| 652 | |||
| 628 | #else /* CONFIG_BLOCK */ | 653 | #else /* CONFIG_BLOCK */ |
| 629 | 654 | ||
| 630 | static inline void printk_all_partitions(void) { } | 655 | static inline void printk_all_partitions(void) { } |
