epca.c: reformat comments and coding style improvements
[linux/fpc-iii.git] / fs / jffs2 / dir.c
blob8353eb9c179955a8a9b54ec0d461560f2ae217b3
1 /*
2 * JFFS2 -- Journalling Flash File System, Version 2.
4 * Copyright © 2001-2007 Red Hat, Inc.
6 * Created by David Woodhouse <dwmw2@infradead.org>
8 * For licensing information, see the file 'LICENCE' in this directory.
12 #include <linux/kernel.h>
13 #include <linux/slab.h>
14 #include <linux/fs.h>
15 #include <linux/crc32.h>
16 #include <linux/jffs2.h>
17 #include "jffs2_fs_i.h"
18 #include "jffs2_fs_sb.h"
19 #include <linux/time.h>
20 #include "nodelist.h"
22 static int jffs2_readdir (struct file *, void *, filldir_t);
24 static int jffs2_create (struct inode *,struct dentry *,int,
25 struct nameidata *);
26 static struct dentry *jffs2_lookup (struct inode *,struct dentry *,
27 struct nameidata *);
28 static int jffs2_link (struct dentry *,struct inode *,struct dentry *);
29 static int jffs2_unlink (struct inode *,struct dentry *);
30 static int jffs2_symlink (struct inode *,struct dentry *,const char *);
31 static int jffs2_mkdir (struct inode *,struct dentry *,int);
32 static int jffs2_rmdir (struct inode *,struct dentry *);
33 static int jffs2_mknod (struct inode *,struct dentry *,int,dev_t);
34 static int jffs2_rename (struct inode *, struct dentry *,
35 struct inode *, struct dentry *);
37 const struct file_operations jffs2_dir_operations =
39 .read = generic_read_dir,
40 .readdir = jffs2_readdir,
41 .ioctl = jffs2_ioctl,
42 .fsync = jffs2_fsync
46 const struct inode_operations jffs2_dir_inode_operations =
48 .create = jffs2_create,
49 .lookup = jffs2_lookup,
50 .link = jffs2_link,
51 .unlink = jffs2_unlink,
52 .symlink = jffs2_symlink,
53 .mkdir = jffs2_mkdir,
54 .rmdir = jffs2_rmdir,
55 .mknod = jffs2_mknod,
56 .rename = jffs2_rename,
57 .permission = jffs2_permission,
58 .setattr = jffs2_setattr,
59 .setxattr = jffs2_setxattr,
60 .getxattr = jffs2_getxattr,
61 .listxattr = jffs2_listxattr,
62 .removexattr = jffs2_removexattr
65 /***********************************************************************/
68 /* We keep the dirent list sorted in increasing order of name hash,
69 and we use the same hash function as the dentries. Makes this
70 nice and simple
72 static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target,
73 struct nameidata *nd)
75 struct jffs2_inode_info *dir_f;
76 struct jffs2_sb_info *c;
77 struct jffs2_full_dirent *fd = NULL, *fd_list;
78 uint32_t ino = 0;
79 struct inode *inode = NULL;
81 D1(printk(KERN_DEBUG "jffs2_lookup()\n"));
83 if (target->d_name.len > JFFS2_MAX_NAME_LEN)
84 return ERR_PTR(-ENAMETOOLONG);
86 dir_f = JFFS2_INODE_INFO(dir_i);
87 c = JFFS2_SB_INFO(dir_i->i_sb);
89 down(&dir_f->sem);
91 /* NB: The 2.2 backport will need to explicitly check for '.' and '..' here */
92 for (fd_list = dir_f->dents; fd_list && fd_list->nhash <= target->d_name.hash; fd_list = fd_list->next) {
93 if (fd_list->nhash == target->d_name.hash &&
94 (!fd || fd_list->version > fd->version) &&
95 strlen(fd_list->name) == target->d_name.len &&
96 !strncmp(fd_list->name, target->d_name.name, target->d_name.len)) {
97 fd = fd_list;
100 if (fd)
101 ino = fd->ino;
102 up(&dir_f->sem);
103 if (ino) {
104 inode = iget(dir_i->i_sb, ino);
105 if (!inode) {
106 printk(KERN_WARNING "iget() failed for ino #%u\n", ino);
107 return (ERR_PTR(-EIO));
111 d_add(target, inode);
113 return NULL;
116 /***********************************************************************/
119 static int jffs2_readdir(struct file *filp, void *dirent, filldir_t filldir)
121 struct jffs2_inode_info *f;
122 struct jffs2_sb_info *c;
123 struct inode *inode = filp->f_path.dentry->d_inode;
124 struct jffs2_full_dirent *fd;
125 unsigned long offset, curofs;
127 D1(printk(KERN_DEBUG "jffs2_readdir() for dir_i #%lu\n", filp->f_path.dentry->d_inode->i_ino));
129 f = JFFS2_INODE_INFO(inode);
130 c = JFFS2_SB_INFO(inode->i_sb);
132 offset = filp->f_pos;
134 if (offset == 0) {
135 D1(printk(KERN_DEBUG "Dirent 0: \".\", ino #%lu\n", inode->i_ino));
136 if (filldir(dirent, ".", 1, 0, inode->i_ino, DT_DIR) < 0)
137 goto out;
138 offset++;
140 if (offset == 1) {
141 unsigned long pino = parent_ino(filp->f_path.dentry);
142 D1(printk(KERN_DEBUG "Dirent 1: \"..\", ino #%lu\n", pino));
143 if (filldir(dirent, "..", 2, 1, pino, DT_DIR) < 0)
144 goto out;
145 offset++;
148 curofs=1;
149 down(&f->sem);
150 for (fd = f->dents; fd; fd = fd->next) {
152 curofs++;
153 /* First loop: curofs = 2; offset = 2 */
154 if (curofs < offset) {
155 D2(printk(KERN_DEBUG "Skipping dirent: \"%s\", ino #%u, type %d, because curofs %ld < offset %ld\n",
156 fd->name, fd->ino, fd->type, curofs, offset));
157 continue;
159 if (!fd->ino) {
160 D2(printk(KERN_DEBUG "Skipping deletion dirent \"%s\"\n", fd->name));
161 offset++;
162 continue;
164 D2(printk(KERN_DEBUG "Dirent %ld: \"%s\", ino #%u, type %d\n", offset, fd->name, fd->ino, fd->type));
165 if (filldir(dirent, fd->name, strlen(fd->name), offset, fd->ino, fd->type) < 0)
166 break;
167 offset++;
169 up(&f->sem);
170 out:
171 filp->f_pos = offset;
172 return 0;
175 /***********************************************************************/
178 static int jffs2_create(struct inode *dir_i, struct dentry *dentry, int mode,
179 struct nameidata *nd)
181 struct jffs2_raw_inode *ri;
182 struct jffs2_inode_info *f, *dir_f;
183 struct jffs2_sb_info *c;
184 struct inode *inode;
185 struct posix_acl *acl;
186 int ret;
188 ri = jffs2_alloc_raw_inode();
189 if (!ri)
190 return -ENOMEM;
192 c = JFFS2_SB_INFO(dir_i->i_sb);
194 D1(printk(KERN_DEBUG "jffs2_create()\n"));
196 inode = jffs2_new_inode(dir_i, mode, ri, &acl);
198 if (IS_ERR(inode)) {
199 D1(printk(KERN_DEBUG "jffs2_new_inode() failed\n"));
200 jffs2_free_raw_inode(ri);
201 return PTR_ERR(inode);
204 inode->i_op = &jffs2_file_inode_operations;
205 inode->i_fop = &jffs2_file_operations;
206 inode->i_mapping->a_ops = &jffs2_file_address_operations;
207 inode->i_mapping->nrpages = 0;
209 f = JFFS2_INODE_INFO(inode);
210 dir_f = JFFS2_INODE_INFO(dir_i);
212 ret = jffs2_do_create(c, dir_f, f, ri,
213 dentry->d_name.name, dentry->d_name.len);
215 if (ret)
216 goto fail_acl;
218 ret = jffs2_init_security(inode, dir_i);
219 if (ret)
220 goto fail_acl;
221 ret = jffs2_init_acl(inode, acl);
222 if (ret)
223 goto fail;
225 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(ri->ctime));
227 jffs2_free_raw_inode(ri);
228 d_instantiate(dentry, inode);
230 D1(printk(KERN_DEBUG "jffs2_create: Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n",
231 inode->i_ino, inode->i_mode, inode->i_nlink, f->inocache->nlink, inode->i_mapping->nrpages));
232 return 0;
234 fail_acl:
235 posix_acl_release(acl);
236 fail:
237 make_bad_inode(inode);
238 iput(inode);
239 jffs2_free_raw_inode(ri);
240 return ret;
243 /***********************************************************************/
246 static int jffs2_unlink(struct inode *dir_i, struct dentry *dentry)
248 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
249 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
250 struct jffs2_inode_info *dead_f = JFFS2_INODE_INFO(dentry->d_inode);
251 int ret;
252 uint32_t now = get_seconds();
254 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
255 dentry->d_name.len, dead_f, now);
256 if (dead_f->inocache)
257 dentry->d_inode->i_nlink = dead_f->inocache->nlink;
258 if (!ret)
259 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
260 return ret;
262 /***********************************************************************/
265 static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct dentry *dentry)
267 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dentry->d_inode->i_sb);
268 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
269 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
270 int ret;
271 uint8_t type;
272 uint32_t now;
274 /* Don't let people make hard links to bad inodes. */
275 if (!f->inocache)
276 return -EIO;
278 if (S_ISDIR(old_dentry->d_inode->i_mode))
279 return -EPERM;
281 /* XXX: This is ugly */
282 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
283 if (!type) type = DT_REG;
285 now = get_seconds();
286 ret = jffs2_do_link(c, dir_f, f->inocache->ino, type, dentry->d_name.name, dentry->d_name.len, now);
288 if (!ret) {
289 down(&f->sem);
290 old_dentry->d_inode->i_nlink = ++f->inocache->nlink;
291 up(&f->sem);
292 d_instantiate(dentry, old_dentry->d_inode);
293 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
294 atomic_inc(&old_dentry->d_inode->i_count);
296 return ret;
299 /***********************************************************************/
301 static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char *target)
303 struct jffs2_inode_info *f, *dir_f;
304 struct jffs2_sb_info *c;
305 struct inode *inode;
306 struct jffs2_raw_inode *ri;
307 struct jffs2_raw_dirent *rd;
308 struct jffs2_full_dnode *fn;
309 struct jffs2_full_dirent *fd;
310 int namelen;
311 uint32_t alloclen;
312 struct posix_acl *acl;
313 int ret, targetlen = strlen(target);
315 /* FIXME: If you care. We'd need to use frags for the target
316 if it grows much more than this */
317 if (targetlen > 254)
318 return -EINVAL;
320 ri = jffs2_alloc_raw_inode();
322 if (!ri)
323 return -ENOMEM;
325 c = JFFS2_SB_INFO(dir_i->i_sb);
327 /* Try to reserve enough space for both node and dirent.
328 * Just the node will do for now, though
330 namelen = dentry->d_name.len;
331 ret = jffs2_reserve_space(c, sizeof(*ri) + targetlen, &alloclen,
332 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
334 if (ret) {
335 jffs2_free_raw_inode(ri);
336 return ret;
339 inode = jffs2_new_inode(dir_i, S_IFLNK | S_IRWXUGO, ri, &acl);
341 if (IS_ERR(inode)) {
342 jffs2_free_raw_inode(ri);
343 jffs2_complete_reservation(c);
344 return PTR_ERR(inode);
347 inode->i_op = &jffs2_symlink_inode_operations;
349 f = JFFS2_INODE_INFO(inode);
351 inode->i_size = targetlen;
352 ri->isize = ri->dsize = ri->csize = cpu_to_je32(inode->i_size);
353 ri->totlen = cpu_to_je32(sizeof(*ri) + inode->i_size);
354 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
356 ri->compr = JFFS2_COMPR_NONE;
357 ri->data_crc = cpu_to_je32(crc32(0, target, targetlen));
358 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
360 fn = jffs2_write_dnode(c, f, ri, target, targetlen, ALLOC_NORMAL);
362 jffs2_free_raw_inode(ri);
364 if (IS_ERR(fn)) {
365 /* Eeek. Wave bye bye */
366 up(&f->sem);
367 jffs2_complete_reservation(c);
368 jffs2_clear_inode(inode);
369 posix_acl_release(acl);
370 return PTR_ERR(fn);
373 /* We use f->target field to store the target path. */
374 f->target = kmalloc(targetlen + 1, GFP_KERNEL);
375 if (!f->target) {
376 printk(KERN_WARNING "Can't allocate %d bytes of memory\n", targetlen + 1);
377 up(&f->sem);
378 jffs2_complete_reservation(c);
379 jffs2_clear_inode(inode);
380 posix_acl_release(acl);
381 return -ENOMEM;
384 memcpy(f->target, target, targetlen + 1);
385 D1(printk(KERN_DEBUG "jffs2_symlink: symlink's target '%s' cached\n", (char *)f->target));
387 /* No data here. Only a metadata node, which will be
388 obsoleted by the first data write
390 f->metadata = fn;
391 up(&f->sem);
393 jffs2_complete_reservation(c);
395 ret = jffs2_init_security(inode, dir_i);
396 if (ret) {
397 jffs2_clear_inode(inode);
398 posix_acl_release(acl);
399 return ret;
401 ret = jffs2_init_acl(inode, acl);
402 if (ret) {
403 jffs2_clear_inode(inode);
404 return ret;
407 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
408 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
409 if (ret) {
410 /* Eep. */
411 jffs2_clear_inode(inode);
412 return ret;
415 rd = jffs2_alloc_raw_dirent();
416 if (!rd) {
417 /* Argh. Now we treat it like a normal delete */
418 jffs2_complete_reservation(c);
419 jffs2_clear_inode(inode);
420 return -ENOMEM;
423 dir_f = JFFS2_INODE_INFO(dir_i);
424 down(&dir_f->sem);
426 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
427 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
428 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
429 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
431 rd->pino = cpu_to_je32(dir_i->i_ino);
432 rd->version = cpu_to_je32(++dir_f->highest_version);
433 rd->ino = cpu_to_je32(inode->i_ino);
434 rd->mctime = cpu_to_je32(get_seconds());
435 rd->nsize = namelen;
436 rd->type = DT_LNK;
437 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
438 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
440 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
442 if (IS_ERR(fd)) {
443 /* dirent failed to write. Delete the inode normally
444 as if it were the final unlink() */
445 jffs2_complete_reservation(c);
446 jffs2_free_raw_dirent(rd);
447 up(&dir_f->sem);
448 jffs2_clear_inode(inode);
449 return PTR_ERR(fd);
452 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
454 jffs2_free_raw_dirent(rd);
456 /* Link the fd into the inode's list, obsoleting an old
457 one if necessary. */
458 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
460 up(&dir_f->sem);
461 jffs2_complete_reservation(c);
463 d_instantiate(dentry, inode);
464 return 0;
468 static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode)
470 struct jffs2_inode_info *f, *dir_f;
471 struct jffs2_sb_info *c;
472 struct inode *inode;
473 struct jffs2_raw_inode *ri;
474 struct jffs2_raw_dirent *rd;
475 struct jffs2_full_dnode *fn;
476 struct jffs2_full_dirent *fd;
477 int namelen;
478 uint32_t alloclen;
479 struct posix_acl *acl;
480 int ret;
482 mode |= S_IFDIR;
484 ri = jffs2_alloc_raw_inode();
485 if (!ri)
486 return -ENOMEM;
488 c = JFFS2_SB_INFO(dir_i->i_sb);
490 /* Try to reserve enough space for both node and dirent.
491 * Just the node will do for now, though
493 namelen = dentry->d_name.len;
494 ret = jffs2_reserve_space(c, sizeof(*ri), &alloclen, ALLOC_NORMAL,
495 JFFS2_SUMMARY_INODE_SIZE);
497 if (ret) {
498 jffs2_free_raw_inode(ri);
499 return ret;
502 inode = jffs2_new_inode(dir_i, mode, ri, &acl);
504 if (IS_ERR(inode)) {
505 jffs2_free_raw_inode(ri);
506 jffs2_complete_reservation(c);
507 return PTR_ERR(inode);
510 inode->i_op = &jffs2_dir_inode_operations;
511 inode->i_fop = &jffs2_dir_operations;
512 /* Directories get nlink 2 at start */
513 inode->i_nlink = 2;
515 f = JFFS2_INODE_INFO(inode);
517 ri->data_crc = cpu_to_je32(0);
518 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
520 fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL);
522 jffs2_free_raw_inode(ri);
524 if (IS_ERR(fn)) {
525 /* Eeek. Wave bye bye */
526 up(&f->sem);
527 jffs2_complete_reservation(c);
528 jffs2_clear_inode(inode);
529 posix_acl_release(acl);
530 return PTR_ERR(fn);
532 /* No data here. Only a metadata node, which will be
533 obsoleted by the first data write
535 f->metadata = fn;
536 up(&f->sem);
538 jffs2_complete_reservation(c);
540 ret = jffs2_init_security(inode, dir_i);
541 if (ret) {
542 jffs2_clear_inode(inode);
543 posix_acl_release(acl);
544 return ret;
546 ret = jffs2_init_acl(inode, acl);
547 if (ret) {
548 jffs2_clear_inode(inode);
549 return ret;
552 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
553 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
554 if (ret) {
555 /* Eep. */
556 jffs2_clear_inode(inode);
557 return ret;
560 rd = jffs2_alloc_raw_dirent();
561 if (!rd) {
562 /* Argh. Now we treat it like a normal delete */
563 jffs2_complete_reservation(c);
564 jffs2_clear_inode(inode);
565 return -ENOMEM;
568 dir_f = JFFS2_INODE_INFO(dir_i);
569 down(&dir_f->sem);
571 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
572 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
573 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
574 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
576 rd->pino = cpu_to_je32(dir_i->i_ino);
577 rd->version = cpu_to_je32(++dir_f->highest_version);
578 rd->ino = cpu_to_je32(inode->i_ino);
579 rd->mctime = cpu_to_je32(get_seconds());
580 rd->nsize = namelen;
581 rd->type = DT_DIR;
582 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
583 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
585 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
587 if (IS_ERR(fd)) {
588 /* dirent failed to write. Delete the inode normally
589 as if it were the final unlink() */
590 jffs2_complete_reservation(c);
591 jffs2_free_raw_dirent(rd);
592 up(&dir_f->sem);
593 jffs2_clear_inode(inode);
594 return PTR_ERR(fd);
597 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
598 inc_nlink(dir_i);
600 jffs2_free_raw_dirent(rd);
602 /* Link the fd into the inode's list, obsoleting an old
603 one if necessary. */
604 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
606 up(&dir_f->sem);
607 jffs2_complete_reservation(c);
609 d_instantiate(dentry, inode);
610 return 0;
613 static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
615 struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
616 struct jffs2_full_dirent *fd;
617 int ret;
619 for (fd = f->dents ; fd; fd = fd->next) {
620 if (fd->ino)
621 return -ENOTEMPTY;
623 ret = jffs2_unlink(dir_i, dentry);
624 if (!ret)
625 drop_nlink(dir_i);
626 return ret;
629 static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, dev_t rdev)
631 struct jffs2_inode_info *f, *dir_f;
632 struct jffs2_sb_info *c;
633 struct inode *inode;
634 struct jffs2_raw_inode *ri;
635 struct jffs2_raw_dirent *rd;
636 struct jffs2_full_dnode *fn;
637 struct jffs2_full_dirent *fd;
638 int namelen;
639 union jffs2_device_node dev;
640 int devlen = 0;
641 uint32_t alloclen;
642 struct posix_acl *acl;
643 int ret;
645 if (!new_valid_dev(rdev))
646 return -EINVAL;
648 ri = jffs2_alloc_raw_inode();
649 if (!ri)
650 return -ENOMEM;
652 c = JFFS2_SB_INFO(dir_i->i_sb);
654 if (S_ISBLK(mode) || S_ISCHR(mode))
655 devlen = jffs2_encode_dev(&dev, rdev);
657 /* Try to reserve enough space for both node and dirent.
658 * Just the node will do for now, though
660 namelen = dentry->d_name.len;
661 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &alloclen,
662 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
664 if (ret) {
665 jffs2_free_raw_inode(ri);
666 return ret;
669 inode = jffs2_new_inode(dir_i, mode, ri, &acl);
671 if (IS_ERR(inode)) {
672 jffs2_free_raw_inode(ri);
673 jffs2_complete_reservation(c);
674 return PTR_ERR(inode);
676 inode->i_op = &jffs2_file_inode_operations;
677 init_special_inode(inode, inode->i_mode, rdev);
679 f = JFFS2_INODE_INFO(inode);
681 ri->dsize = ri->csize = cpu_to_je32(devlen);
682 ri->totlen = cpu_to_je32(sizeof(*ri) + devlen);
683 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
685 ri->compr = JFFS2_COMPR_NONE;
686 ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen));
687 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
689 fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, ALLOC_NORMAL);
691 jffs2_free_raw_inode(ri);
693 if (IS_ERR(fn)) {
694 /* Eeek. Wave bye bye */
695 up(&f->sem);
696 jffs2_complete_reservation(c);
697 jffs2_clear_inode(inode);
698 posix_acl_release(acl);
699 return PTR_ERR(fn);
701 /* No data here. Only a metadata node, which will be
702 obsoleted by the first data write
704 f->metadata = fn;
705 up(&f->sem);
707 jffs2_complete_reservation(c);
709 ret = jffs2_init_security(inode, dir_i);
710 if (ret) {
711 jffs2_clear_inode(inode);
712 posix_acl_release(acl);
713 return ret;
715 ret = jffs2_init_acl(inode, acl);
716 if (ret) {
717 jffs2_clear_inode(inode);
718 return ret;
721 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
722 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
723 if (ret) {
724 /* Eep. */
725 jffs2_clear_inode(inode);
726 return ret;
729 rd = jffs2_alloc_raw_dirent();
730 if (!rd) {
731 /* Argh. Now we treat it like a normal delete */
732 jffs2_complete_reservation(c);
733 jffs2_clear_inode(inode);
734 return -ENOMEM;
737 dir_f = JFFS2_INODE_INFO(dir_i);
738 down(&dir_f->sem);
740 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
741 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
742 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
743 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
745 rd->pino = cpu_to_je32(dir_i->i_ino);
746 rd->version = cpu_to_je32(++dir_f->highest_version);
747 rd->ino = cpu_to_je32(inode->i_ino);
748 rd->mctime = cpu_to_je32(get_seconds());
749 rd->nsize = namelen;
751 /* XXX: This is ugly. */
752 rd->type = (mode & S_IFMT) >> 12;
754 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
755 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
757 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
759 if (IS_ERR(fd)) {
760 /* dirent failed to write. Delete the inode normally
761 as if it were the final unlink() */
762 jffs2_complete_reservation(c);
763 jffs2_free_raw_dirent(rd);
764 up(&dir_f->sem);
765 jffs2_clear_inode(inode);
766 return PTR_ERR(fd);
769 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
771 jffs2_free_raw_dirent(rd);
773 /* Link the fd into the inode's list, obsoleting an old
774 one if necessary. */
775 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
777 up(&dir_f->sem);
778 jffs2_complete_reservation(c);
780 d_instantiate(dentry, inode);
782 return 0;
785 static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
786 struct inode *new_dir_i, struct dentry *new_dentry)
788 int ret;
789 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
790 struct jffs2_inode_info *victim_f = NULL;
791 uint8_t type;
792 uint32_t now;
794 /* The VFS will check for us and prevent trying to rename a
795 * file over a directory and vice versa, but if it's a directory,
796 * the VFS can't check whether the victim is empty. The filesystem
797 * needs to do that for itself.
799 if (new_dentry->d_inode) {
800 victim_f = JFFS2_INODE_INFO(new_dentry->d_inode);
801 if (S_ISDIR(new_dentry->d_inode->i_mode)) {
802 struct jffs2_full_dirent *fd;
804 down(&victim_f->sem);
805 for (fd = victim_f->dents; fd; fd = fd->next) {
806 if (fd->ino) {
807 up(&victim_f->sem);
808 return -ENOTEMPTY;
811 up(&victim_f->sem);
815 /* XXX: We probably ought to alloc enough space for
816 both nodes at the same time. Writing the new link,
817 then getting -ENOSPC, is quite bad :)
820 /* Make a hard link */
822 /* XXX: This is ugly */
823 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
824 if (!type) type = DT_REG;
826 now = get_seconds();
827 ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i),
828 old_dentry->d_inode->i_ino, type,
829 new_dentry->d_name.name, new_dentry->d_name.len, now);
831 if (ret)
832 return ret;
834 if (victim_f) {
835 /* There was a victim. Kill it off nicely */
836 drop_nlink(new_dentry->d_inode);
837 /* Don't oops if the victim was a dirent pointing to an
838 inode which didn't exist. */
839 if (victim_f->inocache) {
840 down(&victim_f->sem);
841 victim_f->inocache->nlink--;
842 up(&victim_f->sem);
846 /* If it was a directory we moved, and there was no victim,
847 increase i_nlink on its new parent */
848 if (S_ISDIR(old_dentry->d_inode->i_mode) && !victim_f)
849 inc_nlink(new_dir_i);
851 /* Unlink the original */
852 ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
853 old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
855 /* We don't touch inode->i_nlink */
857 if (ret) {
858 /* Oh shit. We really ought to make a single node which can do both atomically */
859 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
860 down(&f->sem);
861 inc_nlink(old_dentry->d_inode);
862 if (f->inocache)
863 f->inocache->nlink++;
864 up(&f->sem);
866 printk(KERN_NOTICE "jffs2_rename(): Link succeeded, unlink failed (err %d). You now have a hard link\n", ret);
867 /* Might as well let the VFS know */
868 d_instantiate(new_dentry, old_dentry->d_inode);
869 atomic_inc(&old_dentry->d_inode->i_count);
870 new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now);
871 return ret;
874 if (S_ISDIR(old_dentry->d_inode->i_mode))
875 drop_nlink(old_dir_i);
877 new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
879 return 0;