diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/ceph/dir.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index ea36ba9960d3..f94ed3c7f6a5 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c | |||
| @@ -1014,18 +1014,22 @@ out_touch: | |||
| 1014 | 1014 | ||
| 1015 | /* | 1015 | /* |
| 1016 | * When a dentry is released, clear the dir I_COMPLETE if it was part | 1016 | * When a dentry is released, clear the dir I_COMPLETE if it was part |
| 1017 | * of the current dir gen. | 1017 | * of the current dir gen or if this is in the snapshot namespace. |
| 1018 | */ | 1018 | */ |
| 1019 | static void ceph_dentry_release(struct dentry *dentry) | 1019 | static void ceph_dentry_release(struct dentry *dentry) |
| 1020 | { | 1020 | { |
| 1021 | struct ceph_dentry_info *di = ceph_dentry(dentry); | 1021 | struct ceph_dentry_info *di = ceph_dentry(dentry); |
| 1022 | struct inode *parent_inode = dentry->d_parent->d_inode; | 1022 | struct inode *parent_inode = dentry->d_parent->d_inode; |
| 1023 | u64 snapid = ceph_snap(parent_inode); | ||
| 1023 | 1024 | ||
| 1024 | if (parent_inode) { | 1025 | dout("dentry_release %p parent %p\n", dentry, parent_inode); |
| 1026 | |||
| 1027 | if (parent_inode && snapid != CEPH_SNAPDIR) { | ||
| 1025 | struct ceph_inode_info *ci = ceph_inode(parent_inode); | 1028 | struct ceph_inode_info *ci = ceph_inode(parent_inode); |
| 1026 | 1029 | ||
| 1027 | spin_lock(&parent_inode->i_lock); | 1030 | spin_lock(&parent_inode->i_lock); |
| 1028 | if (ci->i_shared_gen == di->lease_shared_gen) { | 1031 | if (ci->i_shared_gen == di->lease_shared_gen || |
| 1032 | snapid <= CEPH_MAXSNAP) { | ||
| 1029 | dout(" clearing %p complete (d_release)\n", | 1033 | dout(" clearing %p complete (d_release)\n", |
| 1030 | parent_inode); | 1034 | parent_inode); |
| 1031 | ci->i_ceph_flags &= ~CEPH_I_COMPLETE; | 1035 | ci->i_ceph_flags &= ~CEPH_I_COMPLETE; |
| @@ -1242,7 +1246,9 @@ struct dentry_operations ceph_dentry_ops = { | |||
| 1242 | 1246 | ||
| 1243 | struct dentry_operations ceph_snapdir_dentry_ops = { | 1247 | struct dentry_operations ceph_snapdir_dentry_ops = { |
| 1244 | .d_revalidate = ceph_snapdir_d_revalidate, | 1248 | .d_revalidate = ceph_snapdir_d_revalidate, |
| 1249 | .d_release = ceph_dentry_release, | ||
| 1245 | }; | 1250 | }; |
| 1246 | 1251 | ||
| 1247 | struct dentry_operations ceph_snap_dentry_ops = { | 1252 | struct dentry_operations ceph_snap_dentry_ops = { |
| 1253 | .d_release = ceph_dentry_release, | ||
| 1248 | }; | 1254 | }; |
