diff options
-rw-r--r-- | fs/ufs/namei.c | 54 |
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 | ||
99 | static int ufs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t rdev) | 89 | static 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); |
153 | out: | ||
154 | unlock_ufs(dir->i_sb); | ||
155 | out_notlocked: | ||
156 | return err; | ||
157 | 140 | ||
158 | out_fail: | 141 | out_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 | ||
165 | static int ufs_link (struct dentry * old_dentry, struct inode * dir, | 148 | static 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); |
217 | out: | 195 | return 0; |
218 | return err; | ||
219 | 196 | ||
220 | out_fail: | 197 | out_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); |
225 | out_dir: | 202 | out_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 | ||
231 | static int ufs_unlink(struct inode *dir, struct dentry *dentry) | 207 | static 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 | ||