aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/ufs/namei.c54
1 files changed, 14 insertions, 40 deletions
diff --git a/fs/ufs/namei.c b/fs/ufs/namei.c
index 60ee32249b72..3429079c11e2 100644
--- a/fs/ufs/namei.c
+++ b/fs/ufs/namei.c
@@ -56,11 +56,9 @@ static struct dentry *ufs_lookup(struct inode * dir, struct dentry *dentry, unsi
56 if (dentry->d_name.len > UFS_MAXNAMLEN) 56 if (dentry->d_name.len > UFS_MAXNAMLEN)
57 return ERR_PTR(-ENAMETOOLONG); 57 return ERR_PTR(-ENAMETOOLONG);
58 58
59 lock_ufs(dir->i_sb);
60 ino = ufs_inode_by_name(dir, &dentry->d_name); 59 ino = ufs_inode_by_name(dir, &dentry->d_name);
61 if (ino) 60 if (ino)
62 inode = ufs_iget(dir->i_sb, ino); 61 inode = ufs_iget(dir->i_sb, ino);
63 unlock_ufs(dir->i_sb);
64 return d_splice_alias(inode, dentry); 62 return d_splice_alias(inode, dentry);
65} 63}
66 64
@@ -76,24 +74,16 @@ static int ufs_create (struct inode * dir, struct dentry * dentry, umode_t mode,
76 bool excl) 74 bool excl)
77{ 75{
78 struct inode *inode; 76 struct inode *inode;
79 int err;
80
81 UFSD("BEGIN\n");
82 77
83 inode = ufs_new_inode(dir, mode); 78 inode = ufs_new_inode(dir, mode);
84 err = PTR_ERR(inode); 79 if (IS_ERR(inode))
80 return PTR_ERR(inode);
85 81
86 if (!IS_ERR(inode)) { 82 inode->i_op = &ufs_file_inode_operations;
87 inode->i_op = &ufs_file_inode_operations; 83 inode->i_fop = &ufs_file_operations;
88 inode->i_fop = &ufs_file_operations; 84 inode->i_mapping->a_ops = &ufs_aops;
89 inode->i_mapping->a_ops = &ufs_aops; 85 mark_inode_dirty(inode);
90 mark_inode_dirty(inode); 86 return ufs_add_nondir(dentry, inode);
91 lock_ufs(dir->i_sb);
92 err = ufs_add_nondir(dentry, inode);
93 unlock_ufs(dir->i_sb);
94 }
95 UFSD("END: err=%d\n", err);
96 return err;
97} 87}
98 88
99static int ufs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t rdev) 89static int ufs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t rdev)
@@ -110,9 +100,7 @@ static int ufs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev
110 init_special_inode(inode, mode, rdev); 100 init_special_inode(inode, mode, rdev);
111 ufs_set_inode_dev(inode->i_sb, UFS_I(inode), rdev); 101 ufs_set_inode_dev(inode->i_sb, UFS_I(inode), rdev);
112 mark_inode_dirty(inode); 102 mark_inode_dirty(inode);
113 lock_ufs(dir->i_sb);
114 err = ufs_add_nondir(dentry, inode); 103 err = ufs_add_nondir(dentry, inode);
115 unlock_ufs(dir->i_sb);
116 } 104 }
117 return err; 105 return err;
118} 106}
@@ -121,18 +109,17 @@ static int ufs_symlink (struct inode * dir, struct dentry * dentry,
121 const char * symname) 109 const char * symname)
122{ 110{
123 struct super_block * sb = dir->i_sb; 111 struct super_block * sb = dir->i_sb;
124 int err = -ENAMETOOLONG; 112 int err;
125 unsigned l = strlen(symname)+1; 113 unsigned l = strlen(symname)+1;
126 struct inode * inode; 114 struct inode * inode;
127 115
128 if (l > sb->s_blocksize) 116 if (l > sb->s_blocksize)
129 goto out_notlocked; 117 return -ENAMETOOLONG;
130 118
131 lock_ufs(dir->i_sb);
132 inode = ufs_new_inode(dir, S_IFLNK | S_IRWXUGO); 119 inode = ufs_new_inode(dir, S_IFLNK | S_IRWXUGO);
133 err = PTR_ERR(inode); 120 err = PTR_ERR(inode);
134 if (IS_ERR(inode)) 121 if (IS_ERR(inode))
135 goto out; 122 return err;
136 123
137 if (l > UFS_SB(sb)->s_uspi->s_maxsymlinklen) { 124 if (l > UFS_SB(sb)->s_uspi->s_maxsymlinklen) {
138 /* slow symlink */ 125 /* slow symlink */
@@ -149,17 +136,13 @@ static int ufs_symlink (struct inode * dir, struct dentry * dentry,
149 } 136 }
150 mark_inode_dirty(inode); 137 mark_inode_dirty(inode);
151 138
152 err = ufs_add_nondir(dentry, inode); 139 return ufs_add_nondir(dentry, inode);
153out:
154 unlock_ufs(dir->i_sb);
155out_notlocked:
156 return err;
157 140
158out_fail: 141out_fail:
159 inode_dec_link_count(inode); 142 inode_dec_link_count(inode);
160 unlock_new_inode(inode); 143 unlock_new_inode(inode);
161 iput(inode); 144 iput(inode);
162 goto out; 145 return err;
163} 146}
164 147
165static int ufs_link (struct dentry * old_dentry, struct inode * dir, 148static int ufs_link (struct dentry * old_dentry, struct inode * dir,
@@ -168,8 +151,6 @@ static int ufs_link (struct dentry * old_dentry, struct inode * dir,
168 struct inode *inode = d_inode(old_dentry); 151 struct inode *inode = d_inode(old_dentry);
169 int error; 152 int error;
170 153
171 lock_ufs(dir->i_sb);
172
173 inode->i_ctime = CURRENT_TIME_SEC; 154 inode->i_ctime = CURRENT_TIME_SEC;
174 inode_inc_link_count(inode); 155 inode_inc_link_count(inode);
175 ihold(inode); 156 ihold(inode);
@@ -180,7 +161,6 @@ static int ufs_link (struct dentry * old_dentry, struct inode * dir,
180 iput(inode); 161 iput(inode);
181 } else 162 } else
182 d_instantiate(dentry, inode); 163 d_instantiate(dentry, inode);
183 unlock_ufs(dir->i_sb);
184 return error; 164 return error;
185} 165}
186 166
@@ -189,7 +169,6 @@ static int ufs_mkdir(struct inode * dir, struct dentry * dentry, umode_t mode)
189 struct inode * inode; 169 struct inode * inode;
190 int err; 170 int err;
191 171
192 lock_ufs(dir->i_sb);
193 inode_inc_link_count(dir); 172 inode_inc_link_count(dir);
194 173
195 inode = ufs_new_inode(dir, S_IFDIR|mode); 174 inode = ufs_new_inode(dir, S_IFDIR|mode);
@@ -210,12 +189,10 @@ static int ufs_mkdir(struct inode * dir, struct dentry * dentry, umode_t mode)
210 err = ufs_add_link(dentry, inode); 189 err = ufs_add_link(dentry, inode);
211 if (err) 190 if (err)
212 goto out_fail; 191 goto out_fail;
213 unlock_ufs(dir->i_sb);
214 192
215 unlock_new_inode(inode); 193 unlock_new_inode(inode);
216 d_instantiate(dentry, inode); 194 d_instantiate(dentry, inode);
217out: 195 return 0;
218 return err;
219 196
220out_fail: 197out_fail:
221 inode_dec_link_count(inode); 198 inode_dec_link_count(inode);
@@ -224,8 +201,7 @@ out_fail:
224 iput (inode); 201 iput (inode);
225out_dir: 202out_dir:
226 inode_dec_link_count(dir); 203 inode_dec_link_count(dir);
227 unlock_ufs(dir->i_sb); 204 return err;
228 goto out;
229} 205}
230 206
231static int ufs_unlink(struct inode *dir, struct dentry *dentry) 207static int ufs_unlink(struct inode *dir, struct dentry *dentry)
@@ -255,7 +231,6 @@ static int ufs_rmdir (struct inode * dir, struct dentry *dentry)
255 struct inode * inode = d_inode(dentry); 231 struct inode * inode = d_inode(dentry);
256 int err= -ENOTEMPTY; 232 int err= -ENOTEMPTY;
257 233
258 lock_ufs(dir->i_sb);
259 if (ufs_empty_dir (inode)) { 234 if (ufs_empty_dir (inode)) {
260 err = ufs_unlink(dir, dentry); 235 err = ufs_unlink(dir, dentry);
261 if (!err) { 236 if (!err) {
@@ -264,7 +239,6 @@ static int ufs_rmdir (struct inode * dir, struct dentry *dentry)
264 inode_dec_link_count(dir); 239 inode_dec_link_count(dir);
265 } 240 }
266 } 241 }
267 unlock_ufs(dir->i_sb);
268 return err; 242 return err;
269} 243}
270 244