aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/gfs2/inode.c11
-rw-r--r--fs/gfs2/ops_file.c19
-rw-r--r--fs/gfs2/ops_file.h2
3 files changed, 21 insertions, 11 deletions
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index faf9b9ed791d..56b39be76925 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -54,16 +54,6 @@ void gfs2_inode_attr_in(struct gfs2_inode *ip)
54 i_size_write(inode, di->di_size); 54 i_size_write(inode, di->di_size);
55 inode->i_blocks = di->di_blocks << 55 inode->i_blocks = di->di_blocks <<
56 (GFS2_SB(inode)->sd_sb.sb_bsize_shift - GFS2_BASIC_BLOCK_SHIFT); 56 (GFS2_SB(inode)->sd_sb.sb_bsize_shift - GFS2_BASIC_BLOCK_SHIFT);
57
58 if (di->di_flags & GFS2_DIF_IMMUTABLE)
59 inode->i_flags |= S_IMMUTABLE;
60 else
61 inode->i_flags &= ~S_IMMUTABLE;
62
63 if (di->di_flags & GFS2_DIF_APPENDONLY)
64 inode->i_flags |= S_APPEND;
65 else
66 inode->i_flags &= ~S_APPEND;
67} 57}
68 58
69static int iget_test(struct inode *inode, void *opaque) 59static int iget_test(struct inode *inode, void *opaque)
@@ -210,6 +200,7 @@ static int gfs2_dinode_in(struct gfs2_inode *ip, const void *buf)
210 di->di_generation = be64_to_cpu(str->di_generation); 200 di->di_generation = be64_to_cpu(str->di_generation);
211 201
212 di->di_flags = be32_to_cpu(str->di_flags); 202 di->di_flags = be32_to_cpu(str->di_flags);
203 gfs2_set_inode_flags(&ip->i_inode);
213 di->di_height = be16_to_cpu(str->di_height); 204 di->di_height = be16_to_cpu(str->di_height);
214 205
215 di->di_depth = be16_to_cpu(str->di_depth); 206 di->di_depth = be16_to_cpu(str->di_depth);
diff --git a/fs/gfs2/ops_file.c b/fs/gfs2/ops_file.c
index b52b9db1a2bd..eabf6c61a96a 100644
--- a/fs/gfs2/ops_file.c
+++ b/fs/gfs2/ops_file.c
@@ -266,6 +266,24 @@ static int gfs2_get_flags(struct file *filp, u32 __user *ptr)
266 return error; 266 return error;
267} 267}
268 268
269void gfs2_set_inode_flags(struct inode *inode)
270{
271 struct gfs2_inode *ip = GFS2_I(inode);
272 struct gfs2_dinode_host *di = &ip->i_di;
273 unsigned int flags = inode->i_flags;
274
275 flags &= ~(S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC);
276 if (di->di_flags & GFS2_DIF_IMMUTABLE)
277 flags |= S_IMMUTABLE;
278 if (di->di_flags & GFS2_DIF_APPENDONLY)
279 flags |= S_APPEND;
280 if (di->di_flags & GFS2_DIF_NOATIME)
281 flags |= S_NOATIME;
282 if (di->di_flags & GFS2_DIF_SYNC)
283 flags |= S_SYNC;
284 inode->i_flags = flags;
285}
286
269/* Flags that can be set by user space */ 287/* Flags that can be set by user space */
270#define GFS2_FLAGS_USER_SET (GFS2_DIF_JDATA| \ 288#define GFS2_FLAGS_USER_SET (GFS2_DIF_JDATA| \
271 GFS2_DIF_DIRECTIO| \ 289 GFS2_DIF_DIRECTIO| \
@@ -338,6 +356,7 @@ static int do_gfs2_set_flags(struct file *filp, u32 reqflags, u32 mask)
338 ip->i_di.di_flags = new_flags; 356 ip->i_di.di_flags = new_flags;
339 gfs2_dinode_out(ip, bh->b_data); 357 gfs2_dinode_out(ip, bh->b_data);
340 brelse(bh); 358 brelse(bh);
359 gfs2_set_inode_flags(inode);
341out_trans_end: 360out_trans_end:
342 gfs2_trans_end(sdp); 361 gfs2_trans_end(sdp);
343out: 362out:
diff --git a/fs/gfs2/ops_file.h b/fs/gfs2/ops_file.h
index ce319f89ec8e..7e5d8ec9c846 100644
--- a/fs/gfs2/ops_file.h
+++ b/fs/gfs2/ops_file.h
@@ -17,7 +17,7 @@ extern struct file gfs2_internal_file_sentinel;
17extern int gfs2_internal_read(struct gfs2_inode *ip, 17extern int gfs2_internal_read(struct gfs2_inode *ip,
18 struct file_ra_state *ra_state, 18 struct file_ra_state *ra_state,
19 char *buf, loff_t *pos, unsigned size); 19 char *buf, loff_t *pos, unsigned size);
20 20extern void gfs2_set_inode_flags(struct inode *inode);
21extern const struct file_operations gfs2_file_fops; 21extern const struct file_operations gfs2_file_fops;
22extern const struct file_operations gfs2_dir_fops; 22extern const struct file_operations gfs2_dir_fops;
23 23