memory hotplug: Update phys_index to [start|end]_section_nr
[linux-2.6.git] / drivers / base / memory.c
index 0b70400..71b4a32 100644 (file)
@@ -97,7 +97,7 @@ int register_memory(struct memory_block *memory)
        int error;
 
        memory->sysdev.cls = &memory_sysdev_class;
-       memory->sysdev.id = memory->phys_index / sections_per_block;
+       memory->sysdev.id = memory->start_section_nr / sections_per_block;
 
        error = sysdev_register(&memory->sysdev);
        return error;
@@ -138,12 +138,26 @@ static unsigned long get_memory_block_size(void)
  * uses.
  */
 
-static ssize_t show_mem_phys_index(struct sys_device *dev,
+static ssize_t show_mem_start_phys_index(struct sys_device *dev,
                        struct sysdev_attribute *attr, char *buf)
 {
        struct memory_block *mem =
                container_of(dev, struct memory_block, sysdev);
-       return sprintf(buf, "%08lx\n", mem->phys_index / sections_per_block);
+       unsigned long phys_index;
+
+       phys_index = mem->start_section_nr / sections_per_block;
+       return sprintf(buf, "%08lx\n", phys_index);
+}
+
+static ssize_t show_mem_end_phys_index(struct sys_device *dev,
+                       struct sysdev_attribute *attr, char *buf)
+{
+       struct memory_block *mem =
+               container_of(dev, struct memory_block, sysdev);
+       unsigned long phys_index;
+
+       phys_index = mem->end_section_nr / sections_per_block;
+       return sprintf(buf, "%08lx\n", phys_index);
 }
 
 /*
@@ -158,7 +172,7 @@ static ssize_t show_mem_removable(struct sys_device *dev,
                container_of(dev, struct memory_block, sysdev);
 
        for (i = 0; i < sections_per_block; i++) {
-               pfn = section_nr_to_pfn(mem->phys_index + i);
+               pfn = section_nr_to_pfn(mem->start_section_nr + i);
                ret &= is_mem_section_removable(pfn, PAGES_PER_SECTION);
        }
 
@@ -275,14 +289,15 @@ static int memory_block_change_state(struct memory_block *mem,
                mem->state = MEM_GOING_OFFLINE;
 
        for (i = 0; i < sections_per_block; i++) {
-               ret = memory_section_action(mem->phys_index + i, to_state);
+               ret = memory_section_action(mem->start_section_nr + i,
+                                           to_state);
                if (ret)
                        break;
        }
 
        if (ret) {
                for (i = 0; i < sections_per_block; i++)
-                       memory_section_action(mem->phys_index + i,
+                       memory_section_action(mem->start_section_nr + i,
                                              from_state_req);
 
                mem->state = from_state_req;
@@ -330,7 +345,8 @@ static ssize_t show_phys_device(struct sys_device *dev,
        return sprintf(buf, "%d\n", mem->phys_device);
 }
 
-static SYSDEV_ATTR(phys_index, 0444, show_mem_phys_index, NULL);
+static SYSDEV_ATTR(phys_index, 0444, show_mem_start_phys_index, NULL);
+static SYSDEV_ATTR(end_phys_index, 0444, show_mem_end_phys_index, NULL);
 static SYSDEV_ATTR(state, 0644, show_mem_state, store_mem_state);
 static SYSDEV_ATTR(phys_device, 0444, show_phys_device, NULL);
 static SYSDEV_ATTR(removable, 0444, show_mem_removable, NULL);
@@ -522,17 +538,21 @@ static int init_memory_block(struct memory_block **memory,
                return -ENOMEM;
 
        scn_nr = __section_nr(section);
-       mem->phys_index = base_memory_block_id(scn_nr) * sections_per_block;
+       mem->start_section_nr =
+                       base_memory_block_id(scn_nr) * sections_per_block;
+       mem->end_section_nr = mem->start_section_nr + sections_per_block - 1;
        mem->state = state;
        mem->section_count++;
        mutex_init(&mem->state_mutex);
-       start_pfn = section_nr_to_pfn(mem->phys_index);
+       start_pfn = section_nr_to_pfn(mem->start_section_nr);
        mem->phys_device = arch_get_memory_phys_device(start_pfn);
 
        ret = register_memory(mem);
        if (!ret)
                ret = mem_create_simple_file(mem, phys_index);
        if (!ret)
+               ret = mem_create_simple_file(mem, end_phys_index);
+       if (!ret)
                ret = mem_create_simple_file(mem, state);
        if (!ret)
                ret = mem_create_simple_file(mem, phys_device);
@@ -575,11 +595,12 @@ int remove_memory_block(unsigned long node_id, struct mem_section *section,
 
        mutex_lock(&mem_sysfs_mutex);
        mem = find_memory_block(section);
+       unregister_mem_sect_under_nodes(mem, __section_nr(section));
 
        mem->section_count--;
        if (mem->section_count == 0) {
-               unregister_mem_sect_under_nodes(mem);
                mem_remove_simple_file(mem, phys_index);
+               mem_remove_simple_file(mem, end_phys_index);
                mem_remove_simple_file(mem, state);
                mem_remove_simple_file(mem, phys_device);
                mem_remove_simple_file(mem, removable);