[CIFS] Fix minor merge conflict in fs/cifs/dir.c
[pandora-kernel.git] / fs / cifs / cifsfs.c
index 3936aa7..5abfeda 100644 (file)
@@ -283,10 +283,13 @@ cifs_statfs(struct dentry *dentry, struct kstatfs *buf)
        return 0;
 }
 
-static int cifs_permission(struct inode *inode, int mask)
+static int cifs_permission(struct inode *inode, int mask, unsigned int flags)
 {
        struct cifs_sb_info *cifs_sb;
 
+       if (flags & IPERM_FLAG_RCU)
+               return -ECHILD;
+
        cifs_sb = CIFS_SB(inode->i_sb);
 
        if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM) {
@@ -298,7 +301,7 @@ static int cifs_permission(struct inode *inode, int mask)
                on the client (above and beyond ACL on servers) for
                servers which do not support setting and viewing mode bits,
                so allowing client to check permissions is useful */
-               return generic_permission(inode, mask, NULL);
+               return generic_permission(inode, mask, flags, NULL);
 }
 
 static struct kmem_cache *cifs_inode_cachep;
@@ -334,10 +337,17 @@ cifs_alloc_inode(struct super_block *sb)
        return &cifs_inode->vfs_inode;
 }
 
+static void cifs_i_callback(struct rcu_head *head)
+{
+       struct inode *inode = container_of(head, struct inode, i_rcu);
+       INIT_LIST_HEAD(&inode->i_dentry);
+       kmem_cache_free(cifs_inode_cachep, CIFS_I(inode));
+}
+
 static void
 cifs_destroy_inode(struct inode *inode)
 {
-       kmem_cache_free(cifs_inode_cachep, CIFS_I(inode));
+       call_rcu(&inode->i_rcu, cifs_i_callback);
 }
 
 static void
@@ -351,18 +361,19 @@ cifs_evict_inode(struct inode *inode)
 static void
 cifs_show_address(struct seq_file *s, struct TCP_Server_Info *server)
 {
+       struct sockaddr_in *sa = (struct sockaddr_in *) &server->dstaddr;
+       struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *) &server->dstaddr;
+
        seq_printf(s, ",addr=");
 
-       switch (server->addr.sockAddr.sin_family) {
+       switch (server->dstaddr.ss_family) {
        case AF_INET:
-               seq_printf(s, "%pI4", &server->addr.sockAddr.sin_addr.s_addr);
+               seq_printf(s, "%pI4", &sa->sin_addr.s_addr);
                break;
        case AF_INET6:
-               seq_printf(s, "%pI6",
-                          &server->addr.sockAddr6.sin6_addr.s6_addr);
-               if (server->addr.sockAddr6.sin6_scope_id)
-                       seq_printf(s, "%%%u",
-                                  server->addr.sockAddr6.sin6_scope_id);
+               seq_printf(s, "%pI6", &sa6->sin6_addr.s6_addr);
+               if (sa6->sin6_scope_id)
+                       seq_printf(s, "%%%u", sa6->sin6_scope_id);
                break;
        default:
                seq_printf(s, "(unknown)");