Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 173182
b: refs/heads/master
c: ac78a07
h: refs/heads/master
v: v3
  • Loading branch information
Frederic Weisbecker committed Oct 14, 2009
1 parent e8bfd2a commit 9e9312f
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 28 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 48f6ba5e691948caba2e7bc362153fb28e4f1e09
refs/heads/master: ac78a07893d24d95ff5f39d0433c25210f224f07
66 changes: 39 additions & 27 deletions trunk/fs/reiserfs/ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,44 +13,52 @@
#include <linux/compat.h>

/*
** reiserfs_ioctl - handler for ioctl for inode
** supported commands:
** 1) REISERFS_IOC_UNPACK - try to unpack tail from direct item into indirect
** and prevent packing file (argument arg has to be non-zero)
** 2) REISERFS_IOC_[GS]ETFLAGS, REISERFS_IOC_[GS]ETVERSION
** 3) That's all for a while ...
*/
* reiserfs_ioctl - handler for ioctl for inode
* supported commands:
* 1) REISERFS_IOC_UNPACK - try to unpack tail from direct item into indirect
* and prevent packing file (argument arg has to be non-zero)
* 2) REISERFS_IOC_[GS]ETFLAGS, REISERFS_IOC_[GS]ETVERSION
* 3) That's all for a while ...
*/
int reiserfs_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
unsigned long arg)
{
unsigned int flags;
int err = 0;

reiserfs_write_lock(inode->i_sb);

switch (cmd) {
case REISERFS_IOC_UNPACK:
if (S_ISREG(inode->i_mode)) {
if (arg)
return reiserfs_unpack(inode, filp);
else
return 0;
err = reiserfs_unpack(inode, filp);
} else
return -ENOTTY;
/* following two cases are taken from fs/ext2/ioctl.c by Remy
Card (card@masi.ibp.fr) */
err = -ENOTTY;
break;
/*
* following two cases are taken from fs/ext2/ioctl.c by Remy
* Card (card@masi.ibp.fr)
*/
case REISERFS_IOC_GETFLAGS:
if (!reiserfs_attrs(inode->i_sb))
return -ENOTTY;
if (!reiserfs_attrs(inode->i_sb)) {
err = -ENOTTY;
break;
}

flags = REISERFS_I(inode)->i_attrs;
i_attrs_to_sd_attrs(inode, (__u16 *) & flags);
return put_user(flags, (int __user *)arg);
err = put_user(flags, (int __user *)arg);
break;
case REISERFS_IOC_SETFLAGS:{
if (!reiserfs_attrs(inode->i_sb))
return -ENOTTY;
if (!reiserfs_attrs(inode->i_sb)) {
err = -ENOTTY;
break;
}

err = mnt_want_write(filp->f_path.mnt);
if (err)
return err;
break;

if (!is_owner_or_cap(inode)) {
err = -EPERM;
Expand Down Expand Up @@ -90,16 +98,18 @@ int reiserfs_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
mark_inode_dirty(inode);
setflags_out:
mnt_drop_write(filp->f_path.mnt);
return err;
break;
}
case REISERFS_IOC_GETVERSION:
return put_user(inode->i_generation, (int __user *)arg);
err = put_user(inode->i_generation, (int __user *)arg);
break;
case REISERFS_IOC_SETVERSION:
if (!is_owner_or_cap(inode))
return -EPERM;
err = -EPERM;
break;
err = mnt_want_write(filp->f_path.mnt);
if (err)
return err;
break;
if (get_user(inode->i_generation, (int __user *)arg)) {
err = -EFAULT;
goto setversion_out;
Expand All @@ -108,10 +118,14 @@ int reiserfs_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
mark_inode_dirty(inode);
setversion_out:
mnt_drop_write(filp->f_path.mnt);
return err;
break;
default:
return -ENOTTY;
err = -ENOTTY;
}

reiserfs_write_unlock(inode->i_sb);

return err;
}

#ifdef CONFIG_COMPAT
Expand Down Expand Up @@ -142,9 +156,7 @@ long reiserfs_compat_ioctl(struct file *file, unsigned int cmd,
return -ENOIOCTLCMD;
}

reiserfs_write_lock(inode->i_sb);
ret = reiserfs_ioctl(inode, file, cmd, (unsigned long) compat_ptr(arg));
reiserfs_write_unlock(inode->i_sb);

return ret;
}
Expand Down

0 comments on commit 9e9312f

Please sign in to comment.