Merge tag 'seccomp-fixes-v5.13-rc4' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / drivers / mtd / mtdchar.c
index 323035d..155e991 100644 (file)
@@ -27,8 +27,6 @@
 
 #include "mtdcore.h"
 
-static DEFINE_MUTEX(mtd_mutex);
-
 /*
  * Data structure to hold the pointer to the mtd device as well
  * as mode information of various use cases.
@@ -58,13 +56,10 @@ static int mtdchar_open(struct inode *inode, struct file *file)
        if ((file->f_mode & FMODE_WRITE) && (minor & 1))
                return -EACCES;
 
-       mutex_lock(&mtd_mutex);
        mtd = get_mtd_device(NULL, devnum);
 
-       if (IS_ERR(mtd)) {
-               ret = PTR_ERR(mtd);
-               goto out;
-       }
+       if (IS_ERR(mtd))
+               return PTR_ERR(mtd);
 
        if (mtd->type == MTD_ABSENT) {
                ret = -ENODEV;
@@ -84,13 +79,10 @@ static int mtdchar_open(struct inode *inode, struct file *file)
        }
        mfi->mtd = mtd;
        file->private_data = mfi;
-       mutex_unlock(&mtd_mutex);
        return 0;
 
 out1:
        put_mtd_device(mtd);
-out:
-       mutex_unlock(&mtd_mutex);
        return ret;
 } /* mtdchar_open */
 
@@ -651,16 +643,12 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg)
        case MEMGETINFO:
        case MEMREADOOB:
        case MEMREADOOB64:
-       case MEMLOCK:
-       case MEMUNLOCK:
        case MEMISLOCKED:
        case MEMGETOOBSEL:
        case MEMGETBADBLOCK:
-       case MEMSETBADBLOCK:
        case OTPSELECT:
        case OTPGETREGIONCOUNT:
        case OTPGETREGIONINFO:
-       case OTPLOCK:
        case ECCGETLAYOUT:
        case ECCGETSTATS:
        case MTDFILEMODE:
@@ -671,9 +659,14 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg)
        /* "dangerous" commands */
        case MEMERASE:
        case MEMERASE64:
+       case MEMLOCK:
+       case MEMUNLOCK:
+       case MEMSETBADBLOCK:
        case MEMWRITEOOB:
        case MEMWRITEOOB64:
        case MEMWRITE:
+       case OTPLOCK:
+       case OTPERASE:
                if (!(file->f_mode & FMODE_WRITE))
                        return -EPERM;
                break;
@@ -938,6 +931,7 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg)
        }
 
        case OTPLOCK:
+       case OTPERASE:
        {
                struct otp_info oinfo;
 
@@ -945,7 +939,10 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg)
                        return -EINVAL;
                if (copy_from_user(&oinfo, argp, sizeof(oinfo)))
                        return -EFAULT;
-               ret = mtd_lock_user_prot_reg(mtd, oinfo.start, oinfo.length);
+               if (cmd == OTPLOCK)
+                       ret = mtd_lock_user_prot_reg(mtd, oinfo.start, oinfo.length);
+               else
+                       ret = mtd_erase_user_prot_reg(mtd, oinfo.start, oinfo.length);
                break;
        }
 
@@ -991,6 +988,7 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg)
                        if (!mtd_has_oob(mtd))
                                return -EOPNOTSUPP;
                        mfi->mode = arg;
+                       break;
 
                case MTD_FILE_MODE_NORMAL:
                        break;
@@ -1026,11 +1024,14 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg)
 
 static long mtdchar_unlocked_ioctl(struct file *file, u_int cmd, u_long arg)
 {
+       struct mtd_file_info *mfi = file->private_data;
+       struct mtd_info *mtd = mfi->mtd;
+       struct mtd_info *master = mtd_get_master(mtd);
        int ret;
 
-       mutex_lock(&mtd_mutex);
+       mutex_lock(&master->master.chrdev_lock);
        ret = mtdchar_ioctl(file, cmd, arg);
-       mutex_unlock(&mtd_mutex);
+       mutex_unlock(&master->master.chrdev_lock);
 
        return ret;
 }
@@ -1051,10 +1052,11 @@ static long mtdchar_compat_ioctl(struct file *file, unsigned int cmd,
 {
        struct mtd_file_info *mfi = file->private_data;
        struct mtd_info *mtd = mfi->mtd;
+       struct mtd_info *master = mtd_get_master(mtd);
        void __user *argp = compat_ptr(arg);
        int ret = 0;
 
-       mutex_lock(&mtd_mutex);
+       mutex_lock(&master->master.chrdev_lock);
 
        switch (cmd) {
        case MEMWRITEOOB32:
@@ -1117,7 +1119,7 @@ static long mtdchar_compat_ioctl(struct file *file, unsigned int cmd,
                ret = mtdchar_ioctl(file, cmd, (unsigned long)argp);
        }
 
-       mutex_unlock(&mtd_mutex);
+       mutex_unlock(&master->master.chrdev_lock);
 
        return ret;
 }