]> Pileus Git - ~andy/linux/blob - drivers/mtd/ubi/cdev.c
UBI: remove unnecessry header inclusion
[~andy/linux] / drivers / mtd / ubi / cdev.c
1 /*
2  * Copyright (c) International Business Machines Corp., 2006
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
12  * the GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Artem Bityutskiy (Битюцкий Артём)
19  */
20
21 /*
22  * This file includes implementation of UBI character device operations.
23  *
24  * There are two kinds of character devices in UBI: UBI character devices and
25  * UBI volume character devices. UBI character devices allow users to
26  * manipulate whole volumes: create, remove, and re-size them. Volume character
27  * devices provide volume I/O capabilities.
28  *
29  * Major and minor numbers are assigned dynamically to both UBI and volume
30  * character devices.
31  *
32  * Well, there is the third kind of character devices - the UBI control
33  * character device, which allows to manipulate by UBI devices - create and
34  * delete them. In other words, it is used for attaching and detaching MTD
35  * devices.
36  */
37
38 #include <linux/module.h>
39 #include <linux/stat.h>
40 #include <linux/ioctl.h>
41 #include <linux/capability.h>
42 #include <linux/uaccess.h>
43 #include <mtd/ubi-user.h>
44 #include <asm/div64.h>
45 #include "ubi.h"
46
47 /**
48  * get_exclusive - get exclusive access to an UBI volume.
49  * @desc: volume descriptor
50  *
51  * This function changes UBI volume open mode to "exclusive". Returns previous
52  * mode value (positive integer) in case of success and a negative error code
53  * in case of failure.
54  */
55 static int get_exclusive(struct ubi_volume_desc *desc)
56 {
57         int users, err;
58         struct ubi_volume *vol = desc->vol;
59
60         spin_lock(&vol->ubi->volumes_lock);
61         users = vol->readers + vol->writers + vol->exclusive;
62         ubi_assert(users > 0);
63         if (users > 1) {
64                 dbg_err("%d users for volume %d", users, vol->vol_id);
65                 err = -EBUSY;
66         } else {
67                 vol->readers = vol->writers = 0;
68                 vol->exclusive = 1;
69                 err = desc->mode;
70                 desc->mode = UBI_EXCLUSIVE;
71         }
72         spin_unlock(&vol->ubi->volumes_lock);
73
74         return err;
75 }
76
77 /**
78  * revoke_exclusive - revoke exclusive mode.
79  * @desc: volume descriptor
80  * @mode: new mode to switch to
81  */
82 static void revoke_exclusive(struct ubi_volume_desc *desc, int mode)
83 {
84         struct ubi_volume *vol = desc->vol;
85
86         spin_lock(&vol->ubi->volumes_lock);
87         ubi_assert(vol->readers == 0 && vol->writers == 0);
88         ubi_assert(vol->exclusive == 1 && desc->mode == UBI_EXCLUSIVE);
89         vol->exclusive = 0;
90         if (mode == UBI_READONLY)
91                 vol->readers = 1;
92         else if (mode == UBI_READWRITE)
93                 vol->writers = 1;
94         else
95                 vol->exclusive = 1;
96         spin_unlock(&vol->ubi->volumes_lock);
97
98         desc->mode = mode;
99 }
100
101 static int vol_cdev_open(struct inode *inode, struct file *file)
102 {
103         struct ubi_volume_desc *desc;
104         int vol_id = iminor(inode) - 1, mode, ubi_num;
105
106         ubi_num = ubi_major2num(imajor(inode));
107         if (ubi_num < 0)
108                 return ubi_num;
109
110         if (file->f_mode & FMODE_WRITE)
111                 mode = UBI_READWRITE;
112         else
113                 mode = UBI_READONLY;
114
115         dbg_gen("open volume %d, mode %d", vol_id, mode);
116
117         desc = ubi_open_volume(ubi_num, vol_id, mode);
118         if (IS_ERR(desc))
119                 return PTR_ERR(desc);
120
121         file->private_data = desc;
122         return 0;
123 }
124
125 static int vol_cdev_release(struct inode *inode, struct file *file)
126 {
127         struct ubi_volume_desc *desc = file->private_data;
128         struct ubi_volume *vol = desc->vol;
129
130         dbg_gen("release volume %d, mode %d", vol->vol_id, desc->mode);
131
132         if (vol->updating) {
133                 ubi_warn("update of volume %d not finished, volume is damaged",
134                          vol->vol_id);
135                 ubi_assert(!vol->changing_leb);
136                 vol->updating = 0;
137                 vfree(vol->upd_buf);
138         } else if (vol->changing_leb) {
139                 dbg_gen("only %lld of %lld bytes received for atomic LEB change"
140                         " for volume %d:%d, cancel", vol->upd_received,
141                         vol->upd_bytes, vol->ubi->ubi_num, vol->vol_id);
142                 vol->changing_leb = 0;
143                 vfree(vol->upd_buf);
144         }
145
146         ubi_close_volume(desc);
147         return 0;
148 }
149
150 static loff_t vol_cdev_llseek(struct file *file, loff_t offset, int origin)
151 {
152         struct ubi_volume_desc *desc = file->private_data;
153         struct ubi_volume *vol = desc->vol;
154         loff_t new_offset;
155
156         if (vol->updating) {
157                  /* Update is in progress, seeking is prohibited */
158                 dbg_err("updating");
159                 return -EBUSY;
160         }
161
162         switch (origin) {
163         case 0: /* SEEK_SET */
164                 new_offset = offset;
165                 break;
166         case 1: /* SEEK_CUR */
167                 new_offset = file->f_pos + offset;
168                 break;
169         case 2: /* SEEK_END */
170                 new_offset = vol->used_bytes + offset;
171                 break;
172         default:
173                 return -EINVAL;
174         }
175
176         if (new_offset < 0 || new_offset > vol->used_bytes) {
177                 dbg_err("bad seek %lld", new_offset);
178                 return -EINVAL;
179         }
180
181         dbg_gen("seek volume %d, offset %lld, origin %d, new offset %lld",
182                 vol->vol_id, offset, origin, new_offset);
183
184         file->f_pos = new_offset;
185         return new_offset;
186 }
187
188 static ssize_t vol_cdev_read(struct file *file, __user char *buf, size_t count,
189                              loff_t *offp)
190 {
191         struct ubi_volume_desc *desc = file->private_data;
192         struct ubi_volume *vol = desc->vol;
193         struct ubi_device *ubi = vol->ubi;
194         int err, lnum, off, len,  tbuf_size;
195         size_t count_save = count;
196         void *tbuf;
197         uint64_t tmp;
198
199         dbg_gen("read %zd bytes from offset %lld of volume %d",
200                 count, *offp, vol->vol_id);
201
202         if (vol->updating) {
203                 dbg_err("updating");
204                 return -EBUSY;
205         }
206         if (vol->upd_marker) {
207                 dbg_err("damaged volume, update marker is set");
208                 return -EBADF;
209         }
210         if (*offp == vol->used_bytes || count == 0)
211                 return 0;
212
213         if (vol->corrupted)
214                 dbg_gen("read from corrupted volume %d", vol->vol_id);
215
216         if (*offp + count > vol->used_bytes)
217                 count_save = count = vol->used_bytes - *offp;
218
219         tbuf_size = vol->usable_leb_size;
220         if (count < tbuf_size)
221                 tbuf_size = ALIGN(count, ubi->min_io_size);
222         tbuf = vmalloc(tbuf_size);
223         if (!tbuf)
224                 return -ENOMEM;
225
226         len = count > tbuf_size ? tbuf_size : count;
227
228         tmp = *offp;
229         off = do_div(tmp, vol->usable_leb_size);
230         lnum = tmp;
231
232         do {
233                 cond_resched();
234
235                 if (off + len >= vol->usable_leb_size)
236                         len = vol->usable_leb_size - off;
237
238                 err = ubi_eba_read_leb(ubi, vol, lnum, tbuf, off, len, 0);
239                 if (err)
240                         break;
241
242                 off += len;
243                 if (off == vol->usable_leb_size) {
244                         lnum += 1;
245                         off -= vol->usable_leb_size;
246                 }
247
248                 count -= len;
249                 *offp += len;
250
251                 err = copy_to_user(buf, tbuf, len);
252                 if (err) {
253                         err = -EFAULT;
254                         break;
255                 }
256
257                 buf += len;
258                 len = count > tbuf_size ? tbuf_size : count;
259         } while (count);
260
261         vfree(tbuf);
262         return err ? err : count_save - count;
263 }
264
265 #ifdef CONFIG_MTD_UBI_DEBUG_USERSPACE_IO
266
267 /*
268  * This function allows to directly write to dynamic UBI volumes, without
269  * issuing the volume update operation. Available only as a debugging feature.
270  * Very useful for testing UBI.
271  */
272 static ssize_t vol_cdev_direct_write(struct file *file, const char __user *buf,
273                                      size_t count, loff_t *offp)
274 {
275         struct ubi_volume_desc *desc = file->private_data;
276         struct ubi_volume *vol = desc->vol;
277         struct ubi_device *ubi = vol->ubi;
278         int lnum, off, len, tbuf_size, err = 0;
279         size_t count_save = count;
280         char *tbuf;
281         uint64_t tmp;
282
283         dbg_gen("requested: write %zd bytes to offset %lld of volume %u",
284                 count, *offp, vol->vol_id);
285
286         if (vol->vol_type == UBI_STATIC_VOLUME)
287                 return -EROFS;
288
289         tmp = *offp;
290         off = do_div(tmp, vol->usable_leb_size);
291         lnum = tmp;
292
293         if (off & (ubi->min_io_size - 1)) {
294                 dbg_err("unaligned position");
295                 return -EINVAL;
296         }
297
298         if (*offp + count > vol->used_bytes)
299                 count_save = count = vol->used_bytes - *offp;
300
301         /* We can write only in fractions of the minimum I/O unit */
302         if (count & (ubi->min_io_size - 1)) {
303                 dbg_err("unaligned write length");
304                 return -EINVAL;
305         }
306
307         tbuf_size = vol->usable_leb_size;
308         if (count < tbuf_size)
309                 tbuf_size = ALIGN(count, ubi->min_io_size);
310         tbuf = vmalloc(tbuf_size);
311         if (!tbuf)
312                 return -ENOMEM;
313
314         len = count > tbuf_size ? tbuf_size : count;
315
316         while (count) {
317                 cond_resched();
318
319                 if (off + len >= vol->usable_leb_size)
320                         len = vol->usable_leb_size - off;
321
322                 err = copy_from_user(tbuf, buf, len);
323                 if (err) {
324                         err = -EFAULT;
325                         break;
326                 }
327
328                 err = ubi_eba_write_leb(ubi, vol, lnum, tbuf, off, len,
329                                         UBI_UNKNOWN);
330                 if (err)
331                         break;
332
333                 off += len;
334                 if (off == vol->usable_leb_size) {
335                         lnum += 1;
336                         off -= vol->usable_leb_size;
337                 }
338
339                 count -= len;
340                 *offp += len;
341                 buf += len;
342                 len = count > tbuf_size ? tbuf_size : count;
343         }
344
345         vfree(tbuf);
346         return err ? err : count_save - count;
347 }
348
349 #else
350 #define vol_cdev_direct_write(file, buf, count, offp) (-EPERM)
351 #endif /* CONFIG_MTD_UBI_DEBUG_USERSPACE_IO */
352
353 static ssize_t vol_cdev_write(struct file *file, const char __user *buf,
354                               size_t count, loff_t *offp)
355 {
356         int err = 0;
357         struct ubi_volume_desc *desc = file->private_data;
358         struct ubi_volume *vol = desc->vol;
359         struct ubi_device *ubi = vol->ubi;
360
361         if (!vol->updating && !vol->changing_leb)
362                 return vol_cdev_direct_write(file, buf, count, offp);
363
364         if (vol->updating)
365                 err = ubi_more_update_data(ubi, vol, buf, count);
366         else
367                 err = ubi_more_leb_change_data(ubi, vol, buf, count);
368
369         if (err < 0) {
370                 ubi_err("cannot accept more %zd bytes of data, error %d",
371                         count, err);
372                 return err;
373         }
374
375         if (err) {
376                 /*
377                  * The operation is finished, @err contains number of actually
378                  * written bytes.
379                  */
380                 count = err;
381
382                 if (vol->changing_leb) {
383                         revoke_exclusive(desc, UBI_READWRITE);
384                         return count;
385                 }
386
387                 err = ubi_check_volume(ubi, vol->vol_id);
388                 if (err < 0)
389                         return err;
390
391                 if (err) {
392                         ubi_warn("volume %d on UBI device %d is corrupted",
393                                  vol->vol_id, ubi->ubi_num);
394                         vol->corrupted = 1;
395                 }
396                 vol->checked = 1;
397                 ubi_gluebi_updated(vol);
398                 revoke_exclusive(desc, UBI_READWRITE);
399         }
400
401         return count;
402 }
403
404 static int vol_cdev_ioctl(struct inode *inode, struct file *file,
405                           unsigned int cmd, unsigned long arg)
406 {
407         int err = 0;
408         struct ubi_volume_desc *desc = file->private_data;
409         struct ubi_volume *vol = desc->vol;
410         struct ubi_device *ubi = vol->ubi;
411         void __user *argp = (void __user *)arg;
412
413         switch (cmd) {
414         /* Volume update command */
415         case UBI_IOCVOLUP:
416         {
417                 int64_t bytes, rsvd_bytes;
418
419                 if (!capable(CAP_SYS_RESOURCE)) {
420                         err = -EPERM;
421                         break;
422                 }
423
424                 err = copy_from_user(&bytes, argp, sizeof(int64_t));
425                 if (err) {
426                         err = -EFAULT;
427                         break;
428                 }
429
430                 if (desc->mode == UBI_READONLY) {
431                         err = -EROFS;
432                         break;
433                 }
434
435                 rsvd_bytes = (long long)vol->reserved_pebs *
436                                         ubi->leb_size-vol->data_pad;
437                 if (bytes < 0 || bytes > rsvd_bytes) {
438                         err = -EINVAL;
439                         break;
440                 }
441
442                 err = get_exclusive(desc);
443                 if (err < 0)
444                         break;
445
446                 err = ubi_start_update(ubi, vol, bytes);
447                 if (bytes == 0)
448                         revoke_exclusive(desc, UBI_READWRITE);
449                 break;
450         }
451
452         /* Atomic logical eraseblock change command */
453         case UBI_IOCEBCH:
454         {
455                 struct ubi_leb_change_req req;
456
457                 err = copy_from_user(&req, argp,
458                                      sizeof(struct ubi_leb_change_req));
459                 if (err) {
460                         err = -EFAULT;
461                         break;
462                 }
463
464                 if (desc->mode == UBI_READONLY ||
465                     vol->vol_type == UBI_STATIC_VOLUME) {
466                         err = -EROFS;
467                         break;
468                 }
469
470                 /* Validate the request */
471                 err = -EINVAL;
472                 if (req.lnum < 0 || req.lnum >= vol->reserved_pebs ||
473                     req.bytes < 0 || req.lnum >= vol->usable_leb_size)
474                         break;
475                 if (req.dtype != UBI_LONGTERM && req.dtype != UBI_SHORTTERM &&
476                     req.dtype != UBI_UNKNOWN)
477                         break;
478
479                 err = get_exclusive(desc);
480                 if (err < 0)
481                         break;
482
483                 err = ubi_start_leb_change(ubi, vol, &req);
484                 if (req.bytes == 0)
485                         revoke_exclusive(desc, UBI_READWRITE);
486                 break;
487         }
488
489 #ifdef CONFIG_MTD_UBI_DEBUG_USERSPACE_IO
490         /* Logical eraseblock erasure command */
491         case UBI_IOCEBER:
492         {
493                 int32_t lnum;
494
495                 err = get_user(lnum, (__user int32_t *)argp);
496                 if (err) {
497                         err = -EFAULT;
498                         break;
499                 }
500
501                 if (desc->mode == UBI_READONLY ||
502                     vol->vol_type == UBI_STATIC_VOLUME) {
503                         err = -EROFS;
504                         break;
505                 }
506
507                 if (lnum < 0 || lnum >= vol->reserved_pebs) {
508                         err = -EINVAL;
509                         break;
510                 }
511
512                 dbg_gen("erase LEB %d:%d", vol->vol_id, lnum);
513                 err = ubi_eba_unmap_leb(ubi, vol, lnum);
514                 if (err)
515                         break;
516
517                 err = ubi_wl_flush(ubi);
518                 break;
519         }
520
521         /* Logical eraseblock map command */
522         case UBI_IOCEBMAP:
523         {
524                 struct ubi_map_req req;
525
526                 err = copy_from_user(&req, argp, sizeof(struct ubi_map_req));
527                 if (err) {
528                         err = -EFAULT;
529                         break;
530                 }
531                 err = ubi_leb_map(desc, req.lnum, req.dtype);
532                 break;
533         }
534
535         /* Logical eraseblock un-map command */
536         case UBI_IOCEBUNMAP:
537         {
538                 int32_t lnum;
539
540                 err = get_user(lnum, (__user int32_t *)argp);
541                 if (err) {
542                         err = -EFAULT;
543                         break;
544                 }
545                 err = ubi_leb_unmap(desc, lnum);
546                 break;
547         }
548
549         /* Check if logical eraseblock is mapped command */
550         case UBI_IOCEBISMAP:
551         {
552                 int32_t lnum;
553
554                 err = get_user(lnum, (__user int32_t *)argp);
555                 if (err) {
556                         err = -EFAULT;
557                         break;
558                 }
559                 err = ubi_is_mapped(desc, lnum);
560                 break;
561         }
562 #endif
563
564         default:
565                 err = -ENOTTY;
566                 break;
567         }
568         return err;
569 }
570
571 /**
572  * verify_mkvol_req - verify volume creation request.
573  * @ubi: UBI device description object
574  * @req: the request to check
575  *
576  * This function zero if the request is correct, and %-EINVAL if not.
577  */
578 static int verify_mkvol_req(const struct ubi_device *ubi,
579                             const struct ubi_mkvol_req *req)
580 {
581         int n, err = -EINVAL;
582
583         if (req->bytes < 0 || req->alignment < 0 || req->vol_type < 0 ||
584             req->name_len < 0)
585                 goto bad;
586
587         if ((req->vol_id < 0 || req->vol_id >= ubi->vtbl_slots) &&
588             req->vol_id != UBI_VOL_NUM_AUTO)
589                 goto bad;
590
591         if (req->alignment == 0)
592                 goto bad;
593
594         if (req->bytes == 0)
595                 goto bad;
596
597         if (req->vol_type != UBI_DYNAMIC_VOLUME &&
598             req->vol_type != UBI_STATIC_VOLUME)
599                 goto bad;
600
601         if (req->alignment > ubi->leb_size)
602                 goto bad;
603
604         n = req->alignment & (ubi->min_io_size - 1);
605         if (req->alignment != 1 && n)
606                 goto bad;
607
608         if (req->name_len > UBI_VOL_NAME_MAX) {
609                 err = -ENAMETOOLONG;
610                 goto bad;
611         }
612
613         n = strnlen(req->name, req->name_len + 1);
614         if (n != req->name_len)
615                 goto bad;
616
617         return 0;
618
619 bad:
620         dbg_err("bad volume creation request");
621         ubi_dbg_dump_mkvol_req(req);
622         return err;
623 }
624
625 /**
626  * verify_rsvol_req - verify volume re-size request.
627  * @ubi: UBI device description object
628  * @req: the request to check
629  *
630  * This function returns zero if the request is correct, and %-EINVAL if not.
631  */
632 static int verify_rsvol_req(const struct ubi_device *ubi,
633                             const struct ubi_rsvol_req *req)
634 {
635         if (req->bytes <= 0)
636                 return -EINVAL;
637
638         if (req->vol_id < 0 || req->vol_id >= ubi->vtbl_slots)
639                 return -EINVAL;
640
641         return 0;
642 }
643
644 /**
645  * rename_volumes - rename UBI volumes.
646  * @ubi: UBI device description object
647  * @req: volumes re-name request
648  *
649  * This is a helper function for the volume re-name IOCTL which validates the
650  * the request, opens the volume and calls corresponding volumes management
651  * function. Returns zero in case of success and a negative error code in case
652  * of failure.
653  */
654 static int rename_volumes(struct ubi_device *ubi,
655                           struct ubi_rnvol_req *req)
656 {
657         int i, n, err;
658         struct list_head rename_list;
659         struct ubi_rename_entry *re, *re1;
660
661         if (req->count < 0 || req->count > UBI_MAX_RNVOL)
662                 return -EINVAL;
663
664         if (req->count == 0)
665                 return 0;
666
667         /* Validate volume IDs and names in the request */
668         for (i = 0; i < req->count; i++) {
669                 if (req->ents[i].vol_id < 0 ||
670                     req->ents[i].vol_id >= ubi->vtbl_slots)
671                         return -EINVAL;
672                 if (req->ents[i].name_len < 0)
673                         return -EINVAL;
674                 if (req->ents[i].name_len > UBI_VOL_NAME_MAX)
675                         return -ENAMETOOLONG;
676                 req->ents[i].name[req->ents[i].name_len] = '\0';
677                 n = strlen(req->ents[i].name);
678                 if (n != req->ents[i].name_len)
679                         err = -EINVAL;
680         }
681
682         /* Make sure volume IDs and names are unique */
683         for (i = 0; i < req->count - 1; i++) {
684                 for (n = i + 1; n < req->count; n++) {
685                         if (req->ents[i].vol_id == req->ents[n].vol_id) {
686                                 dbg_err("duplicated volume id %d",
687                                         req->ents[i].vol_id);
688                                 return -EINVAL;
689                         }
690                         if (!strcmp(req->ents[i].name, req->ents[n].name)) {
691                                 dbg_err("duplicated volume name \"%s\"",
692                                         req->ents[i].name);
693                                 return -EINVAL;
694                         }
695                 }
696         }
697
698         /* Create the re-name list */
699         INIT_LIST_HEAD(&rename_list);
700         for (i = 0; i < req->count; i++) {
701                 int vol_id = req->ents[i].vol_id;
702                 int name_len = req->ents[i].name_len;
703                 const char *name = req->ents[i].name;
704
705                 re = kzalloc(sizeof(struct ubi_rename_entry), GFP_KERNEL);
706                 if (!re) {
707                         err = -ENOMEM;
708                         goto out_free;
709                 }
710
711                 re->desc = ubi_open_volume(ubi->ubi_num, vol_id, UBI_EXCLUSIVE);
712                 if (IS_ERR(re->desc)) {
713                         err = PTR_ERR(re->desc);
714                         dbg_err("cannot open volume %d, error %d", vol_id, err);
715                         kfree(re);
716                         goto out_free;
717                 }
718
719                 /* Skip this re-naming if the name does not really change */
720                 if (re->desc->vol->name_len == name_len &&
721                     !memcmp(re->desc->vol->name, name, name_len)) {
722                         ubi_close_volume(re->desc);
723                         kfree(re);
724                         continue;
725                 }
726
727                 re->new_name_len = name_len;
728                 memcpy(re->new_name, name, name_len);
729                 list_add_tail(&re->list, &rename_list);
730                 dbg_msg("will rename volume %d from \"%s\" to \"%s\"",
731                         vol_id, re->desc->vol->name, name);
732         }
733
734         if (list_empty(&rename_list))
735                 return 0;
736
737         /* Find out the volumes which have to be removed */
738         list_for_each_entry(re, &rename_list, list) {
739                 struct ubi_volume_desc *desc;
740                 int no_remove_needed = 0;
741
742                 /*
743                  * Volume @re->vol_id is going to be re-named to
744                  * @re->new_name, while its current name is @name. If a volume
745                  * with name @re->new_name currently exists, it has to be
746                  * removed, unless it is also re-named in the request (@req).
747                  */
748                 list_for_each_entry(re1, &rename_list, list) {
749                         if (re->new_name_len == re1->desc->vol->name_len &&
750                             !memcmp(re->new_name, re1->desc->vol->name,
751                                     re1->desc->vol->name_len)) {
752                                 no_remove_needed = 1;
753                                 break;
754                         }
755                 }
756
757                 if (no_remove_needed)
758                         continue;
759
760                 /*
761                  * It seems we need to remove volume with name @re->new_name,
762                  * if it exists.
763                  */
764                 desc = ubi_open_volume_nm(ubi->ubi_num, re->new_name,
765                                           UBI_EXCLUSIVE);
766                 if (IS_ERR(desc)) {
767                         err = PTR_ERR(desc);
768                         if (err == -ENODEV)
769                                 /* Re-naming into a non-existing volume name */
770                                 continue;
771
772                         /* The volume exists but busy, or an error occurred */
773                         dbg_err("cannot open volume \"%s\", error %d",
774                                 re->new_name, err);
775                         goto out_free;
776                 }
777
778                 re = kzalloc(sizeof(struct ubi_rename_entry), GFP_KERNEL);
779                 if (!re) {
780                         err = -ENOMEM;
781                         ubi_close_volume(desc);
782                         goto out_free;
783                 }
784
785                 re->remove = 1;
786                 re->desc = desc;
787                 list_add(&re->list, &rename_list);
788                 dbg_msg("will remove volume %d, name \"%s\"",
789                         re->desc->vol->vol_id, re->desc->vol->name);
790         }
791
792         mutex_lock(&ubi->volumes_mutex);
793         err = ubi_rename_volumes(ubi, &rename_list);
794         mutex_unlock(&ubi->volumes_mutex);
795
796 out_free:
797         list_for_each_entry_safe(re, re1, &rename_list, list) {
798                 ubi_close_volume(re->desc);
799                 list_del(&re->list);
800                 kfree(re);
801         }
802         return err;
803 }
804
805 static int ubi_cdev_ioctl(struct inode *inode, struct file *file,
806                           unsigned int cmd, unsigned long arg)
807 {
808         int err = 0;
809         struct ubi_device *ubi;
810         struct ubi_volume_desc *desc;
811         void __user *argp = (void __user *)arg;
812
813         if (!capable(CAP_SYS_RESOURCE))
814                 return -EPERM;
815
816         ubi = ubi_get_by_major(imajor(inode));
817         if (!ubi)
818                 return -ENODEV;
819
820         switch (cmd) {
821         /* Create volume command */
822         case UBI_IOCMKVOL:
823         {
824                 struct ubi_mkvol_req req;
825
826                 dbg_gen("create volume");
827                 err = copy_from_user(&req, argp, sizeof(struct ubi_mkvol_req));
828                 if (err) {
829                         err = -EFAULT;
830                         break;
831                 }
832
833                 req.name[req.name_len] = '\0';
834                 err = verify_mkvol_req(ubi, &req);
835                 if (err)
836                         break;
837
838                 mutex_lock(&ubi->volumes_mutex);
839                 err = ubi_create_volume(ubi, &req);
840                 mutex_unlock(&ubi->volumes_mutex);
841                 if (err)
842                         break;
843
844                 err = put_user(req.vol_id, (__user int32_t *)argp);
845                 if (err)
846                         err = -EFAULT;
847
848                 break;
849         }
850
851         /* Remove volume command */
852         case UBI_IOCRMVOL:
853         {
854                 int vol_id;
855
856                 dbg_gen("remove volume");
857                 err = get_user(vol_id, (__user int32_t *)argp);
858                 if (err) {
859                         err = -EFAULT;
860                         break;
861                 }
862
863                 desc = ubi_open_volume(ubi->ubi_num, vol_id, UBI_EXCLUSIVE);
864                 if (IS_ERR(desc)) {
865                         err = PTR_ERR(desc);
866                         break;
867                 }
868
869                 mutex_lock(&ubi->volumes_mutex);
870                 err = ubi_remove_volume(desc, 0);
871                 mutex_unlock(&ubi->volumes_mutex);
872
873                 /*
874                  * The volume is deleted (unless an error occurred), and the
875                  * 'struct ubi_volume' object will be freed when
876                  * 'ubi_close_volume()' will call 'put_device()'.
877                  */
878                 ubi_close_volume(desc);
879                 break;
880         }
881
882         /* Re-size volume command */
883         case UBI_IOCRSVOL:
884         {
885                 int pebs;
886                 uint64_t tmp;
887                 struct ubi_rsvol_req req;
888
889                 dbg_gen("re-size volume");
890                 err = copy_from_user(&req, argp, sizeof(struct ubi_rsvol_req));
891                 if (err) {
892                         err = -EFAULT;
893                         break;
894                 }
895
896                 err = verify_rsvol_req(ubi, &req);
897                 if (err)
898                         break;
899
900                 desc = ubi_open_volume(ubi->ubi_num, req.vol_id, UBI_EXCLUSIVE);
901                 if (IS_ERR(desc)) {
902                         err = PTR_ERR(desc);
903                         break;
904                 }
905
906                 tmp = req.bytes;
907                 pebs = !!do_div(tmp, desc->vol->usable_leb_size);
908                 pebs += tmp;
909
910                 mutex_lock(&ubi->volumes_mutex);
911                 err = ubi_resize_volume(desc, pebs);
912                 mutex_unlock(&ubi->volumes_mutex);
913                 ubi_close_volume(desc);
914                 break;
915         }
916
917         /* Re-name volumes command */
918         case UBI_IOCRNVOL:
919         {
920                 struct ubi_rnvol_req *req;
921
922                 dbg_msg("re-name volumes");
923                 req = kmalloc(sizeof(struct ubi_rnvol_req), GFP_KERNEL);
924                 if (!req) {
925                         err = -ENOMEM;
926                         break;
927                 };
928
929                 err = copy_from_user(req, argp, sizeof(struct ubi_rnvol_req));
930                 if (err) {
931                         err = -EFAULT;
932                         kfree(req);
933                         break;
934                 }
935
936                 mutex_lock(&ubi->mult_mutex);
937                 err = rename_volumes(ubi, req);
938                 mutex_unlock(&ubi->mult_mutex);
939                 kfree(req);
940                 break;
941         }
942
943         default:
944                 err = -ENOTTY;
945                 break;
946         }
947
948         ubi_put_device(ubi);
949         return err;
950 }
951
952 static int ctrl_cdev_ioctl(struct inode *inode, struct file *file,
953                            unsigned int cmd, unsigned long arg)
954 {
955         int err = 0;
956         void __user *argp = (void __user *)arg;
957
958         if (!capable(CAP_SYS_RESOURCE))
959                 return -EPERM;
960
961         switch (cmd) {
962         /* Attach an MTD device command */
963         case UBI_IOCATT:
964         {
965                 struct ubi_attach_req req;
966                 struct mtd_info *mtd;
967
968                 dbg_gen("attach MTD device");
969                 err = copy_from_user(&req, argp, sizeof(struct ubi_attach_req));
970                 if (err) {
971                         err = -EFAULT;
972                         break;
973                 }
974
975                 if (req.mtd_num < 0 ||
976                     (req.ubi_num < 0 && req.ubi_num != UBI_DEV_NUM_AUTO)) {
977                         err = -EINVAL;
978                         break;
979                 }
980
981                 mtd = get_mtd_device(NULL, req.mtd_num);
982                 if (IS_ERR(mtd)) {
983                         err = PTR_ERR(mtd);
984                         break;
985                 }
986
987                 /*
988                  * Note, further request verification is done by
989                  * 'ubi_attach_mtd_dev()'.
990                  */
991                 mutex_lock(&ubi_devices_mutex);
992                 err = ubi_attach_mtd_dev(mtd, req.ubi_num, req.vid_hdr_offset);
993                 mutex_unlock(&ubi_devices_mutex);
994                 if (err < 0)
995                         put_mtd_device(mtd);
996                 else
997                         /* @err contains UBI device number */
998                         err = put_user(err, (__user int32_t *)argp);
999
1000                 break;
1001         }
1002
1003         /* Detach an MTD device command */
1004         case UBI_IOCDET:
1005         {
1006                 int ubi_num;
1007
1008                 dbg_gen("dettach MTD device");
1009                 err = get_user(ubi_num, (__user int32_t *)argp);
1010                 if (err) {
1011                         err = -EFAULT;
1012                         break;
1013                 }
1014
1015                 mutex_lock(&ubi_devices_mutex);
1016                 err = ubi_detach_mtd_dev(ubi_num, 0);
1017                 mutex_unlock(&ubi_devices_mutex);
1018                 break;
1019         }
1020
1021         default:
1022                 err = -ENOTTY;
1023                 break;
1024         }
1025
1026         return err;
1027 }
1028
1029 /* UBI control character device operations */
1030 struct file_operations ubi_ctrl_cdev_operations = {
1031         .ioctl = ctrl_cdev_ioctl,
1032         .owner = THIS_MODULE,
1033 };
1034
1035 /* UBI character device operations */
1036 struct file_operations ubi_cdev_operations = {
1037         .owner = THIS_MODULE,
1038         .ioctl = ubi_cdev_ioctl,
1039         .llseek = no_llseek,
1040 };
1041
1042 /* UBI volume character device operations */
1043 struct file_operations ubi_vol_cdev_operations = {
1044         .owner   = THIS_MODULE,
1045         .open    = vol_cdev_open,
1046         .release = vol_cdev_release,
1047         .llseek  = vol_cdev_llseek,
1048         .read    = vol_cdev_read,
1049         .write   = vol_cdev_write,
1050         .ioctl   = vol_cdev_ioctl,
1051 };