-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Support immutable, and other attributes. Some renaming and other minor fixes done by myself. Signed-off-by: Herbert Poetzl <herbert@13thfloor.at> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
- Loading branch information
Herbert Poetzl
authored and
Mark Fasheh
committed
Sep 20, 2006
1 parent
b4c98f6
commit ca4d147
Showing
9 changed files
with
217 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -16,6 +16,7 @@ ocfs2-objs := \ | |
file.o \ | ||
heartbeat.o \ | ||
inode.o \ | ||
ioctl.o \ | ||
journal.o \ | ||
localalloc.o \ | ||
mmap.o \ | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,134 @@ | ||
/* | ||
* linux/fs/ocfs2/ioctl.c | ||
* | ||
* Copyright (C) 2006 Herbert Poetzl | ||
* adapted from Remy Card's ext2/ioctl.c | ||
*/ | ||
|
||
#include <linux/fs.h> | ||
#include <linux/mount.h> | ||
|
||
#define MLOG_MASK_PREFIX ML_INODE | ||
#include <cluster/masklog.h> | ||
|
||
#include "ocfs2.h" | ||
#include "alloc.h" | ||
#include "dlmglue.h" | ||
#include "inode.h" | ||
#include "journal.h" | ||
|
||
#include "ocfs2_fs.h" | ||
#include <linux/ext2_fs.h> | ||
|
||
static int ocfs2_get_inode_attr(struct inode *inode, unsigned *flags) | ||
{ | ||
int status; | ||
|
||
status = ocfs2_meta_lock(inode, NULL, NULL, 0); | ||
if (status < 0) { | ||
mlog_errno(status); | ||
return status; | ||
} | ||
*flags = OCFS2_I(inode)->ip_attr; | ||
ocfs2_meta_unlock(inode, 0); | ||
|
||
mlog_exit(status); | ||
return status; | ||
} | ||
|
||
static int ocfs2_set_inode_attr(struct inode *inode, unsigned flags, | ||
unsigned mask) | ||
{ | ||
struct ocfs2_inode_info *ocfs2_inode = OCFS2_I(inode); | ||
struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); | ||
struct ocfs2_journal_handle *handle = NULL; | ||
struct buffer_head *bh = NULL; | ||
unsigned oldflags; | ||
int status; | ||
|
||
mutex_lock(&inode->i_mutex); | ||
|
||
status = ocfs2_meta_lock(inode, NULL, &bh, 1); | ||
if (status < 0) { | ||
mlog_errno(status); | ||
goto bail; | ||
} | ||
|
||
status = -EROFS; | ||
if (IS_RDONLY(inode)) | ||
goto bail_unlock; | ||
|
||
status = -EACCES; | ||
if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER)) | ||
goto bail_unlock; | ||
|
||
if (!S_ISDIR(inode->i_mode)) | ||
flags &= ~OCFS2_DIRSYNC_FL; | ||
|
||
handle = ocfs2_start_trans(osb, NULL, OCFS2_INODE_UPDATE_CREDITS); | ||
if (IS_ERR(handle)) { | ||
status = PTR_ERR(handle); | ||
mlog_errno(status); | ||
goto bail_unlock; | ||
} | ||
|
||
oldflags = ocfs2_inode->ip_attr; | ||
flags = flags & mask; | ||
flags |= oldflags & ~mask; | ||
|
||
/* | ||
* The IMMUTABLE and APPEND_ONLY flags can only be changed by | ||
* the relevant capability. | ||
*/ | ||
status = -EPERM; | ||
if ((oldflags & OCFS2_IMMUTABLE_FL) || ((flags ^ oldflags) & | ||
(OCFS2_APPEND_FL | OCFS2_IMMUTABLE_FL))) { | ||
if (!capable(CAP_LINUX_IMMUTABLE)) | ||
goto bail_unlock; | ||
} | ||
|
||
ocfs2_inode->ip_attr = flags; | ||
ocfs2_set_inode_flags(inode); | ||
|
||
status = ocfs2_mark_inode_dirty(handle, inode, bh); | ||
if (status < 0) | ||
mlog_errno(status); | ||
|
||
ocfs2_commit_trans(handle); | ||
bail_unlock: | ||
ocfs2_meta_unlock(inode, 1); | ||
bail: | ||
mutex_unlock(&inode->i_mutex); | ||
|
||
if (bh) | ||
brelse(bh); | ||
|
||
mlog_exit(status); | ||
return status; | ||
} | ||
|
||
int ocfs2_ioctl(struct inode * inode, struct file * filp, | ||
unsigned int cmd, unsigned long arg) | ||
{ | ||
unsigned int flags; | ||
int status; | ||
|
||
switch (cmd) { | ||
case OCFS2_IOC_GETFLAGS: | ||
status = ocfs2_get_inode_attr(inode, &flags); | ||
if (status < 0) | ||
return status; | ||
|
||
flags &= OCFS2_FL_VISIBLE; | ||
return put_user(flags, (int __user *) arg); | ||
case OCFS2_IOC_SETFLAGS: | ||
if (get_user(flags, (int __user *) arg)) | ||
return -EFAULT; | ||
|
||
return ocfs2_set_inode_attr(inode, flags, | ||
OCFS2_FL_MODIFIABLE); | ||
default: | ||
return -ENOTTY; | ||
} | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
/* | ||
* ioctl.h | ||
* | ||
* Function prototypes | ||
* | ||
* Copyright (C) 2006 Herbert Poetzl | ||
* | ||
*/ | ||
|
||
#ifndef OCFS2_IOCTL_H | ||
#define OCFS2_IOCTL_H | ||
|
||
int ocfs2_ioctl(struct inode * inode, struct file * filp, | ||
unsigned int cmd, unsigned long arg); | ||
|
||
#endif /* OCFS2_IOCTL_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters