sparc32: Fixed unaligned memory copying in function __csum_partial_copy_sparc_generic
[pandora-kernel.git] / fs / hpfs / namei.c
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 unsigned 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(name, &len))) return err==-ENOENT ? -EINVAL : err;
27         hpfs_lock(dir->i_sb);
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, 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         hpfs_unlock(dir->i_sb);
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         hpfs_unlock(dir->i_sb);
118         return err;
119 }
120
121 static int hpfs_create(struct inode *dir, struct dentry *dentry, int mode, struct nameidata *nd)
122 {
123         const unsigned 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(name, &len)))
133                 return err==-ENOENT ? -EINVAL : err;
134         hpfs_lock(dir->i_sb);
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, 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, 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         hpfs_unlock(dir->i_sb);
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         hpfs_unlock(dir->i_sb);
208         return err;
209 }
210
211 static int hpfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev)
212 {
213         const unsigned 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(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         hpfs_lock(dir->i_sb);
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, 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         hpfs_unlock(dir->i_sb);
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         hpfs_unlock(dir->i_sb);
286         return err;
287 }
288
289 static int hpfs_symlink(struct inode *dir, struct dentry *dentry, const char *symlink)
290 {
291         const unsigned 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(name, &len))) return err==-ENOENT ? -EINVAL : err;
301         hpfs_lock(dir->i_sb);
302         if (hpfs_sb(dir->i_sb)->sb_eas < 2) {
303                 hpfs_unlock(dir->i_sb);
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, 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", 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         hpfs_unlock(dir->i_sb);
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         hpfs_unlock(dir->i_sb);
366         return err;
367 }
368
369 static int hpfs_unlink(struct inode *dir, struct dentry *dentry)
370 {
371         const unsigned 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         hpfs_lock(dir->i_sb);
383         hpfs_adjust_length(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, 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                 dentry_unhash(dentry);
416                 if (!d_unhashed(dentry)) {
417                         dput(dentry);
418                         hpfs_unlock(dir->i_sb);
419                         return -ENOSPC;
420                 }
421                 if (generic_permission(inode, MAY_WRITE, 0, NULL) ||
422                     !S_ISREG(inode->i_mode) ||
423                     get_write_access(inode)) {
424                         d_rehash(dentry);
425                         dput(dentry);
426                 } else {
427                         struct iattr newattrs;
428                         /*printk("HPFS: truncating file before delete.\n");*/
429                         newattrs.ia_size = 0;
430                         newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
431                         err = notify_change(dentry, &newattrs);
432                         put_write_access(inode);
433                         dput(dentry);
434                         if (!err)
435                                 goto again;
436                 }
437                 hpfs_unlock(dir->i_sb);
438                 return -ENOSPC;
439         default:
440                 drop_nlink(inode);
441                 err = 0;
442         }
443         goto out;
444
445 out1:
446         hpfs_brelse4(&qbh);
447 out:
448         mutex_unlock(&hpfs_i(dir)->i_mutex);
449         mutex_unlock(&hpfs_i(inode)->i_parent_mutex);
450         hpfs_unlock(dir->i_sb);
451         return err;
452 }
453
454 static int hpfs_rmdir(struct inode *dir, struct dentry *dentry)
455 {
456         const unsigned char *name = dentry->d_name.name;
457         unsigned len = dentry->d_name.len;
458         struct quad_buffer_head qbh;
459         struct hpfs_dirent *de;
460         struct inode *inode = dentry->d_inode;
461         dnode_secno dno;
462         fnode_secno fno;
463         int n_items = 0;
464         int err;
465         int r;
466
467         hpfs_adjust_length(name, &len);
468         hpfs_lock(dir->i_sb);
469         mutex_lock(&hpfs_i(inode)->i_parent_mutex);
470         mutex_lock(&hpfs_i(dir)->i_mutex);
471         err = -ENOENT;
472         de = map_dirent(dir, hpfs_i(dir)->i_dno, name, len, &dno, &qbh);
473         if (!de)
474                 goto out;
475
476         err = -EPERM;
477         if (de->first)
478                 goto out1;
479
480         err = -ENOTDIR;
481         if (!de->directory)
482                 goto out1;
483
484         hpfs_count_dnodes(dir->i_sb, hpfs_i(inode)->i_dno, NULL, NULL, &n_items);
485         err = -ENOTEMPTY;
486         if (n_items)
487                 goto out1;
488
489         fno = de->fnode;
490         r = hpfs_remove_dirent(dir, dno, de, &qbh, 1);
491         switch (r) {
492         case 1:
493                 hpfs_error(dir->i_sb, "there was error when removing dirent");
494                 err = -EFSERROR;
495                 break;
496         case 2:
497                 err = -ENOSPC;
498                 break;
499         default:
500                 drop_nlink(dir);
501                 clear_nlink(inode);
502                 err = 0;
503         }
504         goto out;
505 out1:
506         hpfs_brelse4(&qbh);
507 out:
508         mutex_unlock(&hpfs_i(dir)->i_mutex);
509         mutex_unlock(&hpfs_i(inode)->i_parent_mutex);
510         hpfs_unlock(dir->i_sb);
511         return err;
512 }
513
514 static int hpfs_symlink_readpage(struct file *file, struct page *page)
515 {
516         char *link = kmap(page);
517         struct inode *i = page->mapping->host;
518         struct fnode *fnode;
519         struct buffer_head *bh;
520         int err;
521
522         err = -EIO;
523         hpfs_lock(i->i_sb);
524         if (!(fnode = hpfs_map_fnode(i->i_sb, i->i_ino, &bh)))
525                 goto fail;
526         err = hpfs_read_ea(i->i_sb, fnode, "SYMLINK", link, PAGE_SIZE);
527         brelse(bh);
528         if (err)
529                 goto fail;
530         hpfs_unlock(i->i_sb);
531         SetPageUptodate(page);
532         kunmap(page);
533         unlock_page(page);
534         return 0;
535
536 fail:
537         hpfs_unlock(i->i_sb);
538         SetPageError(page);
539         kunmap(page);
540         unlock_page(page);
541         return err;
542 }
543
544 const struct address_space_operations hpfs_symlink_aops = {
545         .readpage       = hpfs_symlink_readpage
546 };
547         
548 static int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry,
549                 struct inode *new_dir, struct dentry *new_dentry)
550 {
551         const unsigned char *old_name = old_dentry->d_name.name;
552         unsigned old_len = old_dentry->d_name.len;
553         const unsigned char *new_name = new_dentry->d_name.name;
554         unsigned new_len = new_dentry->d_name.len;
555         struct inode *i = old_dentry->d_inode;
556         struct inode *new_inode = new_dentry->d_inode;
557         struct quad_buffer_head qbh, qbh1;
558         struct hpfs_dirent *dep, *nde;
559         struct hpfs_dirent de;
560         dnode_secno dno;
561         int r;
562         struct buffer_head *bh;
563         struct fnode *fnode;
564         int err;
565         if ((err = hpfs_chk_name(new_name, &new_len))) return err;
566         err = 0;
567         hpfs_adjust_length(old_name, &old_len);
568
569         hpfs_lock(i->i_sb);
570         /* order doesn't matter, due to VFS exclusion */
571         mutex_lock(&hpfs_i(i)->i_parent_mutex);
572         if (new_inode)
573                 mutex_lock(&hpfs_i(new_inode)->i_parent_mutex);
574         mutex_lock(&hpfs_i(old_dir)->i_mutex);
575         if (new_dir != old_dir)
576                 mutex_lock(&hpfs_i(new_dir)->i_mutex);
577         
578         /* Erm? Moving over the empty non-busy directory is perfectly legal */
579         if (new_inode && S_ISDIR(new_inode->i_mode)) {
580                 err = -EINVAL;
581                 goto end1;
582         }
583
584         if (!(dep = map_dirent(old_dir, hpfs_i(old_dir)->i_dno, old_name, old_len, &dno, &qbh))) {
585                 hpfs_error(i->i_sb, "lookup succeeded but map dirent failed");
586                 err = -ENOENT;
587                 goto end1;
588         }
589         copy_de(&de, dep);
590         de.hidden = new_name[0] == '.';
591
592         if (new_inode) {
593                 int r;
594                 if ((r = hpfs_remove_dirent(old_dir, dno, dep, &qbh, 1)) != 2) {
595                         if ((nde = map_dirent(new_dir, hpfs_i(new_dir)->i_dno, new_name, new_len, NULL, &qbh1))) {
596                                 clear_nlink(new_inode);
597                                 copy_de(nde, &de);
598                                 memcpy(nde->name, new_name, new_len);
599                                 hpfs_mark_4buffers_dirty(&qbh1);
600                                 hpfs_brelse4(&qbh1);
601                                 goto end;
602                         }
603                         hpfs_error(new_dir->i_sb, "hpfs_rename: could not find dirent");
604                         err = -EFSERROR;
605                         goto end1;
606                 }
607                 err = r == 2 ? -ENOSPC : r == 1 ? -EFSERROR : 0;
608                 goto end1;
609         }
610
611         if (new_dir == old_dir) hpfs_brelse4(&qbh);
612
613         hpfs_lock_creation(i->i_sb);
614         if ((r = hpfs_add_dirent(new_dir, new_name, new_len, &de, 1))) {
615                 hpfs_unlock_creation(i->i_sb);
616                 if (r == -1) hpfs_error(new_dir->i_sb, "hpfs_rename: dirent already exists!");
617                 err = r == 1 ? -ENOSPC : -EFSERROR;
618                 if (new_dir != old_dir) hpfs_brelse4(&qbh);
619                 goto end1;
620         }
621         
622         if (new_dir == old_dir)
623                 if (!(dep = map_dirent(old_dir, hpfs_i(old_dir)->i_dno, old_name, old_len, &dno, &qbh))) {
624                         hpfs_unlock_creation(i->i_sb);
625                         hpfs_error(i->i_sb, "lookup succeeded but map dirent failed at #2");
626                         err = -ENOENT;
627                         goto end1;
628                 }
629
630         if ((r = hpfs_remove_dirent(old_dir, dno, dep, &qbh, 0))) {
631                 hpfs_unlock_creation(i->i_sb);
632                 hpfs_error(i->i_sb, "hpfs_rename: could not remove dirent");
633                 err = r == 2 ? -ENOSPC : -EFSERROR;
634                 goto end1;
635         }
636         hpfs_unlock_creation(i->i_sb);
637         
638         end:
639         hpfs_i(i)->i_parent_dir = new_dir->i_ino;
640         if (S_ISDIR(i->i_mode)) {
641                 inc_nlink(new_dir);
642                 drop_nlink(old_dir);
643         }
644         if ((fnode = hpfs_map_fnode(i->i_sb, i->i_ino, &bh))) {
645                 fnode->up = new_dir->i_ino;
646                 fnode->len = new_len;
647                 memcpy(fnode->name, new_name, new_len>15?15:new_len);
648                 if (new_len < 15) memset(&fnode->name[new_len], 0, 15 - new_len);
649                 mark_buffer_dirty(bh);
650                 brelse(bh);
651         }
652         hpfs_i(i)->i_conv = hpfs_sb(i->i_sb)->sb_conv;
653         hpfs_decide_conv(i, new_name, new_len);
654 end1:
655         if (old_dir != new_dir)
656                 mutex_unlock(&hpfs_i(new_dir)->i_mutex);
657         mutex_unlock(&hpfs_i(old_dir)->i_mutex);
658         mutex_unlock(&hpfs_i(i)->i_parent_mutex);
659         if (new_inode)
660                 mutex_unlock(&hpfs_i(new_inode)->i_parent_mutex);
661         hpfs_unlock(i->i_sb);
662         return err;
663 }
664
665 const struct inode_operations hpfs_dir_iops =
666 {
667         .create         = hpfs_create,
668         .lookup         = hpfs_lookup,
669         .unlink         = hpfs_unlink,
670         .symlink        = hpfs_symlink,
671         .mkdir          = hpfs_mkdir,
672         .rmdir          = hpfs_rmdir,
673         .mknod          = hpfs_mknod,
674         .rename         = hpfs_rename,
675         .setattr        = hpfs_setattr,
676 };