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

Commit 73c592b9 authored by Eric Van Hensbergen's avatar Eric Van Hensbergen Committed by Linus Torvalds
Browse files

[PATCH] v9fs: Clean-up vfs_inode and setattr functions



Cleanup code in v9fs vfs_inode as suggested by Alexey Dobriyan.  Did some
major revamping of the v9fs setattr code to remove unnecessary allocations and
clean up some dead-code.

Signed-off-by: default avatarEric Van Hensbergen <ericvh@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 1346f51e
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -139,7 +139,7 @@ static struct errormap errmap[] = {
	{"illegal mode", EINVAL},
	{"illegal mode", EINVAL},
	{"illegal name", ENAMETOOLONG},
	{"illegal name", ENAMETOOLONG},
	{"not a directory", ENOTDIR},
	{"not a directory", ENOTDIR},
	{"not a member of proposed group", EINVAL},
	{"not a member of proposed group", EPERM},
	{"not owner", EACCES},
	{"not owner", EACCES},
	{"only owner can change group in wstat", EACCES},
	{"only owner can change group in wstat", EACCES},
	{"read only file system", EROFS},
	{"read only file system", EROFS},
+35 −96
Original line number Original line Diff line number Diff line
/*
/*
 *  linux/fs/9p/vfs_inode.c
 *  linux/fs/9p/vfs_inode.c
 *
 *
 * This file contians vfs inode ops for the 9P2000 protocol.
 * This file contains vfs inode ops for the 9P2000 protocol.
 *
 *
 *  Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com>
 *  Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com>
 *  Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov>
 *  Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov>
@@ -54,7 +54,7 @@ static struct inode_operations v9fs_symlink_inode_operations;
 *
 *
 */
 */


static inline int unixmode2p9mode(struct v9fs_session_info *v9ses, int mode)
static int unixmode2p9mode(struct v9fs_session_info *v9ses, int mode)
{
{
	int res;
	int res;
	res = mode & 0777;
	res = mode & 0777;
@@ -92,7 +92,7 @@ static inline int unixmode2p9mode(struct v9fs_session_info *v9ses, int mode)
 *
 *
 */
 */


static inline int p9mode2unixmode(struct v9fs_session_info *v9ses, int mode)
static int p9mode2unixmode(struct v9fs_session_info *v9ses, int mode)
{
{
	int res;
	int res;


@@ -132,7 +132,7 @@ static inline int p9mode2unixmode(struct v9fs_session_info *v9ses, int mode)
 *
 *
 */
 */


static inline void
static void
v9fs_blank_mistat(struct v9fs_session_info *v9ses, struct v9fs_stat *mistat)
v9fs_blank_mistat(struct v9fs_session_info *v9ses, struct v9fs_stat *mistat)
{
{
	mistat->type = ~0;
	mistat->type = ~0;
@@ -160,7 +160,7 @@ v9fs_blank_mistat(struct v9fs_session_info *v9ses, struct v9fs_stat *mistat)
/**
/**
 * v9fs_mistat2unix - convert mistat to unix stat
 * v9fs_mistat2unix - convert mistat to unix stat
 * @mistat: Plan 9 metadata (mistat) structure
 * @mistat: Plan 9 metadata (mistat) structure
 * @stat: unix metadata (stat) structure to populate
 * @buf: unix metadata (stat) structure to populate
 * @sb: superblock
 * @sb: superblock
 *
 *
 */
 */
@@ -177,22 +177,11 @@ v9fs_mistat2unix(struct v9fs_stat *mistat, struct stat *buf,
	buf->st_mtime = mistat->mtime;
	buf->st_mtime = mistat->mtime;
	buf->st_ctime = mistat->mtime;
	buf->st_ctime = mistat->mtime;


	if (v9ses && v9ses->extended) {
		/* TODO: string to uid mapping via user-space daemon */
		buf->st_uid = mistat->n_uid;
		buf->st_gid = mistat->n_gid;

		sscanf(mistat->uid, "%x", (unsigned int *)&buf->st_uid);
		sscanf(mistat->gid, "%x", (unsigned int *)&buf->st_gid);
	} else {
		buf->st_uid = v9ses->uid;
		buf->st_gid = v9ses->gid;
	}

	buf->st_uid = (unsigned short)-1;
	buf->st_uid = (unsigned short)-1;
	buf->st_gid = (unsigned short)-1;
	buf->st_gid = (unsigned short)-1;


	if (v9ses && v9ses->extended) {
	if (v9ses && v9ses->extended) {
		/* TODO: string to uid mapping via user-space daemon */
		if (mistat->n_uid != -1)
		if (mistat->n_uid != -1)
			sscanf(mistat->uid, "%x", (unsigned int *)&buf->st_uid);
			sscanf(mistat->uid, "%x", (unsigned int *)&buf->st_uid);


@@ -290,7 +279,7 @@ struct inode *v9fs_get_inode(struct super_block *sb, int mode)
 * @dir: directory inode file is being created in
 * @dir: directory inode file is being created in
 * @file_dentry: dentry file is being created in
 * @file_dentry: dentry file is being created in
 * @perm: permissions file is being created with
 * @perm: permissions file is being created with
 * @open_mode: resulting open mode for file ???
 * @open_mode: resulting open mode for file
 *
 *
 */
 */


@@ -434,9 +423,9 @@ v9fs_create(struct inode *dir,


/**
/**
 * v9fs_remove - helper function to remove files and directories
 * v9fs_remove - helper function to remove files and directories
 * @inode: directory inode that is being deleted
 * @dir: directory inode that is being deleted
 * @dentry:  dentry that is being deleted
 * @file:  dentry that is being deleted
 * @rmdir: where we are a file or a directory
 * @rmdir: removing a directory
 *
 *
 */
 */


@@ -502,7 +491,7 @@ v9fs_vfs_create(struct inode *inode, struct dentry *dentry, int perm,


/**
/**
 * v9fs_vfs_mkdir - VFS mkdir hook to create a directory
 * v9fs_vfs_mkdir - VFS mkdir hook to create a directory
 * @i:  inode that is being unlinked
 * @inode:  inode that is being unlinked
 * @dentry: dentry that is being unlinked
 * @dentry: dentry that is being unlinked
 * @mode: mode for new directory
 * @mode: mode for new directory
 *
 *
@@ -624,7 +613,7 @@ static struct dentry *v9fs_vfs_lookup(struct inode *dir, struct dentry *dentry,
/**
/**
 * v9fs_vfs_unlink - VFS unlink hook to delete an inode
 * v9fs_vfs_unlink - VFS unlink hook to delete an inode
 * @i:  inode that is being unlinked
 * @i:  inode that is being unlinked
 * @dentry: dentry that is being unlinked
 * @d: dentry that is being unlinked
 *
 *
 */
 */


@@ -636,7 +625,7 @@ static int v9fs_vfs_unlink(struct inode *i, struct dentry *d)
/**
/**
 * v9fs_vfs_rmdir - VFS unlink hook to delete a directory
 * v9fs_vfs_rmdir - VFS unlink hook to delete a directory
 * @i:  inode that is being unlinked
 * @i:  inode that is being unlinked
 * @dentry: dentry that is being unlinked
 * @d: dentry that is being unlinked
 *
 *
 */
 */


@@ -674,6 +663,9 @@ v9fs_vfs_rename(struct inode *old_dir, struct dentry *old_dentry,


	dprintk(DEBUG_VFS, "\n");
	dprintk(DEBUG_VFS, "\n");


	if (!mistat)
		return -ENOMEM;

	if ((!oldfid) || (!olddirfid) || (!newdirfid)) {
	if ((!oldfid) || (!olddirfid) || (!newdirfid)) {
		dprintk(DEBUG_ERROR, "problem with arguments\n");
		dprintk(DEBUG_ERROR, "problem with arguments\n");
		return -EBADF;
		return -EBADF;
@@ -771,20 +763,21 @@ static int v9fs_vfs_setattr(struct dentry *dentry, struct iattr *iattr)
{
{
	struct v9fs_session_info *v9ses = v9fs_inode2v9ses(dentry->d_inode);
	struct v9fs_session_info *v9ses = v9fs_inode2v9ses(dentry->d_inode);
	struct v9fs_fid *fid = v9fs_fid_lookup(dentry, FID_OP);
	struct v9fs_fid *fid = v9fs_fid_lookup(dentry, FID_OP);
	struct v9fs_stat *mistat = kmalloc(v9ses->maxdata, GFP_KERNEL);
	struct v9fs_fcall *fcall = NULL;
	struct v9fs_fcall *fcall = NULL;
	struct v9fs_stat *mistat = kmalloc(v9ses->maxdata, GFP_KERNEL);
	int res = -EPERM;
	int res = -EPERM;


	dprintk(DEBUG_VFS, "\n");
	dprintk(DEBUG_VFS, "\n");

	if (!mistat)
		return -ENOMEM;

	if (!fid) {
	if (!fid) {
		dprintk(DEBUG_ERROR,
		dprintk(DEBUG_ERROR,
			"Couldn't find fid associated with dentry\n");
			"Couldn't find fid associated with dentry\n");
		return -EBADF;
		return -EBADF;
	}
	}


	if (!mistat)
		return -ENOMEM;

	v9fs_blank_mistat(v9ses, mistat);
	v9fs_blank_mistat(v9ses, mistat);
	if (iattr->ia_valid & ATTR_MODE)
	if (iattr->ia_valid & ATTR_MODE)
		mistat->mode = unixmode2p9mode(v9ses, iattr->ia_mode);
		mistat->mode = unixmode2p9mode(v9ses, iattr->ia_mode);
@@ -799,72 +792,19 @@ static int v9fs_vfs_setattr(struct dentry *dentry, struct iattr *iattr)
		mistat->length = iattr->ia_size;
		mistat->length = iattr->ia_size;


	if (v9ses->extended) {
	if (v9ses->extended) {
		char *uid = kmalloc(strlen(mistat->uid), GFP_KERNEL);
		char *ptr = mistat->data+1;
		char *gid = kmalloc(strlen(mistat->gid), GFP_KERNEL);
		char *muid = kmalloc(strlen(mistat->muid), GFP_KERNEL);
		char *name = kmalloc(strlen(mistat->name), GFP_KERNEL);
		char *extension = kmalloc(strlen(mistat->extension),
					  GFP_KERNEL);

		if ((!uid) || (!gid) || (!muid) || (!name) || (!extension)) {
			kfree(uid);
			kfree(gid);
			kfree(muid);
			kfree(name);
			kfree(extension);

			return -ENOMEM;
		}

		strcpy(uid, mistat->uid);
		strcpy(gid, mistat->gid);
		strcpy(muid, mistat->muid);
		strcpy(name, mistat->name);
		strcpy(extension, mistat->extension);


		if (iattr->ia_valid & ATTR_UID) {
		if (iattr->ia_valid & ATTR_UID) {
			if (strlen(uid) != 8) {
			mistat->uid = ptr;
				dprintk(DEBUG_ERROR, "uid strlen is %u not 8\n",
			ptr += 1+sprintf(ptr, "%08x", iattr->ia_uid);
					(unsigned int)strlen(uid));
				sprintf(uid, "%08x", iattr->ia_uid);
			} else {
				kfree(uid);
				uid = kmalloc(9, GFP_KERNEL);
			}

			sprintf(uid, "%08x", iattr->ia_uid);
			mistat->n_uid = iattr->ia_uid;
			mistat->n_uid = iattr->ia_uid;
		}
		}


		if (iattr->ia_valid & ATTR_GID) {
		if (iattr->ia_valid & ATTR_GID) {
			if (strlen(gid) != 8)
			mistat->gid = ptr;
				dprintk(DEBUG_ERROR, "gid strlen is %u not 8\n",
			ptr += 1+sprintf(ptr, "%08x", iattr->ia_gid);
					(unsigned int)strlen(gid));
			else {
				kfree(gid);
				gid = kmalloc(9, GFP_KERNEL);
			}

			sprintf(gid, "%08x", iattr->ia_gid);
			mistat->n_gid = iattr->ia_gid;
			mistat->n_gid = iattr->ia_gid;
		}
		}

		mistat->uid = mistat->data;
		strcpy(mistat->uid, uid);
		mistat->gid = mistat->data + strlen(uid) + 1;
		strcpy(mistat->gid, gid);
		mistat->muid = mistat->gid + strlen(gid) + 1;
		strcpy(mistat->muid, muid);
		mistat->name = mistat->muid + strlen(muid) + 1;
		strcpy(mistat->name, name);
		mistat->extension = mistat->name + strlen(name) + 1;
		strcpy(mistat->extension, extension);

		kfree(uid);
		kfree(gid);
		kfree(muid);
		kfree(name);
		kfree(extension);
	}
	}


	res = v9fs_t_wstat(v9ses, fid->fid, mistat, &fcall);
	res = v9fs_t_wstat(v9ses, fid->fid, mistat, &fcall);
@@ -985,17 +925,14 @@ v9fs_vfs_symlink(struct inode *dir, struct dentry *dentry, const char *symname)
	int retval = -EPERM;
	int retval = -EPERM;
	struct v9fs_fid *newfid;
	struct v9fs_fid *newfid;
	struct v9fs_session_info *v9ses = v9fs_inode2v9ses(dir);
	struct v9fs_session_info *v9ses = v9fs_inode2v9ses(dir);
	struct super_block *sb = dir ? dir->i_sb : NULL;
	struct v9fs_fcall *fcall = NULL;
	struct v9fs_fcall *fcall = NULL;
	struct v9fs_stat *mistat = kmalloc(v9ses->maxdata, GFP_KERNEL);
	struct v9fs_stat *mistat = kmalloc(v9ses->maxdata, GFP_KERNEL);


	dprintk(DEBUG_VFS, " %lu,%s,%s\n", dir->i_ino, dentry->d_name.name,
	dprintk(DEBUG_VFS, " %lu,%s,%s\n", dir->i_ino, dentry->d_name.name,
		symname);
		symname);


	if ((!dentry) || (!sb) || (!v9ses)) {
	if (!mistat)
		dprintk(DEBUG_ERROR, "problem with arguments\n");
		return -ENOMEM;
		return -EBADF;
	}


	if (!v9ses->extended) {
	if (!v9ses->extended) {
		dprintk(DEBUG_ERROR, "not extended\n");
		dprintk(DEBUG_ERROR, "not extended\n");
@@ -1040,7 +977,7 @@ v9fs_vfs_symlink(struct inode *dir, struct dentry *dentry, const char *symname)
/**
/**
 * v9fs_readlink - read a symlink's location (internal version)
 * v9fs_readlink - read a symlink's location (internal version)
 * @dentry: dentry for symlink
 * @dentry: dentry for symlink
 * @buf: buffer to load symlink location into
 * @buffer: buffer to load symlink location into
 * @buflen: length of buffer
 * @buflen: length of buffer
 *
 *
 */
 */
@@ -1179,7 +1116,7 @@ static void v9fs_vfs_put_link(struct dentry *dentry, struct nameidata *nd, void
 * v9fs_vfs_link - create a hardlink
 * v9fs_vfs_link - create a hardlink
 * @old_dentry: dentry for file to link to
 * @old_dentry: dentry for file to link to
 * @dir: inode destination for new link
 * @dir: inode destination for new link
 * @new_dentry: dentry for link
 * @dentry: dentry for link
 *
 *
 */
 */


@@ -1274,6 +1211,9 @@ v9fs_vfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev)
	dprintk(DEBUG_VFS, " %lu,%s mode: %x MAJOR: %u MINOR: %u\n", dir->i_ino,
	dprintk(DEBUG_VFS, " %lu,%s mode: %x MAJOR: %u MINOR: %u\n", dir->i_ino,
		dentry->d_name.name, mode, MAJOR(rdev), MINOR(rdev));
		dentry->d_name.name, mode, MAJOR(rdev), MINOR(rdev));


	if (!mistat)
		return -ENOMEM;

	if (!new_valid_dev(rdev)) {
	if (!new_valid_dev(rdev)) {
		retval = -EINVAL;
		retval = -EINVAL;
		goto FreeMem;
		goto FreeMem;
@@ -1302,7 +1242,8 @@ v9fs_vfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev)
		sprintf(symname, "b %u %u", MAJOR(rdev), MINOR(rdev));
		sprintf(symname, "b %u %u", MAJOR(rdev), MINOR(rdev));
	else if (S_ISCHR(mode))
	else if (S_ISCHR(mode))
		sprintf(symname, "c %u %u", MAJOR(rdev), MINOR(rdev));
		sprintf(symname, "c %u %u", MAJOR(rdev), MINOR(rdev));
	else if (S_ISFIFO(mode)) ;	/* DO NOTHING */
	else if (S_ISFIFO(mode))
		;	/* DO NOTHING */
	else {
	else {
		retval = -EINVAL;
		retval = -EINVAL;
		goto FreeMem;
		goto FreeMem;
@@ -1319,8 +1260,6 @@ v9fs_vfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev)
				FCALL_ERROR(fcall));
				FCALL_ERROR(fcall));
			goto FreeMem;
			goto FreeMem;
		}
		}

		kfree(fcall);
	}
	}


	/* need to update dcache so we show up */
	/* need to update dcache so we show up */