diff options
Diffstat (limited to 'fs/coda/inode.c')
-rw-r--r-- | fs/coda/inode.c | 37 |
1 files changed, 20 insertions, 17 deletions
diff --git a/fs/coda/inode.c b/fs/coda/inode.c index f1813120d753..be2aa4909487 100644 --- a/fs/coda/inode.c +++ b/fs/coda/inode.c | |||
@@ -85,6 +85,11 @@ int coda_init_inodecache(void) | |||
85 | 85 | ||
86 | void coda_destroy_inodecache(void) | 86 | void coda_destroy_inodecache(void) |
87 | { | 87 | { |
88 | /* | ||
89 | * Make sure all delayed rcu free inodes are flushed before we | ||
90 | * destroy cache. | ||
91 | */ | ||
92 | rcu_barrier(); | ||
88 | kmem_cache_destroy(coda_inode_cachep); | 93 | kmem_cache_destroy(coda_inode_cachep); |
89 | } | 94 | } |
90 | 95 | ||
@@ -107,43 +112,41 @@ static const struct super_operations coda_super_operations = | |||
107 | 112 | ||
108 | static int get_device_index(struct coda_mount_data *data) | 113 | static int get_device_index(struct coda_mount_data *data) |
109 | { | 114 | { |
110 | struct file *file; | 115 | struct fd f; |
111 | struct inode *inode; | 116 | struct inode *inode; |
112 | int idx; | 117 | int idx; |
113 | 118 | ||
114 | if(data == NULL) { | 119 | if (data == NULL) { |
115 | printk("coda_read_super: Bad mount data\n"); | 120 | printk("coda_read_super: Bad mount data\n"); |
116 | return -1; | 121 | return -1; |
117 | } | 122 | } |
118 | 123 | ||
119 | if(data->version != CODA_MOUNT_VERSION) { | 124 | if (data->version != CODA_MOUNT_VERSION) { |
120 | printk("coda_read_super: Bad mount version\n"); | 125 | printk("coda_read_super: Bad mount version\n"); |
121 | return -1; | 126 | return -1; |
122 | } | 127 | } |
123 | 128 | ||
124 | file = fget(data->fd); | 129 | f = fdget(data->fd); |
125 | inode = NULL; | 130 | if (!f.file) |
126 | if(file) | 131 | goto Ebadf; |
127 | inode = file->f_path.dentry->d_inode; | 132 | inode = f.file->f_path.dentry->d_inode; |
128 | 133 | if (!S_ISCHR(inode->i_mode) || imajor(inode) != CODA_PSDEV_MAJOR) { | |
129 | if(!inode || !S_ISCHR(inode->i_mode) || | 134 | fdput(f); |
130 | imajor(inode) != CODA_PSDEV_MAJOR) { | 135 | goto Ebadf; |
131 | if(file) | ||
132 | fput(file); | ||
133 | |||
134 | printk("coda_read_super: Bad file\n"); | ||
135 | return -1; | ||
136 | } | 136 | } |
137 | 137 | ||
138 | idx = iminor(inode); | 138 | idx = iminor(inode); |
139 | fput(file); | 139 | fdput(f); |
140 | 140 | ||
141 | if(idx < 0 || idx >= MAX_CODADEVS) { | 141 | if (idx < 0 || idx >= MAX_CODADEVS) { |
142 | printk("coda_read_super: Bad minor number\n"); | 142 | printk("coda_read_super: Bad minor number\n"); |
143 | return -1; | 143 | return -1; |
144 | } | 144 | } |
145 | 145 | ||
146 | return idx; | 146 | return idx; |
147 | Ebadf: | ||
148 | printk("coda_read_super: Bad file\n"); | ||
149 | return -1; | ||
147 | } | 150 | } |
148 | 151 | ||
149 | static int coda_fill_super(struct super_block *sb, void *data, int silent) | 152 | static int coda_fill_super(struct super_block *sb, void *data, int silent) |