All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg KH <greg@kroah.com>
To: Karim Yaghmour <karim@opersys.com>
Cc: linux-kernel <linux-kernel@vger.kernel.org>,
	Andrew Morton <akpm@osdl.org>, Andi Kleen <ak@muc.de>,
	Roman Zippel <zippel@linux-m68k.org>,
	Tom Zanussi <zanussi@us.ibm.com>,
	Robert Wisniewski <bob@watson.ibm.com>,
	Tim Bird <tim.bird@AM.SONY.COM>
Subject: Re: [PATCH] relayfs redux for 2.6.10: lean and mean
Date: Thu, 20 Jan 2005 07:06:46 -0800	[thread overview]
Message-ID: <20050120150646.GG13036@kroah.com> (raw)
In-Reply-To: <41EF4E74.2000304@opersys.com>

On Thu, Jan 20, 2005 at 01:23:48AM -0500, Karim Yaghmour wrote:
> +static struct inode *
> +relayfs_get_inode(struct super_block *sb, int mode, dev_t dev)
> +{
> +	struct inode * inode;
> +
> +	inode = new_inode(sb);
> +
> +	if (inode) {
> +		inode->i_mode = mode;
> +		inode->i_uid = current->fsuid;
> +		inode->i_gid = current->fsgid;

Are you sure you want these two fields set to the value of current-> ?

> +/*
> + * File creation. Allocate an inode, and we're done..
> + */
> +/* SMP-safe */
> +static int
> +relayfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
> +{
> +	struct inode * inode;
> +	int error = -ENOSPC;
> +
> +	inode = relayfs_get_inode(dir->i_sb, mode, dev);

Need to check for dentry->d_inode here before using it.

> +	if (inode) {
> +		d_instantiate(dentry, inode);
> +		dget(dentry);	/* Extra count - pin the dentry in core */
> +		error = 0;
> +	}
> +	return error;
> +}
> +
> +static int
> +relayfs_mkdir(struct inode * dir, struct dentry * dentry, int mode)
> +{
> +	int retval;
> +
> +	retval = relayfs_mknod(dir, dentry, mode | S_IFDIR, 0);

(mode & (S_IRWXUGO | S_ISVTX)) | S_IFDIR
instead of just | with S_IFDIR, right?

> +
> +	if (!retval)
> +		dir->i_nlink++;
> +	return retval;
> +}
> +
> +static int
> +relayfs_create(struct inode *dir, struct dentry *dentry, int mode, struct nameidata *nd)
> +{
> +	return relayfs_mknod(dir, dentry, mode | S_IFREG, 0);

(mode & S_IALLUGO) | S_IFREG
here too, to be safe, right?

> +}
> +
> +static int
> +relayfs_symlink(struct inode * dir, struct dentry *dentry, const char * symname)
> +{
> +	struct inode *inode;
> +	int error = -ENOSPC;
> +
> +	inode = relayfs_get_inode(dir->i_sb, S_IFLNK|S_IRWXUGO, 0);
> +
> +	if (inode) {
> +		int l = strlen(symname)+1;
> +		error = page_symlink(inode, symname, l);
> +		if (!error) {
> +			d_instantiate(dentry, inode);
> +			dget(dentry);
> +		} else
> +			iput(inode);
> +	}
> +	return error;
> +}

Why do you want to allow symlinks in relayfs?

> +
> +/**
> + *	relayfs_create_entry - create a relayfs directory or file
> + *	@name: the name of the file to create
> + *	@parent: parent directory
> + *	@dentry: result dentry
> + *	@entry_type: type of file to create (S_IFREG, S_IFDIR)
> + *	@mode: mode
> + *	@data: data to associate with the file
> + *
> + *	Creates a file or directory with the specifed permissions.
> + */
> +static int
> +relayfs_create_entry(const char * name, struct dentry * parent, struct dentry **dentry, int entry_type, int mode, void * data)
> +{
> +	struct qstr qname;
> +	struct dentry * d;
> +
> +	int error = 0;
> +
> +	error = simple_pin_fs("relayfs", &relayfs_mount, &relayfs_mount_count);
> +	if (error) {
> +		printk(KERN_ERR "Couldn't mount relayfs: errcode %d\n", error);
> +		return error;
> +	}
> +
> +	qname.name = name;
> +	qname.len = strlen(name);
> +	qname.hash = full_name_hash(name, qname.len);
> +
> +	if (parent == NULL)
> +		if (relayfs_mount && relayfs_mount->mnt_sb)
> +			parent = relayfs_mount->mnt_sb->s_root;
> +
> +	if (parent == NULL) {
> +		simple_release_fs(&relayfs_mount, &relayfs_mount_count);
> + 		return -EINVAL;
> +	}
> +
> +	parent = dget(parent);
> +	down(&parent->d_inode->i_sem);
> +	d = lookup_hash(&qname, parent);
> +	if (IS_ERR(d)) {
> +		error = PTR_ERR(d);
> +		goto release_mount;
> +	}
> +
> +	if (d->d_inode) {
> +		error = -EEXIST;
> +		goto release_mount;
> +	}
> +
> +	if (entry_type == S_IFREG)
> +		error = relayfs_create(parent->d_inode, d, entry_type | mode, NULL);
> +	else
> +		error = relayfs_mkdir(parent->d_inode, d, entry_type | mode);

Why not just go off of the mode here?  That would let you get rid of a
paramater, as you need mode to be set properly anyway for directories.



> +	if (error)
> +		goto release_mount;
> +
> +	if ((entry_type == S_IFREG) && data) {
> +		d->d_inode->u.generic_ip = data;
> +		goto exit; /* don't release mount for regular files */
> +	}

Same here.

thanks,

greg k-h

  parent reply	other threads:[~2005-01-20 15:07 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-01-20  6:23 [PATCH] relayfs redux for 2.6.10: lean and mean Karim Yaghmour
2005-01-20 14:50 ` Greg KH
2005-01-21  1:38   ` Karim Yaghmour
2005-01-21  2:15     ` Peter Williams
2005-01-21  6:39       ` Greg KH
2005-01-21  7:27         ` Peter Williams
2005-01-21  7:46           ` Greg KH
2005-01-21  6:43     ` Greg KH
2005-01-23  8:07       ` Karim Yaghmour
2005-01-20 15:06 ` Greg KH [this message]
2005-01-20 19:51 ` Pekka Enberg
2005-02-07  3:04 ` [PATCH] relayfs crash Kingsley Cheung
2005-02-07  3:16   ` Karim Yaghmour
2005-02-07  4:42   ` Tom Zanussi
2005-02-07  4:47     ` Kingsley Cheung

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20050120150646.GG13036@kroah.com \
    --to=greg@kroah.com \
    --cc=ak@muc.de \
    --cc=akpm@osdl.org \
    --cc=bob@watson.ibm.com \
    --cc=karim@opersys.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tim.bird@AM.SONY.COM \
    --cc=zanussi@us.ibm.com \
    --cc=zippel@linux-m68k.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.