[PATCH] Copy i_flags to ocfs2 inode flags on write
Propagate flags such as S_APPEND, S_IMMUTABLE, etc. from i_flags into ocfs2-specific ip_attr. Hence, when someone sets these flags via a different interface than ioctl, they are stored correctly. Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
This commit is contained in:
parent
5c2c9d383e
commit
6e4b0d5692
|
@ -89,6 +89,25 @@ void ocfs2_set_inode_flags(struct inode *inode)
|
||||||
inode->i_flags |= S_DIRSYNC;
|
inode->i_flags |= S_DIRSYNC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Propagate flags from i_flags to OCFS2_I(inode)->ip_attr */
|
||||||
|
void ocfs2_get_inode_flags(struct ocfs2_inode_info *oi)
|
||||||
|
{
|
||||||
|
unsigned int flags = oi->vfs_inode.i_flags;
|
||||||
|
|
||||||
|
oi->ip_attr &= ~(OCFS2_SYNC_FL|OCFS2_APPEND_FL|
|
||||||
|
OCFS2_IMMUTABLE_FL|OCFS2_NOATIME_FL|OCFS2_DIRSYNC_FL);
|
||||||
|
if (flags & S_SYNC)
|
||||||
|
oi->ip_attr |= OCFS2_SYNC_FL;
|
||||||
|
if (flags & S_APPEND)
|
||||||
|
oi->ip_attr |= OCFS2_APPEND_FL;
|
||||||
|
if (flags & S_IMMUTABLE)
|
||||||
|
oi->ip_attr |= OCFS2_IMMUTABLE_FL;
|
||||||
|
if (flags & S_NOATIME)
|
||||||
|
oi->ip_attr |= OCFS2_NOATIME_FL;
|
||||||
|
if (flags & S_DIRSYNC)
|
||||||
|
oi->ip_attr |= OCFS2_DIRSYNC_FL;
|
||||||
|
}
|
||||||
|
|
||||||
struct inode *ocfs2_iget(struct ocfs2_super *osb, u64 blkno, int flags)
|
struct inode *ocfs2_iget(struct ocfs2_super *osb, u64 blkno, int flags)
|
||||||
{
|
{
|
||||||
struct inode *inode = NULL;
|
struct inode *inode = NULL;
|
||||||
|
@ -1199,6 +1218,7 @@ int ocfs2_mark_inode_dirty(handle_t *handle,
|
||||||
|
|
||||||
spin_lock(&OCFS2_I(inode)->ip_lock);
|
spin_lock(&OCFS2_I(inode)->ip_lock);
|
||||||
fe->i_clusters = cpu_to_le32(OCFS2_I(inode)->ip_clusters);
|
fe->i_clusters = cpu_to_le32(OCFS2_I(inode)->ip_clusters);
|
||||||
|
ocfs2_get_inode_flags(OCFS2_I(inode));
|
||||||
fe->i_attr = cpu_to_le32(OCFS2_I(inode)->ip_attr);
|
fe->i_attr = cpu_to_le32(OCFS2_I(inode)->ip_attr);
|
||||||
spin_unlock(&OCFS2_I(inode)->ip_lock);
|
spin_unlock(&OCFS2_I(inode)->ip_lock);
|
||||||
|
|
||||||
|
|
|
@ -141,6 +141,7 @@ int ocfs2_aio_read(struct file *file, struct kiocb *req, struct iocb *iocb);
|
||||||
int ocfs2_aio_write(struct file *file, struct kiocb *req, struct iocb *iocb);
|
int ocfs2_aio_write(struct file *file, struct kiocb *req, struct iocb *iocb);
|
||||||
|
|
||||||
void ocfs2_set_inode_flags(struct inode *inode);
|
void ocfs2_set_inode_flags(struct inode *inode);
|
||||||
|
void ocfs2_get_inode_flags(struct ocfs2_inode_info *oi);
|
||||||
|
|
||||||
static inline blkcnt_t ocfs2_inode_sector_count(struct inode *inode)
|
static inline blkcnt_t ocfs2_inode_sector_count(struct inode *inode)
|
||||||
{
|
{
|
||||||
|
|
|
@ -31,6 +31,7 @@ static int ocfs2_get_inode_attr(struct inode *inode, unsigned *flags)
|
||||||
mlog_errno(status);
|
mlog_errno(status);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
ocfs2_get_inode_flags(OCFS2_I(inode));
|
||||||
*flags = OCFS2_I(inode)->ip_attr;
|
*flags = OCFS2_I(inode)->ip_attr;
|
||||||
ocfs2_meta_unlock(inode, 0);
|
ocfs2_meta_unlock(inode, 0);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue