aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/ubi/vmt.c
diff options
context:
space:
mode:
authorDmitry Pervushin <dpervushin@embeddedalley.com>2009-04-29 11:29:38 -0400
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2009-06-02 06:53:35 -0400
commit0e0ee1cc33de8f0cc603269b354085dee340afa0 (patch)
tree5dfd658b85eabadfbf0c94bee94d46f8d74b839b /drivers/mtd/ubi/vmt.c
parentb86a2c56e512f46d140a4bcb4e35e8a7d4a99a4b (diff)
UBI: add notification API
UBI volume notifications are intended to create the API to get clients notified about volume creation/deletion, renaming and re-sizing. A client can subscribe to these notifications using 'ubi_volume_register()' and cancel the subscription using 'ubi_volume_unregister()'. When UBI volumes change, a blocking notifier is called. Clients also can request "added" events on all volumes that existed before client subscribed to the notifications. If we use notifications instead of calling functions like 'ubi_gluebi_xxx()', we can make the MTD emulation layer to be more flexible: build it as a separate module and load/unload it on demand. [Artem: many cleanups, rework locking, add "updated" event, provide device/volume info in notifiers] Signed-off-by: Dmitry Pervushin <dpervushin@embeddedalley.com> Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Diffstat (limited to 'drivers/mtd/ubi/vmt.c')
-rw-r--r--drivers/mtd/ubi/vmt.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/mtd/ubi/vmt.c b/drivers/mtd/ubi/vmt.c
index 8e8d6fae7a02..e151862a3a98 100644
--- a/drivers/mtd/ubi/vmt.c
+++ b/drivers/mtd/ubi/vmt.c
@@ -358,6 +358,7 @@ int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req)
358 ubi->vol_count += 1; 358 ubi->vol_count += 1;
359 spin_unlock(&ubi->volumes_lock); 359 spin_unlock(&ubi->volumes_lock);
360 360
361 ubi_volume_notify(ubi, vol, UBI_VOLUME_ADDED);
361 if (paranoid_check_volumes(ubi)) 362 if (paranoid_check_volumes(ubi))
362 dbg_err("check failed while creating volume %d", vol_id); 363 dbg_err("check failed while creating volume %d", vol_id);
363 return err; 364 return err;
@@ -466,6 +467,7 @@ int ubi_remove_volume(struct ubi_volume_desc *desc, int no_vtbl)
466 ubi->vol_count -= 1; 467 ubi->vol_count -= 1;
467 spin_unlock(&ubi->volumes_lock); 468 spin_unlock(&ubi->volumes_lock);
468 469
470 ubi_volume_notify(ubi, vol, UBI_VOLUME_REMOVED);
469 if (!no_vtbl && paranoid_check_volumes(ubi)) 471 if (!no_vtbl && paranoid_check_volumes(ubi))
470 dbg_err("check failed while removing volume %d", vol_id); 472 dbg_err("check failed while removing volume %d", vol_id);
471 473
@@ -589,6 +591,7 @@ int ubi_resize_volume(struct ubi_volume_desc *desc, int reserved_pebs)
589 (long long)vol->used_ebs * vol->usable_leb_size; 591 (long long)vol->used_ebs * vol->usable_leb_size;
590 } 592 }
591 593
594 ubi_volume_notify(ubi, vol, UBI_VOLUME_RESIZED);
592 if (paranoid_check_volumes(ubi)) 595 if (paranoid_check_volumes(ubi))
593 dbg_err("check failed while re-sizing volume %d", vol_id); 596 dbg_err("check failed while re-sizing volume %d", vol_id);
594 return err; 597 return err;
@@ -635,6 +638,7 @@ int ubi_rename_volumes(struct ubi_device *ubi, struct list_head *rename_list)
635 vol->name_len = re->new_name_len; 638 vol->name_len = re->new_name_len;
636 memcpy(vol->name, re->new_name, re->new_name_len + 1); 639 memcpy(vol->name, re->new_name, re->new_name_len + 1);
637 spin_unlock(&ubi->volumes_lock); 640 spin_unlock(&ubi->volumes_lock);
641 ubi_volume_notify(ubi, vol, UBI_VOLUME_RENAMED);
638 } 642 }
639 } 643 }
640 644