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

Commit f16a5e34 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-fixes:
  GFS2: Fix permissions checking for setflags ioctl()
  GFS2: Don't "get" xattrs for ACLs when ACLs are turned off
  GFS2: Rework reclaiming unlinked dinodes
parents 110b9384 7df0e039
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -236,10 +236,14 @@ static int gfs2_xattr_system_get(struct dentry *dentry, const char *name,
				 void *buffer, size_t size, int xtype)
{
	struct inode *inode = dentry->d_inode;
	struct gfs2_sbd *sdp = GFS2_SB(inode);
	struct posix_acl *acl;
	int type;
	int error;

	if (!sdp->sd_args.ar_posix_acl)
		return -EOPNOTSUPP;

	type = gfs2_acl_type(name);
	if (type < 0)
		return type;
+7 −0
Original line number Diff line number Diff line
@@ -218,6 +218,11 @@ static int do_gfs2_set_flags(struct file *filp, u32 reqflags, u32 mask)
	if (error)
		goto out_drop_write;

	error = -EACCES;
	if (!is_owner_or_cap(inode))
		goto out;

	error = 0;
	flags = ip->i_diskflags;
	new_flags = (flags & ~mask) | (reqflags & mask);
	if ((new_flags ^ flags) == 0)
@@ -275,8 +280,10 @@ static int gfs2_set_flags(struct file *filp, u32 __user *ptr)
{
	struct inode *inode = filp->f_path.dentry->d_inode;
	u32 fsflags, gfsflags;

	if (get_user(fsflags, ptr))
		return -EFAULT;

	gfsflags = fsflags_cvt(fsflags_to_gfs2, fsflags);
	if (!S_ISDIR(inode->i_mode)) {
		if (gfsflags & GFS2_DIF_INHERIT_JDATA)
+29 −25
Original line number Diff line number Diff line
@@ -242,34 +242,38 @@ struct inode *gfs2_inode_lookup(struct super_block *sb,
}

/**
 * gfs2_unlinked_inode_lookup - Lookup an unlinked inode for reclamation
 * gfs2_process_unlinked_inode - Lookup an unlinked inode for reclamation
 *                               and try to reclaim it by doing iput.
 *
 * This function assumes no rgrp locks are currently held.
 *
 * @sb: The super block
 * no_addr: The inode number
 * @@inode: A pointer to the inode found, if any
 *
 * Returns: 0 and *inode if no errors occurred.  If an error occurs,
 *          the resulting *inode may or may not be NULL.
 */

int gfs2_unlinked_inode_lookup(struct super_block *sb, u64 no_addr,
			       struct inode **inode)
void gfs2_process_unlinked_inode(struct super_block *sb, u64 no_addr)
{
	struct gfs2_sbd *sdp;
	struct gfs2_inode *ip;
	struct gfs2_glock *io_gl;
	int error;
	struct gfs2_holder gh;
	struct inode *inode;

	*inode = gfs2_iget_skip(sb, no_addr);
	inode = gfs2_iget_skip(sb, no_addr);

	if (!(*inode))
		return -ENOBUFS;
	if (!inode)
		return;

	if (!((*inode)->i_state & I_NEW))
		return -ENOBUFS;
	/* If it's not a new inode, someone's using it, so leave it alone. */
	if (!(inode->i_state & I_NEW)) {
		iput(inode);
		return;
	}

	ip = GFS2_I(*inode);
	sdp = GFS2_SB(*inode);
	ip = GFS2_I(inode);
	sdp = GFS2_SB(inode);
	ip->i_no_formal_ino = -1;

	error = gfs2_glock_get(sdp, no_addr, &gfs2_inode_glops, CREATE, &ip->i_gl);
@@ -284,15 +288,13 @@ int gfs2_unlinked_inode_lookup(struct super_block *sb, u64 no_addr,
	set_bit(GIF_INVALID, &ip->i_flags);
	error = gfs2_glock_nq_init(io_gl, LM_ST_SHARED, LM_FLAG_TRY | GL_EXACT,
				   &ip->i_iopen_gh);
	if (unlikely(error)) {
		if (error == GLR_TRYFAILED)
			error = 0;
	if (unlikely(error))
		goto fail_iopen;
	}

	ip->i_iopen_gh.gh_gl->gl_object = ip;
	gfs2_glock_put(io_gl);

	(*inode)->i_mode = DT2IF(DT_UNKNOWN);
	inode->i_mode = DT2IF(DT_UNKNOWN);

	/*
	 * We must read the inode in order to work out its type in
@@ -303,16 +305,17 @@ int gfs2_unlinked_inode_lookup(struct super_block *sb, u64 no_addr,
	 */
	error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, LM_FLAG_TRY,
				   &gh);
	if (unlikely(error)) {
		if (error == GLR_TRYFAILED)
			error = 0;
	if (unlikely(error))
		goto fail_glock;
	}

	/* Inode is now uptodate */
	gfs2_glock_dq_uninit(&gh);
	gfs2_set_iop(*inode);
	gfs2_set_iop(inode);

	/* The iput will cause it to be deleted. */
	iput(inode);
	return;

	return 0;
fail_glock:
	gfs2_glock_dq(&ip->i_iopen_gh);
fail_iopen:
@@ -321,7 +324,8 @@ int gfs2_unlinked_inode_lookup(struct super_block *sb, u64 no_addr,
	ip->i_gl->gl_object = NULL;
	gfs2_glock_put(ip->i_gl);
fail:
	return error;
	iget_failed(inode);
	return;
}

static int gfs2_dinode_in(struct gfs2_inode *ip, const void *buf)
+1 −2
Original line number Diff line number Diff line
@@ -84,8 +84,7 @@ static inline void gfs2_inum_out(const struct gfs2_inode *ip,
extern void gfs2_set_iop(struct inode *inode);
extern struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned type, 
				       u64 no_addr, u64 no_formal_ino);
extern int gfs2_unlinked_inode_lookup(struct super_block *sb, u64 no_addr,
				      struct inode **inode);
extern void gfs2_process_unlinked_inode(struct super_block *sb, u64 no_addr);
extern struct inode *gfs2_ilookup(struct super_block *sb, u64 no_addr);

extern int gfs2_inode_refresh(struct gfs2_inode *ip);
+1 −1
Original line number Diff line number Diff line
@@ -696,7 +696,7 @@ static void gfs2_ordered_wait(struct gfs2_sbd *sdp)
 *
 */

void __gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl)
void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl)
{
	struct gfs2_ail *ai;

Loading