xref: /openbmc/linux/fs/hpfs/namei.c (revision 367b8112)
1 /*
2  *  linux/fs/hpfs/namei.c
3  *
4  *  Mikulas Patocka (mikulas@artax.karlin.mff.cuni.cz), 1998-1999
5  *
6  *  adding & removing files & directories
7  */
8 #include <linux/sched.h>
9 #include "hpfs_fn.h"
10 
11 static int hpfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
12 {
13 	const char *name = dentry->d_name.name;
14 	unsigned len = dentry->d_name.len;
15 	struct quad_buffer_head qbh0;
16 	struct buffer_head *bh;
17 	struct hpfs_dirent *de;
18 	struct fnode *fnode;
19 	struct dnode *dnode;
20 	struct inode *result;
21 	fnode_secno fno;
22 	dnode_secno dno;
23 	int r;
24 	struct hpfs_dirent dee;
25 	int err;
26 	if ((err = hpfs_chk_name((char *)name, &len))) return err==-ENOENT ? -EINVAL : err;
27 	lock_kernel();
28 	err = -ENOSPC;
29 	fnode = hpfs_alloc_fnode(dir->i_sb, hpfs_i(dir)->i_dno, &fno, &bh);
30 	if (!fnode)
31 		goto bail;
32 	dnode = hpfs_alloc_dnode(dir->i_sb, fno, &dno, &qbh0, 1);
33 	if (!dnode)
34 		goto bail1;
35 	memset(&dee, 0, sizeof dee);
36 	dee.directory = 1;
37 	if (!(mode & 0222)) dee.read_only = 1;
38 	/*dee.archive = 0;*/
39 	dee.hidden = name[0] == '.';
40 	dee.fnode = fno;
41 	dee.creation_date = dee.write_date = dee.read_date = gmt_to_local(dir->i_sb, get_seconds());
42 	result = new_inode(dir->i_sb);
43 	if (!result)
44 		goto bail2;
45 	hpfs_init_inode(result);
46 	result->i_ino = fno;
47 	hpfs_i(result)->i_parent_dir = dir->i_ino;
48 	hpfs_i(result)->i_dno = dno;
49 	result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, dee.creation_date);
50 	result->i_ctime.tv_nsec = 0;
51 	result->i_mtime.tv_nsec = 0;
52 	result->i_atime.tv_nsec = 0;
53 	hpfs_i(result)->i_ea_size = 0;
54 	result->i_mode |= S_IFDIR;
55 	result->i_op = &hpfs_dir_iops;
56 	result->i_fop = &hpfs_dir_ops;
57 	result->i_blocks = 4;
58 	result->i_size = 2048;
59 	result->i_nlink = 2;
60 	if (dee.read_only)
61 		result->i_mode &= ~0222;
62 
63 	mutex_lock(&hpfs_i(dir)->i_mutex);
64 	r = hpfs_add_dirent(dir, (char *)name, len, &dee, 0);
65 	if (r == 1)
66 		goto bail3;
67 	if (r == -1) {
68 		err = -EEXIST;
69 		goto bail3;
70 	}
71 	fnode->len = len;
72 	memcpy(fnode->name, name, len > 15 ? 15 : len);
73 	fnode->up = dir->i_ino;
74 	fnode->dirflag = 1;
75 	fnode->btree.n_free_nodes = 7;
76 	fnode->btree.n_used_nodes = 1;
77 	fnode->btree.first_free = 0x14;
78 	fnode->u.external[0].disk_secno = dno;
79 	fnode->u.external[0].file_secno = -1;
80 	dnode->root_dnode = 1;
81 	dnode->up = fno;
82 	de = hpfs_add_de(dir->i_sb, dnode, "\001\001", 2, 0);
83 	de->creation_date = de->write_date = de->read_date = gmt_to_local(dir->i_sb, get_seconds());
84 	if (!(mode & 0222)) de->read_only = 1;
85 	de->first = de->directory = 1;
86 	/*de->hidden = de->system = 0;*/
87 	de->fnode = fno;
88 	mark_buffer_dirty(bh);
89 	brelse(bh);
90 	hpfs_mark_4buffers_dirty(&qbh0);
91 	hpfs_brelse4(&qbh0);
92 	inc_nlink(dir);
93 	insert_inode_hash(result);
94 
95 	if (result->i_uid != current->fsuid ||
96 	    result->i_gid != current->fsgid ||
97 	    result->i_mode != (mode | S_IFDIR)) {
98 		result->i_uid = current->fsuid;
99 		result->i_gid = current->fsgid;
100 		result->i_mode = mode | S_IFDIR;
101 		hpfs_write_inode_nolock(result);
102 	}
103 	d_instantiate(dentry, result);
104 	mutex_unlock(&hpfs_i(dir)->i_mutex);
105 	unlock_kernel();
106 	return 0;
107 bail3:
108 	mutex_unlock(&hpfs_i(dir)->i_mutex);
109 	iput(result);
110 bail2:
111 	hpfs_brelse4(&qbh0);
112 	hpfs_free_dnode(dir->i_sb, dno);
113 bail1:
114 	brelse(bh);
115 	hpfs_free_sectors(dir->i_sb, fno, 1);
116 bail:
117 	unlock_kernel();
118 	return err;
119 }
120 
121 static int hpfs_create(struct inode *dir, struct dentry *dentry, int mode, struct nameidata *nd)
122 {
123 	const char *name = dentry->d_name.name;
124 	unsigned len = dentry->d_name.len;
125 	struct inode *result = NULL;
126 	struct buffer_head *bh;
127 	struct fnode *fnode;
128 	fnode_secno fno;
129 	int r;
130 	struct hpfs_dirent dee;
131 	int err;
132 	if ((err = hpfs_chk_name((char *)name, &len)))
133 		return err==-ENOENT ? -EINVAL : err;
134 	lock_kernel();
135 	err = -ENOSPC;
136 	fnode = hpfs_alloc_fnode(dir->i_sb, hpfs_i(dir)->i_dno, &fno, &bh);
137 	if (!fnode)
138 		goto bail;
139 	memset(&dee, 0, sizeof dee);
140 	if (!(mode & 0222)) dee.read_only = 1;
141 	dee.archive = 1;
142 	dee.hidden = name[0] == '.';
143 	dee.fnode = fno;
144 	dee.creation_date = dee.write_date = dee.read_date = gmt_to_local(dir->i_sb, get_seconds());
145 
146 	result = new_inode(dir->i_sb);
147 	if (!result)
148 		goto bail1;
149 
150 	hpfs_init_inode(result);
151 	result->i_ino = fno;
152 	result->i_mode |= S_IFREG;
153 	result->i_mode &= ~0111;
154 	result->i_op = &hpfs_file_iops;
155 	result->i_fop = &hpfs_file_ops;
156 	result->i_nlink = 1;
157 	hpfs_decide_conv(result, (char *)name, len);
158 	hpfs_i(result)->i_parent_dir = dir->i_ino;
159 	result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, dee.creation_date);
160 	result->i_ctime.tv_nsec = 0;
161 	result->i_mtime.tv_nsec = 0;
162 	result->i_atime.tv_nsec = 0;
163 	hpfs_i(result)->i_ea_size = 0;
164 	if (dee.read_only)
165 		result->i_mode &= ~0222;
166 	result->i_blocks = 1;
167 	result->i_size = 0;
168 	result->i_data.a_ops = &hpfs_aops;
169 	hpfs_i(result)->mmu_private = 0;
170 
171 	mutex_lock(&hpfs_i(dir)->i_mutex);
172 	r = hpfs_add_dirent(dir, (char *)name, len, &dee, 0);
173 	if (r == 1)
174 		goto bail2;
175 	if (r == -1) {
176 		err = -EEXIST;
177 		goto bail2;
178 	}
179 	fnode->len = len;
180 	memcpy(fnode->name, name, len > 15 ? 15 : len);
181 	fnode->up = dir->i_ino;
182 	mark_buffer_dirty(bh);
183 	brelse(bh);
184 
185 	insert_inode_hash(result);
186 
187 	if (result->i_uid != current->fsuid ||
188 	    result->i_gid != current->fsgid ||
189 	    result->i_mode != (mode | S_IFREG)) {
190 		result->i_uid = current->fsuid;
191 		result->i_gid = current->fsgid;
192 		result->i_mode = mode | S_IFREG;
193 		hpfs_write_inode_nolock(result);
194 	}
195 	d_instantiate(dentry, result);
196 	mutex_unlock(&hpfs_i(dir)->i_mutex);
197 	unlock_kernel();
198 	return 0;
199 
200 bail2:
201 	mutex_unlock(&hpfs_i(dir)->i_mutex);
202 	iput(result);
203 bail1:
204 	brelse(bh);
205 	hpfs_free_sectors(dir->i_sb, fno, 1);
206 bail:
207 	unlock_kernel();
208 	return err;
209 }
210 
211 static int hpfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev)
212 {
213 	const char *name = dentry->d_name.name;
214 	unsigned len = dentry->d_name.len;
215 	struct buffer_head *bh;
216 	struct fnode *fnode;
217 	fnode_secno fno;
218 	int r;
219 	struct hpfs_dirent dee;
220 	struct inode *result = NULL;
221 	int err;
222 	if ((err = hpfs_chk_name((char *)name, &len))) return err==-ENOENT ? -EINVAL : err;
223 	if (hpfs_sb(dir->i_sb)->sb_eas < 2) return -EPERM;
224 	if (!new_valid_dev(rdev))
225 		return -EINVAL;
226 	lock_kernel();
227 	err = -ENOSPC;
228 	fnode = hpfs_alloc_fnode(dir->i_sb, hpfs_i(dir)->i_dno, &fno, &bh);
229 	if (!fnode)
230 		goto bail;
231 	memset(&dee, 0, sizeof dee);
232 	if (!(mode & 0222)) dee.read_only = 1;
233 	dee.archive = 1;
234 	dee.hidden = name[0] == '.';
235 	dee.fnode = fno;
236 	dee.creation_date = dee.write_date = dee.read_date = gmt_to_local(dir->i_sb, get_seconds());
237 
238 	result = new_inode(dir->i_sb);
239 	if (!result)
240 		goto bail1;
241 
242 	hpfs_init_inode(result);
243 	result->i_ino = fno;
244 	hpfs_i(result)->i_parent_dir = dir->i_ino;
245 	result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, dee.creation_date);
246 	result->i_ctime.tv_nsec = 0;
247 	result->i_mtime.tv_nsec = 0;
248 	result->i_atime.tv_nsec = 0;
249 	hpfs_i(result)->i_ea_size = 0;
250 	result->i_uid = current->fsuid;
251 	result->i_gid = current->fsgid;
252 	result->i_nlink = 1;
253 	result->i_size = 0;
254 	result->i_blocks = 1;
255 	init_special_inode(result, mode, rdev);
256 
257 	mutex_lock(&hpfs_i(dir)->i_mutex);
258 	r = hpfs_add_dirent(dir, (char *)name, len, &dee, 0);
259 	if (r == 1)
260 		goto bail2;
261 	if (r == -1) {
262 		err = -EEXIST;
263 		goto bail2;
264 	}
265 	fnode->len = len;
266 	memcpy(fnode->name, name, len > 15 ? 15 : len);
267 	fnode->up = dir->i_ino;
268 	mark_buffer_dirty(bh);
269 
270 	insert_inode_hash(result);
271 
272 	hpfs_write_inode_nolock(result);
273 	d_instantiate(dentry, result);
274 	mutex_unlock(&hpfs_i(dir)->i_mutex);
275 	brelse(bh);
276 	unlock_kernel();
277 	return 0;
278 bail2:
279 	mutex_unlock(&hpfs_i(dir)->i_mutex);
280 	iput(result);
281 bail1:
282 	brelse(bh);
283 	hpfs_free_sectors(dir->i_sb, fno, 1);
284 bail:
285 	unlock_kernel();
286 	return err;
287 }
288 
289 static int hpfs_symlink(struct inode *dir, struct dentry *dentry, const char *symlink)
290 {
291 	const char *name = dentry->d_name.name;
292 	unsigned len = dentry->d_name.len;
293 	struct buffer_head *bh;
294 	struct fnode *fnode;
295 	fnode_secno fno;
296 	int r;
297 	struct hpfs_dirent dee;
298 	struct inode *result;
299 	int err;
300 	if ((err = hpfs_chk_name((char *)name, &len))) return err==-ENOENT ? -EINVAL : err;
301 	lock_kernel();
302 	if (hpfs_sb(dir->i_sb)->sb_eas < 2) {
303 		unlock_kernel();
304 		return -EPERM;
305 	}
306 	err = -ENOSPC;
307 	fnode = hpfs_alloc_fnode(dir->i_sb, hpfs_i(dir)->i_dno, &fno, &bh);
308 	if (!fnode)
309 		goto bail;
310 	memset(&dee, 0, sizeof dee);
311 	dee.archive = 1;
312 	dee.hidden = name[0] == '.';
313 	dee.fnode = fno;
314 	dee.creation_date = dee.write_date = dee.read_date = gmt_to_local(dir->i_sb, get_seconds());
315 
316 	result = new_inode(dir->i_sb);
317 	if (!result)
318 		goto bail1;
319 	result->i_ino = fno;
320 	hpfs_init_inode(result);
321 	hpfs_i(result)->i_parent_dir = dir->i_ino;
322 	result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, dee.creation_date);
323 	result->i_ctime.tv_nsec = 0;
324 	result->i_mtime.tv_nsec = 0;
325 	result->i_atime.tv_nsec = 0;
326 	hpfs_i(result)->i_ea_size = 0;
327 	result->i_mode = S_IFLNK | 0777;
328 	result->i_uid = current->fsuid;
329 	result->i_gid = current->fsgid;
330 	result->i_blocks = 1;
331 	result->i_nlink = 1;
332 	result->i_size = strlen(symlink);
333 	result->i_op = &page_symlink_inode_operations;
334 	result->i_data.a_ops = &hpfs_symlink_aops;
335 
336 	mutex_lock(&hpfs_i(dir)->i_mutex);
337 	r = hpfs_add_dirent(dir, (char *)name, len, &dee, 0);
338 	if (r == 1)
339 		goto bail2;
340 	if (r == -1) {
341 		err = -EEXIST;
342 		goto bail2;
343 	}
344 	fnode->len = len;
345 	memcpy(fnode->name, name, len > 15 ? 15 : len);
346 	fnode->up = dir->i_ino;
347 	hpfs_set_ea(result, fnode, "SYMLINK", (char *)symlink, strlen(symlink));
348 	mark_buffer_dirty(bh);
349 	brelse(bh);
350 
351 	insert_inode_hash(result);
352 
353 	hpfs_write_inode_nolock(result);
354 	d_instantiate(dentry, result);
355 	mutex_unlock(&hpfs_i(dir)->i_mutex);
356 	unlock_kernel();
357 	return 0;
358 bail2:
359 	mutex_unlock(&hpfs_i(dir)->i_mutex);
360 	iput(result);
361 bail1:
362 	brelse(bh);
363 	hpfs_free_sectors(dir->i_sb, fno, 1);
364 bail:
365 	unlock_kernel();
366 	return err;
367 }
368 
369 static int hpfs_unlink(struct inode *dir, struct dentry *dentry)
370 {
371 	const char *name = dentry->d_name.name;
372 	unsigned len = dentry->d_name.len;
373 	struct quad_buffer_head qbh;
374 	struct hpfs_dirent *de;
375 	struct inode *inode = dentry->d_inode;
376 	dnode_secno dno;
377 	fnode_secno fno;
378 	int r;
379 	int rep = 0;
380 	int err;
381 
382 	lock_kernel();
383 	hpfs_adjust_length((char *)name, &len);
384 again:
385 	mutex_lock(&hpfs_i(inode)->i_parent_mutex);
386 	mutex_lock(&hpfs_i(dir)->i_mutex);
387 	err = -ENOENT;
388 	de = map_dirent(dir, hpfs_i(dir)->i_dno, (char *)name, len, &dno, &qbh);
389 	if (!de)
390 		goto out;
391 
392 	err = -EPERM;
393 	if (de->first)
394 		goto out1;
395 
396 	err = -EISDIR;
397 	if (de->directory)
398 		goto out1;
399 
400 	fno = de->fnode;
401 	r = hpfs_remove_dirent(dir, dno, de, &qbh, 1);
402 	switch (r) {
403 	case 1:
404 		hpfs_error(dir->i_sb, "there was error when removing dirent");
405 		err = -EFSERROR;
406 		break;
407 	case 2:		/* no space for deleting, try to truncate file */
408 
409 		err = -ENOSPC;
410 		if (rep++)
411 			break;
412 
413 		mutex_unlock(&hpfs_i(dir)->i_mutex);
414 		mutex_unlock(&hpfs_i(inode)->i_parent_mutex);
415 		d_drop(dentry);
416 		spin_lock(&dentry->d_lock);
417 		if (atomic_read(&dentry->d_count) > 1 ||
418 		    generic_permission(inode, MAY_WRITE, NULL) ||
419 		    !S_ISREG(inode->i_mode) ||
420 		    get_write_access(inode)) {
421 			spin_unlock(&dentry->d_lock);
422 			d_rehash(dentry);
423 		} else {
424 			struct iattr newattrs;
425 			spin_unlock(&dentry->d_lock);
426 			/*printk("HPFS: truncating file before delete.\n");*/
427 			newattrs.ia_size = 0;
428 			newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
429 			err = notify_change(dentry, &newattrs);
430 			put_write_access(inode);
431 			if (!err)
432 				goto again;
433 		}
434 		unlock_kernel();
435 		return -ENOSPC;
436 	default:
437 		drop_nlink(inode);
438 		err = 0;
439 	}
440 	goto out;
441 
442 out1:
443 	hpfs_brelse4(&qbh);
444 out:
445 	mutex_unlock(&hpfs_i(dir)->i_mutex);
446 	mutex_unlock(&hpfs_i(inode)->i_parent_mutex);
447 	unlock_kernel();
448 	return err;
449 }
450 
451 static int hpfs_rmdir(struct inode *dir, struct dentry *dentry)
452 {
453 	const char *name = dentry->d_name.name;
454 	unsigned len = dentry->d_name.len;
455 	struct quad_buffer_head qbh;
456 	struct hpfs_dirent *de;
457 	struct inode *inode = dentry->d_inode;
458 	dnode_secno dno;
459 	fnode_secno fno;
460 	int n_items = 0;
461 	int err;
462 	int r;
463 
464 	hpfs_adjust_length((char *)name, &len);
465 	lock_kernel();
466 	mutex_lock(&hpfs_i(inode)->i_parent_mutex);
467 	mutex_lock(&hpfs_i(dir)->i_mutex);
468 	err = -ENOENT;
469 	de = map_dirent(dir, hpfs_i(dir)->i_dno, (char *)name, len, &dno, &qbh);
470 	if (!de)
471 		goto out;
472 
473 	err = -EPERM;
474 	if (de->first)
475 		goto out1;
476 
477 	err = -ENOTDIR;
478 	if (!de->directory)
479 		goto out1;
480 
481 	hpfs_count_dnodes(dir->i_sb, hpfs_i(inode)->i_dno, NULL, NULL, &n_items);
482 	err = -ENOTEMPTY;
483 	if (n_items)
484 		goto out1;
485 
486 	fno = de->fnode;
487 	r = hpfs_remove_dirent(dir, dno, de, &qbh, 1);
488 	switch (r) {
489 	case 1:
490 		hpfs_error(dir->i_sb, "there was error when removing dirent");
491 		err = -EFSERROR;
492 		break;
493 	case 2:
494 		err = -ENOSPC;
495 		break;
496 	default:
497 		drop_nlink(dir);
498 		clear_nlink(inode);
499 		err = 0;
500 	}
501 	goto out;
502 out1:
503 	hpfs_brelse4(&qbh);
504 out:
505 	mutex_unlock(&hpfs_i(dir)->i_mutex);
506 	mutex_unlock(&hpfs_i(inode)->i_parent_mutex);
507 	unlock_kernel();
508 	return err;
509 }
510 
511 static int hpfs_symlink_readpage(struct file *file, struct page *page)
512 {
513 	char *link = kmap(page);
514 	struct inode *i = page->mapping->host;
515 	struct fnode *fnode;
516 	struct buffer_head *bh;
517 	int err;
518 
519 	err = -EIO;
520 	lock_kernel();
521 	if (!(fnode = hpfs_map_fnode(i->i_sb, i->i_ino, &bh)))
522 		goto fail;
523 	err = hpfs_read_ea(i->i_sb, fnode, "SYMLINK", link, PAGE_SIZE);
524 	brelse(bh);
525 	if (err)
526 		goto fail;
527 	unlock_kernel();
528 	SetPageUptodate(page);
529 	kunmap(page);
530 	unlock_page(page);
531 	return 0;
532 
533 fail:
534 	unlock_kernel();
535 	SetPageError(page);
536 	kunmap(page);
537 	unlock_page(page);
538 	return err;
539 }
540 
541 const struct address_space_operations hpfs_symlink_aops = {
542 	.readpage	= hpfs_symlink_readpage
543 };
544 
545 static int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry,
546 		struct inode *new_dir, struct dentry *new_dentry)
547 {
548 	char *old_name = (char *)old_dentry->d_name.name;
549 	int old_len = old_dentry->d_name.len;
550 	char *new_name = (char *)new_dentry->d_name.name;
551 	int new_len = new_dentry->d_name.len;
552 	struct inode *i = old_dentry->d_inode;
553 	struct inode *new_inode = new_dentry->d_inode;
554 	struct quad_buffer_head qbh, qbh1;
555 	struct hpfs_dirent *dep, *nde;
556 	struct hpfs_dirent de;
557 	dnode_secno dno;
558 	int r;
559 	struct buffer_head *bh;
560 	struct fnode *fnode;
561 	int err;
562 	if ((err = hpfs_chk_name((char *)new_name, &new_len))) return err;
563 	err = 0;
564 	hpfs_adjust_length((char *)old_name, &old_len);
565 
566 	lock_kernel();
567 	/* order doesn't matter, due to VFS exclusion */
568 	mutex_lock(&hpfs_i(i)->i_parent_mutex);
569 	if (new_inode)
570 		mutex_lock(&hpfs_i(new_inode)->i_parent_mutex);
571 	mutex_lock(&hpfs_i(old_dir)->i_mutex);
572 	if (new_dir != old_dir)
573 		mutex_lock(&hpfs_i(new_dir)->i_mutex);
574 
575 	/* Erm? Moving over the empty non-busy directory is perfectly legal */
576 	if (new_inode && S_ISDIR(new_inode->i_mode)) {
577 		err = -EINVAL;
578 		goto end1;
579 	}
580 
581 	if (!(dep = map_dirent(old_dir, hpfs_i(old_dir)->i_dno, (char *)old_name, old_len, &dno, &qbh))) {
582 		hpfs_error(i->i_sb, "lookup succeeded but map dirent failed");
583 		err = -ENOENT;
584 		goto end1;
585 	}
586 	copy_de(&de, dep);
587 	de.hidden = new_name[0] == '.';
588 
589 	if (new_inode) {
590 		int r;
591 		if ((r = hpfs_remove_dirent(old_dir, dno, dep, &qbh, 1)) != 2) {
592 			if ((nde = map_dirent(new_dir, hpfs_i(new_dir)->i_dno, (char *)new_name, new_len, NULL, &qbh1))) {
593 				clear_nlink(new_inode);
594 				copy_de(nde, &de);
595 				memcpy(nde->name, new_name, new_len);
596 				hpfs_mark_4buffers_dirty(&qbh1);
597 				hpfs_brelse4(&qbh1);
598 				goto end;
599 			}
600 			hpfs_error(new_dir->i_sb, "hpfs_rename: could not find dirent");
601 			err = -EFSERROR;
602 			goto end1;
603 		}
604 		err = r == 2 ? -ENOSPC : r == 1 ? -EFSERROR : 0;
605 		goto end1;
606 	}
607 
608 	if (new_dir == old_dir) hpfs_brelse4(&qbh);
609 
610 	hpfs_lock_creation(i->i_sb);
611 	if ((r = hpfs_add_dirent(new_dir, new_name, new_len, &de, 1))) {
612 		hpfs_unlock_creation(i->i_sb);
613 		if (r == -1) hpfs_error(new_dir->i_sb, "hpfs_rename: dirent already exists!");
614 		err = r == 1 ? -ENOSPC : -EFSERROR;
615 		if (new_dir != old_dir) hpfs_brelse4(&qbh);
616 		goto end1;
617 	}
618 
619 	if (new_dir == old_dir)
620 		if (!(dep = map_dirent(old_dir, hpfs_i(old_dir)->i_dno, (char *)old_name, old_len, &dno, &qbh))) {
621 			hpfs_unlock_creation(i->i_sb);
622 			hpfs_error(i->i_sb, "lookup succeeded but map dirent failed at #2");
623 			err = -ENOENT;
624 			goto end1;
625 		}
626 
627 	if ((r = hpfs_remove_dirent(old_dir, dno, dep, &qbh, 0))) {
628 		hpfs_unlock_creation(i->i_sb);
629 		hpfs_error(i->i_sb, "hpfs_rename: could not remove dirent");
630 		err = r == 2 ? -ENOSPC : -EFSERROR;
631 		goto end1;
632 	}
633 	hpfs_unlock_creation(i->i_sb);
634 
635 	end:
636 	hpfs_i(i)->i_parent_dir = new_dir->i_ino;
637 	if (S_ISDIR(i->i_mode)) {
638 		inc_nlink(new_dir);
639 		drop_nlink(old_dir);
640 	}
641 	if ((fnode = hpfs_map_fnode(i->i_sb, i->i_ino, &bh))) {
642 		fnode->up = new_dir->i_ino;
643 		fnode->len = new_len;
644 		memcpy(fnode->name, new_name, new_len>15?15:new_len);
645 		if (new_len < 15) memset(&fnode->name[new_len], 0, 15 - new_len);
646 		mark_buffer_dirty(bh);
647 		brelse(bh);
648 	}
649 	hpfs_i(i)->i_conv = hpfs_sb(i->i_sb)->sb_conv;
650 	hpfs_decide_conv(i, (char *)new_name, new_len);
651 end1:
652 	if (old_dir != new_dir)
653 		mutex_unlock(&hpfs_i(new_dir)->i_mutex);
654 	mutex_unlock(&hpfs_i(old_dir)->i_mutex);
655 	mutex_unlock(&hpfs_i(i)->i_parent_mutex);
656 	if (new_inode)
657 		mutex_unlock(&hpfs_i(new_inode)->i_parent_mutex);
658 	unlock_kernel();
659 	return err;
660 }
661 
662 const struct inode_operations hpfs_dir_iops =
663 {
664 	.create		= hpfs_create,
665 	.lookup		= hpfs_lookup,
666 	.unlink		= hpfs_unlink,
667 	.symlink	= hpfs_symlink,
668 	.mkdir		= hpfs_mkdir,
669 	.rmdir		= hpfs_rmdir,
670 	.mknod		= hpfs_mknod,
671 	.rename		= hpfs_rename,
672 	.setattr	= hpfs_setattr,
673 };
674