aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mtd/ubi/cdev.c4
-rw-r--r--drivers/mtd/ubi/ubi.h5
-rw-r--r--drivers/mtd/ubi/upd.c63
3 files changed, 36 insertions, 36 deletions
diff --git a/drivers/mtd/ubi/cdev.c b/drivers/mtd/ubi/cdev.c
index d9bd49421cce..0c4044d6cae0 100644
--- a/drivers/mtd/ubi/cdev.c
+++ b/drivers/mtd/ubi/cdev.c
@@ -354,7 +354,7 @@ static ssize_t vol_cdev_write(struct file *file, const char __user *buf,
354 if (!vol->updating) 354 if (!vol->updating)
355 return vol_cdev_direct_write(file, buf, count, offp); 355 return vol_cdev_direct_write(file, buf, count, offp);
356 356
357 err = ubi_more_update_data(ubi, vol->vol_id, buf, count); 357 err = ubi_more_update_data(ubi, vol, buf, count);
358 if (err < 0) { 358 if (err < 0) {
359 ubi_err("cannot write %zd bytes of update data, error %d", 359 ubi_err("cannot write %zd bytes of update data, error %d",
360 count, err); 360 count, err);
@@ -427,7 +427,7 @@ static int vol_cdev_ioctl(struct inode *inode, struct file *file,
427 if (err < 0) 427 if (err < 0)
428 break; 428 break;
429 429
430 err = ubi_start_update(ubi, vol->vol_id, bytes); 430 err = ubi_start_update(ubi, vol, bytes);
431 if (bytes == 0) 431 if (bytes == 0)
432 revoke_exclusive(desc, UBI_READWRITE); 432 revoke_exclusive(desc, UBI_READWRITE);
433 break; 433 break;
diff --git a/drivers/mtd/ubi/ubi.h b/drivers/mtd/ubi/ubi.h
index a8cdbd0364fb..3a88cf1eaaa8 100644
--- a/drivers/mtd/ubi/ubi.h
+++ b/drivers/mtd/ubi/ubi.h
@@ -423,8 +423,9 @@ int ubi_add_volume(struct ubi_device *ubi, struct ubi_volume *vol);
423void ubi_free_volume(struct ubi_device *ubi, struct ubi_volume *vol); 423void ubi_free_volume(struct ubi_device *ubi, struct ubi_volume *vol);
424 424
425/* upd.c */ 425/* upd.c */
426int ubi_start_update(struct ubi_device *ubi, int vol_id, long long bytes); 426int ubi_start_update(struct ubi_device *ubi, struct ubi_volume *vol,
427int ubi_more_update_data(struct ubi_device *ubi, int vol_id, 427 long long bytes);
428int ubi_more_update_data(struct ubi_device *ubi, struct ubi_volume *vol,
428 const void __user *buf, int count); 429 const void __user *buf, int count);
429 430
430/* misc.c */ 431/* misc.c */
diff --git a/drivers/mtd/ubi/upd.c b/drivers/mtd/ubi/upd.c
index 3defa579fab0..59c61ab4f2aa 100644
--- a/drivers/mtd/ubi/upd.c
+++ b/drivers/mtd/ubi/upd.c
@@ -45,30 +45,30 @@
45/** 45/**
46 * set_update_marker - set update marker. 46 * set_update_marker - set update marker.
47 * @ubi: UBI device description object 47 * @ubi: UBI device description object
48 * @vol_id: volume ID 48 * @vol: volume description object
49 * 49 *
50 * This function sets the update marker flag for volume @vol_id. Returns zero 50 * This function sets the update marker flag for volume @vol. Returns zero
51 * in case of success and a negative error code in case of failure. 51 * in case of success and a negative error code in case of failure.
52 */ 52 */
53static int set_update_marker(struct ubi_device *ubi, int vol_id) 53static int set_update_marker(struct ubi_device *ubi, struct ubi_volume *vol)
54{ 54{
55 int err; 55 int err;
56 struct ubi_vtbl_record vtbl_rec; 56 struct ubi_vtbl_record vtbl_rec;
57 struct ubi_volume *vol = ubi->volumes[vol_id];
58 57
59 dbg_msg("set update marker for volume %d", vol_id); 58 dbg_msg("set update marker for volume %d", vol->vol_id);
60 59
61 if (vol->upd_marker) { 60 if (vol->upd_marker) {
62 ubi_assert(ubi->vtbl[vol_id].upd_marker); 61 ubi_assert(ubi->vtbl[vol->vol_id].upd_marker);
63 dbg_msg("already set"); 62 dbg_msg("already set");
64 return 0; 63 return 0;
65 } 64 }
66 65
67 memcpy(&vtbl_rec, &ubi->vtbl[vol_id], sizeof(struct ubi_vtbl_record)); 66 memcpy(&vtbl_rec, &ubi->vtbl[vol->vol_id],
67 sizeof(struct ubi_vtbl_record));
68 vtbl_rec.upd_marker = 1; 68 vtbl_rec.upd_marker = 1;
69 69
70 mutex_lock(&ubi->volumes_mutex); 70 mutex_lock(&ubi->volumes_mutex);
71 err = ubi_change_vtbl_record(ubi, vol_id, &vtbl_rec); 71 err = ubi_change_vtbl_record(ubi, vol->vol_id, &vtbl_rec);
72 mutex_unlock(&ubi->volumes_mutex); 72 mutex_unlock(&ubi->volumes_mutex);
73 vol->upd_marker = 1; 73 vol->upd_marker = 1;
74 return err; 74 return err;
@@ -77,23 +77,24 @@ static int set_update_marker(struct ubi_device *ubi, int vol_id)
77/** 77/**
78 * clear_update_marker - clear update marker. 78 * clear_update_marker - clear update marker.
79 * @ubi: UBI device description object 79 * @ubi: UBI device description object
80 * @vol_id: volume ID 80 * @vol: volume description object
81 * @bytes: new data size in bytes 81 * @bytes: new data size in bytes
82 * 82 *
83 * This function clears the update marker for volume @vol_id, sets new volume 83 * This function clears the update marker for volume @vol, sets new volume
84 * data size and clears the "corrupted" flag (static volumes only). Returns 84 * data size and clears the "corrupted" flag (static volumes only). Returns
85 * zero in case of success and a negative error code in case of failure. 85 * zero in case of success and a negative error code in case of failure.
86 */ 86 */
87static int clear_update_marker(struct ubi_device *ubi, int vol_id, long long bytes) 87static int clear_update_marker(struct ubi_device *ubi, struct ubi_volume *vol,
88 long long bytes)
88{ 89{
89 int err; 90 int err;
90 uint64_t tmp; 91 uint64_t tmp;
91 struct ubi_vtbl_record vtbl_rec; 92 struct ubi_vtbl_record vtbl_rec;
92 struct ubi_volume *vol = ubi->volumes[vol_id];
93 93
94 dbg_msg("clear update marker for volume %d", vol_id); 94 dbg_msg("clear update marker for volume %d", vol->vol_id);
95 95
96 memcpy(&vtbl_rec, &ubi->vtbl[vol_id], sizeof(struct ubi_vtbl_record)); 96 memcpy(&vtbl_rec, &ubi->vtbl[vol->vol_id],
97 sizeof(struct ubi_vtbl_record));
97 ubi_assert(vol->upd_marker && vtbl_rec.upd_marker); 98 ubi_assert(vol->upd_marker && vtbl_rec.upd_marker);
98 vtbl_rec.upd_marker = 0; 99 vtbl_rec.upd_marker = 0;
99 100
@@ -109,7 +110,7 @@ static int clear_update_marker(struct ubi_device *ubi, int vol_id, long long byt
109 } 110 }
110 111
111 mutex_lock(&ubi->volumes_mutex); 112 mutex_lock(&ubi->volumes_mutex);
112 err = ubi_change_vtbl_record(ubi, vol_id, &vtbl_rec); 113 err = ubi_change_vtbl_record(ubi, vol->vol_id, &vtbl_rec);
113 mutex_unlock(&ubi->volumes_mutex); 114 mutex_unlock(&ubi->volumes_mutex);
114 vol->upd_marker = 0; 115 vol->upd_marker = 0;
115 return err; 116 return err;
@@ -118,23 +119,23 @@ static int clear_update_marker(struct ubi_device *ubi, int vol_id, long long byt
118/** 119/**
119 * ubi_start_update - start volume update. 120 * ubi_start_update - start volume update.
120 * @ubi: UBI device description object 121 * @ubi: UBI device description object
121 * @vol_id: volume ID 122 * @vol: volume description object
122 * @bytes: update bytes 123 * @bytes: update bytes
123 * 124 *
124 * This function starts volume update operation. If @bytes is zero, the volume 125 * This function starts volume update operation. If @bytes is zero, the volume
125 * is just wiped out. Returns zero in case of success and a negative error code 126 * is just wiped out. Returns zero in case of success and a negative error code
126 * in case of failure. 127 * in case of failure.
127 */ 128 */
128int ubi_start_update(struct ubi_device *ubi, int vol_id, long long bytes) 129int ubi_start_update(struct ubi_device *ubi, struct ubi_volume *vol,
130 long long bytes)
129{ 131{
130 int i, err; 132 int i, err;
131 uint64_t tmp; 133 uint64_t tmp;
132 struct ubi_volume *vol = ubi->volumes[vol_id];
133 134
134 dbg_msg("start update of volume %d, %llu bytes", vol_id, bytes); 135 dbg_msg("start update of volume %d, %llu bytes", vol->vol_id, bytes);
135 vol->updating = 1; 136 vol->updating = 1;
136 137
137 err = set_update_marker(ubi, vol_id); 138 err = set_update_marker(ubi, vol);
138 if (err) 139 if (err)
139 return err; 140 return err;
140 141
@@ -146,7 +147,7 @@ int ubi_start_update(struct ubi_device *ubi, int vol_id, long long bytes)
146 } 147 }
147 148
148 if (bytes == 0) { 149 if (bytes == 0) {
149 err = clear_update_marker(ubi, vol_id, 0); 150 err = clear_update_marker(ubi, vol, 0);
150 if (err) 151 if (err)
151 return err; 152 return err;
152 err = ubi_wl_flush(ubi); 153 err = ubi_wl_flush(ubi);
@@ -169,7 +170,7 @@ int ubi_start_update(struct ubi_device *ubi, int vol_id, long long bytes)
169/** 170/**
170 * write_leb - write update data. 171 * write_leb - write update data.
171 * @ubi: UBI device description object 172 * @ubi: UBI device description object
172 * @vol_id: volume ID 173 * @vol: volume description object
173 * @lnum: logical eraseblock number 174 * @lnum: logical eraseblock number
174 * @buf: data to write 175 * @buf: data to write
175 * @len: data size 176 * @len: data size
@@ -195,11 +196,10 @@ int ubi_start_update(struct ubi_device *ubi, int vol_id, long long bytes)
195 * This function returns zero in case of success and a negative error code in 196 * This function returns zero in case of success and a negative error code in
196 * case of failure. 197 * case of failure.
197 */ 198 */
198static int write_leb(struct ubi_device *ubi, int vol_id, int lnum, void *buf, 199static int write_leb(struct ubi_device *ubi, struct ubi_volume *vol, int lnum,
199 int len, int used_ebs) 200 void *buf, int len, int used_ebs)
200{ 201{
201 int err, l; 202 int err, l;
202 struct ubi_volume *vol = ubi->volumes[vol_id];
203 203
204 if (vol->vol_type == UBI_DYNAMIC_VOLUME) { 204 if (vol->vol_type == UBI_DYNAMIC_VOLUME) {
205 l = ALIGN(len, ubi->min_io_size); 205 l = ALIGN(len, ubi->min_io_size);
@@ -244,11 +244,10 @@ static int write_leb(struct ubi_device *ubi, int vol_id, int lnum, void *buf,
244 * the last call if the whole volume update was successfully finished, and a 244 * the last call if the whole volume update was successfully finished, and a
245 * negative error code in case of failure. 245 * negative error code in case of failure.
246 */ 246 */
247int ubi_more_update_data(struct ubi_device *ubi, int vol_id, 247int ubi_more_update_data(struct ubi_device *ubi, struct ubi_volume *vol,
248 const void __user *buf, int count) 248 const void __user *buf, int count)
249{ 249{
250 uint64_t tmp; 250 uint64_t tmp;
251 struct ubi_volume *vol = ubi->volumes[vol_id];
252 int lnum, offs, err = 0, len, to_write = count; 251 int lnum, offs, err = 0, len, to_write = count;
253 252
254 dbg_msg("write %d of %lld bytes, %lld already passed", 253 dbg_msg("write %d of %lld bytes, %lld already passed",
@@ -293,8 +292,8 @@ int ubi_more_update_data(struct ubi_device *ubi, int vol_id,
293 * is the last chunk, it's time to flush the buffer. 292 * is the last chunk, it's time to flush the buffer.
294 */ 293 */
295 ubi_assert(flush_len <= vol->usable_leb_size); 294 ubi_assert(flush_len <= vol->usable_leb_size);
296 err = write_leb(ubi, vol_id, lnum, vol->upd_buf, 295 err = write_leb(ubi, vol, lnum, vol->upd_buf, flush_len,
297 flush_len, vol->upd_ebs); 296 vol->upd_ebs);
298 if (err) 297 if (err)
299 return err; 298 return err;
300 } 299 }
@@ -321,8 +320,8 @@ int ubi_more_update_data(struct ubi_device *ubi, int vol_id,
321 320
322 if (len == vol->usable_leb_size || 321 if (len == vol->usable_leb_size ||
323 vol->upd_received + len == vol->upd_bytes) { 322 vol->upd_received + len == vol->upd_bytes) {
324 err = write_leb(ubi, vol_id, lnum, vol->upd_buf, len, 323 err = write_leb(ubi, vol, lnum, vol->upd_buf,
325 vol->upd_ebs); 324 len, vol->upd_ebs);
326 if (err) 325 if (err)
327 break; 326 break;
328 } 327 }
@@ -336,7 +335,7 @@ int ubi_more_update_data(struct ubi_device *ubi, int vol_id,
336 ubi_assert(vol->upd_received <= vol->upd_bytes); 335 ubi_assert(vol->upd_received <= vol->upd_bytes);
337 if (vol->upd_received == vol->upd_bytes) { 336 if (vol->upd_received == vol->upd_bytes) {
338 /* The update is finished, clear the update marker */ 337 /* The update is finished, clear the update marker */
339 err = clear_update_marker(ubi, vol_id, vol->upd_bytes); 338 err = clear_update_marker(ubi, vol, vol->upd_bytes);
340 if (err) 339 if (err)
341 return err; 340 return err;
342 err = ubi_wl_flush(ubi); 341 err = ubi_wl_flush(ubi);