brintos

brintos / linux-shallow public Read only

0
0
Text · 2.2 KiB · 36e35c1 Raw
89 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Pioctl operations for Coda.4 * Original version: (C) 1996 Peter Braam5 * Rewritten for Linux 2.1: (C) 1997 Carnegie Mellon University6 *7 * Carnegie Mellon encourages users of this code to contribute improvements8 * to the Coda project. Contact Peter Braam <coda@cs.cmu.edu>.9 */10 11#include <linux/types.h>12#include <linux/kernel.h>13#include <linux/time.h>14#include <linux/fs.h>15#include <linux/stat.h>16#include <linux/errno.h>17#include <linux/string.h>18#include <linux/namei.h>19#include <linux/module.h>20#include <linux/uaccess.h>21 22#include <linux/coda.h>23#include "coda_psdev.h"24#include "coda_linux.h"25 26/* pioctl ops */27static int coda_ioctl_permission(struct mnt_idmap *idmap,28				 struct inode *inode, int mask);29static long coda_pioctl(struct file *filp, unsigned int cmd,30			unsigned long user_data);31 32/* exported from this file */33const struct inode_operations coda_ioctl_inode_operations = {34	.permission	= coda_ioctl_permission,35	.setattr	= coda_setattr,36};37 38const struct file_operations coda_ioctl_operations = {39	.unlocked_ioctl	= coda_pioctl,40	.llseek		= noop_llseek,41};42 43/* the coda pioctl inode ops */44static int coda_ioctl_permission(struct mnt_idmap *idmap,45				 struct inode *inode, int mask)46{47	return (mask & MAY_EXEC) ? -EACCES : 0;48}49 50static long coda_pioctl(struct file *filp, unsigned int cmd,51			unsigned long user_data)52{53	struct path path;54	int error;55	struct PioctlData data;56	struct inode *inode = file_inode(filp);57	struct inode *target_inode = NULL;58	struct coda_inode_info *cnp;59 60	/* get the Pioctl data arguments from user space */61	if (copy_from_user(&data, (void __user *)user_data, sizeof(data)))62		return -EINVAL;63 64	/*65	 * Look up the pathname. Note that the pathname is in66	 * user memory, and namei takes care of this67	 */68	error = user_path_at(AT_FDCWD, data.path,69			     data.follow ? LOOKUP_FOLLOW : 0, &path);70	if (error)71		return error;72 73	target_inode = d_inode(path.dentry);74 75	/* return if it is not a Coda inode */76	if (target_inode->i_sb != inode->i_sb) {77		error = -EINVAL;78		goto out;79	}80 81	/* now proceed to make the upcall */82	cnp = ITOC(target_inode);83 84	error = venus_pioctl(inode->i_sb, &(cnp->c_fid), cmd, &data);85out:86	path_put(&path);87	return error;88}89