| 1 | --- a/fs/overlayfs/overlayfs.c |
| 2 | +++ b/fs/overlayfs/overlayfs.c |
| 3 | @@ -28,13 +28,8 @@ struct ovl_fs { |
| 4 | struct ovl_entry { |
| 5 | struct dentry *__upperdentry; |
| 6 | struct dentry *lowerdentry; |
| 7 | - union { |
| 8 | - struct { |
| 9 | - u64 version; |
| 10 | - bool opaque; |
| 11 | - }; |
| 12 | - struct rcu_head rcu; |
| 13 | - }; |
| 14 | + u64 version; |
| 15 | + bool opaque; |
| 16 | }; |
| 17 | |
| 18 | static const char *ovl_whiteout_xattr = "trusted.overlay.whiteout"; |
| 19 | @@ -632,12 +627,6 @@ static const struct file_operations ovl_ |
| 20 | |
| 21 | static const struct inode_operations ovl_dir_inode_operations; |
| 22 | |
| 23 | -static void ovl_entry_free(struct rcu_head *head) |
| 24 | -{ |
| 25 | - struct ovl_entry *oe = container_of(head, struct ovl_entry, rcu); |
| 26 | - kfree(oe); |
| 27 | -} |
| 28 | - |
| 29 | static void ovl_dentry_release(struct dentry *dentry) |
| 30 | { |
| 31 | struct ovl_entry *oe = dentry->d_fsdata; |
| 32 | @@ -645,7 +634,7 @@ static void ovl_dentry_release(struct de |
| 33 | if (oe) { |
| 34 | dput(oe->__upperdentry); |
| 35 | dput(oe->lowerdentry); |
| 36 | - call_rcu(&oe->rcu, ovl_entry_free); |
| 37 | + kfree(oe); |
| 38 | } |
| 39 | } |
| 40 | |
| 41 | @@ -1338,7 +1327,7 @@ static int ovl_dir_getattr(struct vfsmou |
| 42 | return 0; |
| 43 | } |
| 44 | |
| 45 | -static int ovl_permission(struct inode *inode, int mask, unsigned int flags) |
| 46 | +static int ovl_permission(struct inode *inode, int mask) |
| 47 | { |
| 48 | struct ovl_entry *oe; |
| 49 | struct dentry *alias = NULL; |
| 50 | @@ -1349,8 +1338,6 @@ static int ovl_permission(struct inode * |
| 51 | |
| 52 | if (S_ISDIR(inode->i_mode)) { |
| 53 | oe = inode->i_private; |
| 54 | - } else if (flags & IPERM_FLAG_RCU) { |
| 55 | - return -ECHILD; |
| 56 | } else { |
| 57 | /* |
| 58 | * For non-directories find an alias and get the info |
| 59 | @@ -1377,7 +1364,6 @@ static int ovl_permission(struct inode * |
| 60 | /* Careful in RCU walk mode */ |
| 61 | realinode = ACCESS_ONCE(realdentry->d_inode); |
| 62 | if (!realinode) { |
| 63 | - WARN_ON(!(flags & IPERM_FLAG_RCU)); |
| 64 | return -ENOENT; |
| 65 | } |
| 66 | |
| 67 | @@ -1402,9 +1388,9 @@ static int ovl_permission(struct inode * |
| 68 | } |
| 69 | |
| 70 | if (realinode->i_op->permission) |
| 71 | - err = realinode->i_op->permission(realinode, mask, flags); |
| 72 | + err = realinode->i_op->permission(realinode, mask); |
| 73 | else |
| 74 | - err = generic_permission(realinode, mask, flags, |
| 75 | + err = generic_permission(realinode, mask, |
| 76 | realinode->i_op->check_acl); |
| 77 | out_dput: |
| 78 | dput(alias); |
| 79 | |