diff options
Diffstat (limited to 'fs/gfs2/ops_file.c')
-rw-r--r-- | fs/gfs2/ops_file.c | 19 |
1 files changed, 19 insertions, 0 deletions
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 | ||
269 | void 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); | ||
341 | out_trans_end: | 360 | out_trans_end: |
342 | gfs2_trans_end(sdp); | 361 | gfs2_trans_end(sdp); |
343 | out: | 362 | out: |