diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-22 20:00:32 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-22 20:00:32 -0400 |
| commit | e9dd2b6837e26fe202708cce5ea4bb4ee3e3482e (patch) | |
| tree | f42fd892495bfc4cbb740d06b016d267c9c42d00 /init | |
| parent | 4f3a29dadaf999a273f1e7fe2476595d0283eef3 (diff) | |
| parent | b4627321e18582dcbdeb45d77df29d3177107c65 (diff) | |
Merge branch 'for-2.6.37/core' of git://git.kernel.dk/linux-2.6-block
* 'for-2.6.37/core' of git://git.kernel.dk/linux-2.6-block: (39 commits)
cfq-iosched: Fix a gcc 4.5 warning and put some comments
block: Turn bvec_k{un,}map_irq() into static inline functions
block: fix accounting bug on cross partition merges
block: Make the integrity mapped property a bio flag
block: Fix double free in blk_integrity_unregister
block: Ensure physical block size is unsigned int
blkio-throttle: Fix possible multiplication overflow in iops calculations
blkio-throttle: limit max iops value to UINT_MAX
blkio-throttle: There is no need to convert jiffies to milli seconds
blkio-throttle: Fix link failure failure on i386
blkio: Recalculate the throttled bio dispatch time upon throttle limit change
blkio: Add root group to td->tg_list
blkio: deletion of a cgroup was causes oops
blkio: Do not export throttle files if CONFIG_BLK_DEV_THROTTLING=n
block: set the bounce_pfn to the actual DMA limit rather than to max memory
block: revert bad fix for memory hotplug causing bounces
Fix compile error in blk-exec.c for !CONFIG_DETECT_HUNG_TASK
block: set the bounce_pfn to the actual DMA limit rather than to max memory
block: Prevent hang_check firing during long I/O
cfq: improve fsync performance for small files
...
Fix up trivial conflicts due to __rcu sparse annotation in include/linux/genhd.h
Diffstat (limited to 'init')
| -rw-r--r-- | init/Kconfig | 9 | ||||
| -rw-r--r-- | init/do_mounts.c | 70 |
2 files changed, 76 insertions, 3 deletions
diff --git a/init/Kconfig b/init/Kconfig index be85a0ab1b82..bd125a795374 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
| @@ -661,11 +661,14 @@ config BLK_CGROUP | |||
| 661 | 661 | ||
| 662 | Currently, CFQ IO scheduler uses it to recognize task groups and | 662 | Currently, CFQ IO scheduler uses it to recognize task groups and |
| 663 | control disk bandwidth allocation (proportional time slice allocation) | 663 | control disk bandwidth allocation (proportional time slice allocation) |
| 664 | to such task groups. | 664 | to such task groups. It is also used by bio throttling logic in |
| 665 | block layer to implement upper limit in IO rates on a device. | ||
| 665 | 666 | ||
| 666 | This option only enables generic Block IO controller infrastructure. | 667 | This option only enables generic Block IO controller infrastructure. |
| 667 | One needs to also enable actual IO controlling logic in CFQ for it | 668 | One needs to also enable actual IO controlling logic/policy. For |
| 668 | to take effect. (CONFIG_CFQ_GROUP_IOSCHED=y). | 669 | enabling proportional weight division of disk bandwidth in CFQ seti |
| 670 | CONFIG_CFQ_GROUP_IOSCHED=y and for enabling throttling policy set | ||
| 671 | CONFIG_BLK_THROTTLE=y. | ||
| 669 | 672 | ||
| 670 | See Documentation/cgroups/blkio-controller.txt for more information. | 673 | See Documentation/cgroups/blkio-controller.txt for more information. |
| 671 | 674 | ||
diff --git a/init/do_mounts.c b/init/do_mounts.c index 02e3ca4fc527..42db0551c3aa 100644 --- a/init/do_mounts.c +++ b/init/do_mounts.c | |||
| @@ -58,6 +58,62 @@ static int __init readwrite(char *str) | |||
| 58 | __setup("ro", readonly); | 58 | __setup("ro", readonly); |
| 59 | __setup("rw", readwrite); | 59 | __setup("rw", readwrite); |
| 60 | 60 | ||
| 61 | #ifdef CONFIG_BLOCK | ||
| 62 | /** | ||
| 63 | * match_dev_by_uuid - callback for finding a partition using its uuid | ||
| 64 | * @dev: device passed in by the caller | ||
| 65 | * @data: opaque pointer to a 36 byte char array with a UUID | ||
| 66 | * | ||
| 67 | * Returns 1 if the device matches, and 0 otherwise. | ||
| 68 | */ | ||
| 69 | static int match_dev_by_uuid(struct device *dev, void *data) | ||
| 70 | { | ||
| 71 | u8 *uuid = data; | ||
| 72 | struct hd_struct *part = dev_to_part(dev); | ||
| 73 | |||
| 74 | if (!part->info) | ||
| 75 | goto no_match; | ||
| 76 | |||
| 77 | if (memcmp(uuid, part->info->uuid, sizeof(part->info->uuid))) | ||
| 78 | goto no_match; | ||
| 79 | |||
| 80 | return 1; | ||
| 81 | no_match: | ||
| 82 | return 0; | ||
| 83 | } | ||
| 84 | |||
| 85 | |||
| 86 | /** | ||
| 87 | * devt_from_partuuid - looks up the dev_t of a partition by its UUID | ||
| 88 | * @uuid: 36 byte char array containing a hex ascii UUID | ||
| 89 | * | ||
| 90 | * The function will return the first partition which contains a matching | ||
| 91 | * UUID value in its partition_meta_info struct. This does not search | ||
| 92 | * by filesystem UUIDs. | ||
| 93 | * | ||
| 94 | * Returns the matching dev_t on success or 0 on failure. | ||
| 95 | */ | ||
| 96 | static dev_t __init devt_from_partuuid(char *uuid_str) | ||
| 97 | { | ||
| 98 | dev_t res = 0; | ||
| 99 | struct device *dev = NULL; | ||
| 100 | u8 uuid[16]; | ||
| 101 | |||
| 102 | /* Pack the requested UUID in the expected format. */ | ||
| 103 | part_pack_uuid(uuid_str, uuid); | ||
| 104 | |||
| 105 | dev = class_find_device(&block_class, NULL, uuid, &match_dev_by_uuid); | ||
| 106 | if (!dev) | ||
| 107 | goto done; | ||
| 108 | |||
| 109 | res = dev->devt; | ||
| 110 | put_device(dev); | ||
| 111 | |||
| 112 | done: | ||
| 113 | return res; | ||
| 114 | } | ||
| 115 | #endif | ||
| 116 | |||
| 61 | /* | 117 | /* |
| 62 | * Convert a name into device number. We accept the following variants: | 118 | * Convert a name into device number. We accept the following variants: |
| 63 | * | 119 | * |
| @@ -68,6 +124,8 @@ __setup("rw", readwrite); | |||
| 68 | * of partition - device number of disk plus the partition number | 124 | * of partition - device number of disk plus the partition number |
| 69 | * 5) /dev/<disk_name>p<decimal> - same as the above, that form is | 125 | * 5) /dev/<disk_name>p<decimal> - same as the above, that form is |
| 70 | * used when disk name of partitioned disk ends on a digit. | 126 | * used when disk name of partitioned disk ends on a digit. |
| 127 | * 6) PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF representing the | ||
| 128 | * unique id of a partition if the partition table provides it. | ||
| 71 | * | 129 | * |
| 72 | * If name doesn't have fall into the categories above, we return (0,0). | 130 | * If name doesn't have fall into the categories above, we return (0,0). |
| 73 | * block_class is used to check if something is a disk name. If the disk | 131 | * block_class is used to check if something is a disk name. If the disk |
| @@ -82,6 +140,18 @@ dev_t name_to_dev_t(char *name) | |||
| 82 | dev_t res = 0; | 140 | dev_t res = 0; |
| 83 | int part; | 141 | int part; |
| 84 | 142 | ||
| 143 | #ifdef CONFIG_BLOCK | ||
| 144 | if (strncmp(name, "PARTUUID=", 9) == 0) { | ||
| 145 | name += 9; | ||
| 146 | if (strlen(name) != 36) | ||
| 147 | goto fail; | ||
| 148 | res = devt_from_partuuid(name); | ||
| 149 | if (!res) | ||
| 150 | goto fail; | ||
| 151 | goto done; | ||
| 152 | } | ||
| 153 | #endif | ||
| 154 | |||
| 85 | if (strncmp(name, "/dev/", 5) != 0) { | 155 | if (strncmp(name, "/dev/", 5) != 0) { |
| 86 | unsigned maj, min; | 156 | unsigned maj, min; |
| 87 | 157 | ||
