]> err.no Git - linux-2.6/blobdiff - fs/ocfs2/inode.c
Merge git://git.infradead.org/~dwmw2/hdroneline
[linux-2.6] / fs / ocfs2 / inode.c
index 327a5b7b86ed0b0aa39c310d7b6a412ced558262..7bcf69154592ec6a1083c3a840865097f1d1593a 100644 (file)
@@ -71,6 +71,26 @@ static int ocfs2_truncate_for_delete(struct ocfs2_super *osb,
                                    struct inode *inode,
                                    struct buffer_head *fe_bh);
 
+void ocfs2_set_inode_flags(struct inode *inode)
+{
+       unsigned int flags = OCFS2_I(inode)->ip_attr;
+
+       inode->i_flags &= ~(S_IMMUTABLE |
+               S_SYNC | S_APPEND | S_NOATIME | S_DIRSYNC);
+
+       if (flags & OCFS2_IMMUTABLE_FL)
+               inode->i_flags |= S_IMMUTABLE;
+
+       if (flags & OCFS2_SYNC_FL)
+               inode->i_flags |= S_SYNC;
+       if (flags & OCFS2_APPEND_FL)
+               inode->i_flags |= S_APPEND;
+       if (flags & OCFS2_NOATIME_FL)
+               inode->i_flags |= S_NOATIME;
+       if (flags & OCFS2_DIRSYNC_FL)
+               inode->i_flags |= S_DIRSYNC;
+}
+
 struct inode *ocfs2_ilookup_for_vote(struct ocfs2_super *osb,
                                     u64 blkno,
                                     int delete_vote)
@@ -260,7 +280,6 @@ int ocfs2_populate_inode(struct inode *inode, struct ocfs2_dinode *fe,
                inode->i_blocks =
                        ocfs2_align_bytes_to_sectors(le64_to_cpu(fe->i_size));
        inode->i_mapping->a_ops = &ocfs2_aops;
-       inode->i_flags |= S_NOATIME;
        inode->i_atime.tv_sec = le64_to_cpu(fe->i_atime);
        inode->i_atime.tv_nsec = le32_to_cpu(fe->i_atime_nsec);
        inode->i_mtime.tv_sec = le64_to_cpu(fe->i_mtime);
@@ -276,6 +295,7 @@ int ocfs2_populate_inode(struct inode *inode, struct ocfs2_dinode *fe,
 
        OCFS2_I(inode)->ip_clusters = le32_to_cpu(fe->i_clusters);
        OCFS2_I(inode)->ip_orphaned_slot = OCFS2_INVALID_SLOT;
+       OCFS2_I(inode)->ip_attr = le32_to_cpu(fe->i_attr);
 
        if (create_ino)
                inode->i_ino = ino_from_blkno(inode->i_sb,
@@ -330,6 +350,9 @@ int ocfs2_populate_inode(struct inode *inode, struct ocfs2_dinode *fe,
        ocfs2_inode_lock_res_init(&OCFS2_I(inode)->ip_data_lockres,
                                  OCFS2_LOCK_TYPE_DATA, inode);
 
+       ocfs2_set_inode_flags(inode);
+       inode->i_flags |= S_NOATIME;
+
        status = 0;
 bail:
        mlog_exit(status);
@@ -1027,12 +1050,8 @@ struct buffer_head *ocfs2_bread(struct inode *inode,
        u64 p_blkno;
        int readflags = OCFS2_BH_CACHED;
 
-#if 0
-       /* only turn this on if we know we can deal with read_block
-        * returning nothing */
        if (reada)
                readflags |= OCFS2_BH_READAHEAD;
-#endif
 
        if (((u64)block << inode->i_sb->s_blocksize_bits) >=
            i_size_read(inode)) {
@@ -1131,6 +1150,7 @@ int ocfs2_mark_inode_dirty(struct ocfs2_journal_handle *handle,
 
        spin_lock(&OCFS2_I(inode)->ip_lock);
        fe->i_clusters = cpu_to_le32(OCFS2_I(inode)->ip_clusters);
+       fe->i_attr = cpu_to_le32(OCFS2_I(inode)->ip_attr);
        spin_unlock(&OCFS2_I(inode)->ip_lock);
 
        fe->i_size = cpu_to_le64(i_size_read(inode));
@@ -1169,6 +1189,8 @@ void ocfs2_refresh_inode(struct inode *inode,
        spin_lock(&OCFS2_I(inode)->ip_lock);
 
        OCFS2_I(inode)->ip_clusters = le32_to_cpu(fe->i_clusters);
+       OCFS2_I(inode)->ip_attr = le32_to_cpu(fe->i_attr);
+       ocfs2_set_inode_flags(inode);
        i_size_write(inode, le64_to_cpu(fe->i_size));
        inode->i_nlink = le16_to_cpu(fe->i_links_count);
        inode->i_uid = le32_to_cpu(fe->i_uid);