Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cdf4a648 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'upstream' of git://git.infradead.org/~dedekind/ubi-2.6

* 'upstream' of git://git.infradead.org/~dedekind/ubi-2.6: (28 commits)
  UBI: fix compile warning
  UBI: fix error handling in erase worker
  UBI: fix comments
  UBI: remove unneeded error checks
  UBI: cleanup usage of try_module_get
  UBI: fix overflow bug
  UBI: bugfix in max_sqnum calculation
  UBI: bugfix in sqnum calculation
  UBI: fix signed-unsigned multiplication
  UBI: fix bug in atomic_leb_change()
  UBI: fix message
  UBI: fix debugging stuff
  UBI: bugfix in error path
  UBI: use is_power_of_2()
  UBI: fix freeing ubi->vtbl while unloading
  UBI: fix MAINTAINERS
  UBI: bugfix in ubi_leb_change()
  UBI: kill homegrown endian macros
  UBI: cleanup ioctl handling
  UBI: error path bugfix
  ...
parents 485cf925 add0b43c
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2393,7 +2393,7 @@ P: Artem Bityutskiy
M:	dedekind@infradead.org
W:	http://www.linux-mtd.infradead.org/
L:	linux-mtd@lists.infradead.org
T:	git git://git.infradead.org/ubi-2.6.git
T:	git git://git.infradead.org/~dedekind/ubi-2.6.git
S:	Maintained

MICROTEK X6 SCANNER
+7 −18
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@
#include <linux/moduleparam.h>
#include <linux/stringify.h>
#include <linux/stat.h>
#include <linux/log2.h>
#include "ubi.h"

/* Maximum length of the 'mtd=' parameter */
@@ -369,7 +370,7 @@ static int attach_by_scanning(struct ubi_device *ubi)
out_wl:
	ubi_wl_close(ubi);
out_vtbl:
	kfree(ubi->vtbl);
	vfree(ubi->vtbl);
out_si:
	ubi_scan_destroy_si(si);
	return err;
@@ -422,8 +423,7 @@ static int io_init(struct ubi_device *ubi)
	ubi->hdrs_min_io_size = ubi->mtd->writesize >> ubi->mtd->subpage_sft;

	/* Make sure minimal I/O unit is power of 2 */
	if (ubi->min_io_size == 0 ||
	    (ubi->min_io_size & (ubi->min_io_size - 1))) {
	if (!is_power_of_2(ubi->min_io_size)) {
		ubi_err("bad min. I/O unit");
		return -EINVAL;
	}
@@ -593,8 +593,6 @@ static int attach_mtd_dev(const char *mtd_dev, int vid_hdr_offset,
	if (err)
		goto out_detach;

	ubi_devices_cnt += 1;

	ubi_msg("attached mtd%d to ubi%d", ubi->mtd->index, ubi_devices_cnt);
	ubi_msg("MTD device name:            \"%s\"", ubi->mtd->name);
	ubi_msg("MTD device size:            %llu MiB", ubi->flash_size >> 20);
@@ -624,12 +622,13 @@ static int attach_mtd_dev(const char *mtd_dev, int vid_hdr_offset,
		wake_up_process(ubi->bgt_thread);
	}

	ubi_devices_cnt += 1;
	return 0;

out_detach:
	ubi_eba_close(ubi);
	ubi_wl_close(ubi);
	kfree(ubi->vtbl);
	vfree(ubi->vtbl);
out_free:
	kfree(ubi);
out_mtd:
@@ -650,7 +649,7 @@ static void detach_mtd_dev(struct ubi_device *ubi)
	uif_close(ubi);
	ubi_eba_close(ubi);
	ubi_wl_close(ubi);
	kfree(ubi->vtbl);
	vfree(ubi->vtbl);
	put_mtd_device(ubi->mtd);
	kfree(ubi_devices[ubi_num]);
	ubi_devices[ubi_num] = NULL;
@@ -686,13 +685,6 @@ static int __init ubi_init(void)
		struct mtd_dev_param *p = &mtd_dev_param[i];

		cond_resched();

		if (!p->name) {
			dbg_err("empty name");
			err = -EINVAL;
			goto out_detach;
		}

		err = attach_mtd_dev(p->name, p->vid_hdr_offs, p->data_offs);
		if (err)
			goto out_detach;
@@ -799,7 +791,7 @@ static int __init ubi_mtd_param_parse(const char *val, struct kernel_param *kp)

	/* Get rid of the final newline */
	if (buf[len - 1] == '\n')
		buf[len - 1] = 0;
		buf[len - 1] = '\0';

	for (i = 0; i < 3; i++)
		tokens[i] = strsep(&pbuf, ",");
@@ -809,9 +801,6 @@ static int __init ubi_mtd_param_parse(const char *val, struct kernel_param *kp)
		return -EINVAL;
	}

	if (tokens[0] == '\0')
		return -EINVAL;

	p = &mtd_dev_param[mtd_devs];
	strcpy(&p->name[0], tokens[0]);

+14 −35
Original line number Diff line number Diff line
@@ -64,6 +64,7 @@ static struct ubi_device *major_to_device(int major)
		if (ubi_devices[i] && ubi_devices[i]->major == major)
			return ubi_devices[i];
	BUG();
	return NULL;
}

/**
@@ -153,7 +154,7 @@ static int vol_cdev_release(struct inode *inode, struct file *file)
		ubi_warn("update of volume %d not finished, volume is damaged",
			 vol->vol_id);
		vol->updating = 0;
		kfree(vol->upd_buf);
		vfree(vol->upd_buf);
	}

	ubi_close_volume(desc);
@@ -232,7 +233,7 @@ static ssize_t vol_cdev_read(struct file *file, __user char *buf, size_t count,
	tbuf_size = vol->usable_leb_size;
	if (count < tbuf_size)
		tbuf_size = ALIGN(count, ubi->min_io_size);
	tbuf = kmalloc(tbuf_size, GFP_KERNEL);
	tbuf = vmalloc(tbuf_size);
	if (!tbuf)
		return -ENOMEM;

@@ -271,7 +272,7 @@ static ssize_t vol_cdev_read(struct file *file, __user char *buf, size_t count,
		len = count > tbuf_size ? tbuf_size : count;
	} while (count);

	kfree(tbuf);
	vfree(tbuf);
	return err ? err : count_save - count;
}

@@ -320,7 +321,7 @@ static ssize_t vol_cdev_direct_write(struct file *file, const char __user *buf,
	tbuf_size = vol->usable_leb_size;
	if (count < tbuf_size)
		tbuf_size = ALIGN(count, ubi->min_io_size);
	tbuf = kmalloc(tbuf_size, GFP_KERNEL);
	tbuf = vmalloc(tbuf_size);
	if (!tbuf)
		return -ENOMEM;

@@ -355,7 +356,7 @@ static ssize_t vol_cdev_direct_write(struct file *file, const char __user *buf,
		len = count > tbuf_size ? tbuf_size : count;
	}

	kfree(tbuf);
	vfree(tbuf);
	return err ? err : count_save - count;
}

@@ -397,6 +398,7 @@ static ssize_t vol_cdev_write(struct file *file, const char __user *buf,
			vol->corrupted = 1;
		}
		vol->checked = 1;
		ubi_gluebi_updated(vol);
		revoke_exclusive(desc, UBI_READWRITE);
	}

@@ -413,19 +415,7 @@ static int vol_cdev_ioctl(struct inode *inode, struct file *file,
	struct ubi_device *ubi = vol->ubi;
	void __user *argp = (void __user *)arg;

	if (_IOC_NR(cmd) > VOL_CDEV_IOC_MAX_SEQ ||
	    _IOC_TYPE(cmd) != UBI_VOL_IOC_MAGIC)
		return -ENOTTY;

	if (_IOC_DIR(cmd) && _IOC_READ)
		err = !access_ok(VERIFY_WRITE, argp, _IOC_SIZE(cmd));
	else if (_IOC_DIR(cmd) && _IOC_WRITE)
		err = !access_ok(VERIFY_READ, argp, _IOC_SIZE(cmd));
	if (err)
		return -EFAULT;

	switch (cmd) {

	/* Volume update command */
	case UBI_IOCVOLUP:
	{
@@ -471,7 +461,7 @@ static int vol_cdev_ioctl(struct inode *inode, struct file *file,
	{
		int32_t lnum;

		err = __get_user(lnum, (__user int32_t *)argp);
		err = get_user(lnum, (__user int32_t *)argp);
		if (err) {
			err = -EFAULT;
			break;
@@ -587,17 +577,6 @@ static int ubi_cdev_ioctl(struct inode *inode, struct file *file,
	struct ubi_volume_desc *desc;
	void __user *argp = (void __user *)arg;

	if (_IOC_NR(cmd) > UBI_CDEV_IOC_MAX_SEQ ||
	    _IOC_TYPE(cmd) != UBI_IOC_MAGIC)
		return -ENOTTY;

	if (_IOC_DIR(cmd) && _IOC_READ)
		err = !access_ok(VERIFY_WRITE, argp, _IOC_SIZE(cmd));
	else if (_IOC_DIR(cmd) && _IOC_WRITE)
		err = !access_ok(VERIFY_READ, argp, _IOC_SIZE(cmd));
	if (err)
		return -EFAULT;

	if (!capable(CAP_SYS_RESOURCE))
		return -EPERM;

@@ -612,7 +591,7 @@ static int ubi_cdev_ioctl(struct inode *inode, struct file *file,
		struct ubi_mkvol_req req;

		dbg_msg("create volume");
		err = __copy_from_user(&req, argp,
		err = copy_from_user(&req, argp,
				       sizeof(struct ubi_mkvol_req));
		if (err) {
			err = -EFAULT;
@@ -629,7 +608,7 @@ static int ubi_cdev_ioctl(struct inode *inode, struct file *file,
		if (err)
			break;

		err = __put_user(req.vol_id, (__user int32_t *)argp);
		err = put_user(req.vol_id, (__user int32_t *)argp);
		if (err)
			err = -EFAULT;

@@ -642,7 +621,7 @@ static int ubi_cdev_ioctl(struct inode *inode, struct file *file,
		int vol_id;

		dbg_msg("remove volume");
		err = __get_user(vol_id, (__user int32_t *)argp);
		err = get_user(vol_id, (__user int32_t *)argp);
		if (err) {
			err = -EFAULT;
			break;
@@ -669,7 +648,7 @@ static int ubi_cdev_ioctl(struct inode *inode, struct file *file,
		struct ubi_rsvol_req req;

		dbg_msg("re-size volume");
		err = __copy_from_user(&req, argp,
		err = copy_from_user(&req, argp,
				       sizeof(struct ubi_rsvol_req));
		if (err) {
			err = -EFAULT;
@@ -707,7 +686,7 @@ static int ubi_cdev_ioctl(struct inode *inode, struct file *file,
struct file_operations ubi_cdev_operations = {
	.owner = THIS_MODULE,
	.ioctl = ubi_cdev_ioctl,
	.llseek = no_llseek
	.llseek = no_llseek,
};

/* UBI volume character device operations */
@@ -718,5 +697,5 @@ struct file_operations ubi_vol_cdev_operations = {
	.llseek  = vol_cdev_llseek,
	.read    = vol_cdev_read,
	.write   = vol_cdev_write,
	.ioctl   = vol_cdev_ioctl
	.ioctl   = vol_cdev_ioctl,
};
+22 −22
Original line number Diff line number Diff line
@@ -35,12 +35,12 @@
void ubi_dbg_dump_ec_hdr(const struct ubi_ec_hdr *ec_hdr)
{
	dbg_msg("erase counter header dump:");
	dbg_msg("magic          %#08x", ubi32_to_cpu(ec_hdr->magic));
	dbg_msg("magic          %#08x", be32_to_cpu(ec_hdr->magic));
	dbg_msg("version        %d",    (int)ec_hdr->version);
	dbg_msg("ec             %llu",  (long long)ubi64_to_cpu(ec_hdr->ec));
	dbg_msg("vid_hdr_offset %d",    ubi32_to_cpu(ec_hdr->vid_hdr_offset));
	dbg_msg("data_offset    %d",    ubi32_to_cpu(ec_hdr->data_offset));
	dbg_msg("hdr_crc        %#08x", ubi32_to_cpu(ec_hdr->hdr_crc));
	dbg_msg("ec             %llu",  (long long)be64_to_cpu(ec_hdr->ec));
	dbg_msg("vid_hdr_offset %d",    be32_to_cpu(ec_hdr->vid_hdr_offset));
	dbg_msg("data_offset    %d",    be32_to_cpu(ec_hdr->data_offset));
	dbg_msg("hdr_crc        %#08x", be32_to_cpu(ec_hdr->hdr_crc));
	dbg_msg("erase counter header hexdump:");
	ubi_dbg_hexdump(ec_hdr, UBI_EC_HDR_SIZE);
}
@@ -52,20 +52,20 @@ void ubi_dbg_dump_ec_hdr(const struct ubi_ec_hdr *ec_hdr)
void ubi_dbg_dump_vid_hdr(const struct ubi_vid_hdr *vid_hdr)
{
	dbg_msg("volume identifier header dump:");
	dbg_msg("magic     %08x", ubi32_to_cpu(vid_hdr->magic));
	dbg_msg("magic     %08x", be32_to_cpu(vid_hdr->magic));
	dbg_msg("version   %d",   (int)vid_hdr->version);
	dbg_msg("vol_type  %d",   (int)vid_hdr->vol_type);
	dbg_msg("copy_flag %d",   (int)vid_hdr->copy_flag);
	dbg_msg("compat    %d",   (int)vid_hdr->compat);
	dbg_msg("vol_id    %d",   ubi32_to_cpu(vid_hdr->vol_id));
	dbg_msg("lnum      %d",   ubi32_to_cpu(vid_hdr->lnum));
	dbg_msg("leb_ver   %u",   ubi32_to_cpu(vid_hdr->leb_ver));
	dbg_msg("data_size %d",   ubi32_to_cpu(vid_hdr->data_size));
	dbg_msg("used_ebs  %d",   ubi32_to_cpu(vid_hdr->used_ebs));
	dbg_msg("data_pad  %d",   ubi32_to_cpu(vid_hdr->data_pad));
	dbg_msg("vol_id    %d",   be32_to_cpu(vid_hdr->vol_id));
	dbg_msg("lnum      %d",   be32_to_cpu(vid_hdr->lnum));
	dbg_msg("leb_ver   %u",   be32_to_cpu(vid_hdr->leb_ver));
	dbg_msg("data_size %d",   be32_to_cpu(vid_hdr->data_size));
	dbg_msg("used_ebs  %d",   be32_to_cpu(vid_hdr->used_ebs));
	dbg_msg("data_pad  %d",   be32_to_cpu(vid_hdr->data_pad));
	dbg_msg("sqnum     %llu",
		(unsigned long long)ubi64_to_cpu(vid_hdr->sqnum));
	dbg_msg("hdr_crc   %08x", ubi32_to_cpu(vid_hdr->hdr_crc));
		(unsigned long long)be64_to_cpu(vid_hdr->sqnum));
	dbg_msg("hdr_crc   %08x", be32_to_cpu(vid_hdr->hdr_crc));
	dbg_msg("volume identifier header hexdump:");
}

@@ -106,12 +106,12 @@ void ubi_dbg_dump_vol_info(const struct ubi_volume *vol)
 */
void ubi_dbg_dump_vtbl_record(const struct ubi_vtbl_record *r, int idx)
{
	int name_len = ubi16_to_cpu(r->name_len);
	int name_len = be16_to_cpu(r->name_len);

	dbg_msg("volume table record %d dump:", idx);
	dbg_msg("reserved_pebs   %d", ubi32_to_cpu(r->reserved_pebs));
	dbg_msg("alignment       %d", ubi32_to_cpu(r->alignment));
	dbg_msg("data_pad        %d", ubi32_to_cpu(r->data_pad));
	dbg_msg("reserved_pebs   %d", be32_to_cpu(r->reserved_pebs));
	dbg_msg("alignment       %d", be32_to_cpu(r->alignment));
	dbg_msg("data_pad        %d", be32_to_cpu(r->data_pad));
	dbg_msg("vol_type        %d", (int)r->vol_type);
	dbg_msg("upd_marker      %d", (int)r->upd_marker);
	dbg_msg("name_len        %d", name_len);
@@ -129,7 +129,7 @@ void ubi_dbg_dump_vtbl_record(const struct ubi_vtbl_record *r, int idx)
			r->name[0], r->name[1], r->name[2], r->name[3],
			r->name[4]);
	}
	dbg_msg("crc             %#08x", ubi32_to_cpu(r->crc));
	dbg_msg("crc             %#08x", be32_to_cpu(r->crc));
}

/**
+0 −2
Original line number Diff line number Diff line
@@ -52,7 +52,6 @@ struct ubi_scan_volume;
struct ubi_scan_leb;
struct ubi_mkvol_req;

void ubi_dbg_print(int type, const char *func, const char *fmt, ...);
void ubi_dbg_dump_ec_hdr(const struct ubi_ec_hdr *ec_hdr);
void ubi_dbg_dump_vid_hdr(const struct ubi_vid_hdr *vid_hdr);
void ubi_dbg_dump_vol_info(const struct ubi_volume *vol);
@@ -66,7 +65,6 @@ void ubi_dbg_hexdump(const void *buf, int size);

#define dbg_msg(fmt, ...)    ({})
#define ubi_dbg_dump_stack() ({})
#define ubi_dbg_print(func, fmt, ...)    ({})
#define ubi_dbg_dump_ec_hdr(ec_hdr)      ({})
#define ubi_dbg_dump_vid_hdr(vid_hdr)    ({})
#define ubi_dbg_dump_vol_info(vol)       ({})
Loading