[NETFILTER]: nf_conntrack_sip: add seperate SDP header parsing function
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / fs / jffs2 / dir.c
blobf948f7e6ec8202ab901d83b7fd5c62fd6ec41b27
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 = jffs2_iget(dir_i->i_sb, ino);
105 if (IS_ERR(inode)) {
106 printk(KERN_WARNING "iget() failed for ino #%u\n", ino);
107 return ERR_CAST(inode);
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 int ret;
187 ri = jffs2_alloc_raw_inode();
188 if (!ri)
189 return -ENOMEM;
191 c = JFFS2_SB_INFO(dir_i->i_sb);
193 D1(printk(KERN_DEBUG "jffs2_create()\n"));
195 inode = jffs2_new_inode(dir_i, mode, ri);
197 if (IS_ERR(inode)) {
198 D1(printk(KERN_DEBUG "jffs2_new_inode() failed\n"));
199 jffs2_free_raw_inode(ri);
200 return PTR_ERR(inode);
203 inode->i_op = &jffs2_file_inode_operations;
204 inode->i_fop = &jffs2_file_operations;
205 inode->i_mapping->a_ops = &jffs2_file_address_operations;
206 inode->i_mapping->nrpages = 0;
208 f = JFFS2_INODE_INFO(inode);
209 dir_f = JFFS2_INODE_INFO(dir_i);
211 ret = jffs2_do_create(c, dir_f, f, ri,
212 dentry->d_name.name, dentry->d_name.len);
213 if (ret)
214 goto fail;
216 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(ri->ctime));
218 jffs2_free_raw_inode(ri);
219 d_instantiate(dentry, inode);
221 D1(printk(KERN_DEBUG "jffs2_create: Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n",
222 inode->i_ino, inode->i_mode, inode->i_nlink, f->inocache->nlink, inode->i_mapping->nrpages));
223 return 0;
225 fail:
226 make_bad_inode(inode);
227 iput(inode);
228 jffs2_free_raw_inode(ri);
229 return ret;
232 /***********************************************************************/
235 static int jffs2_unlink(struct inode *dir_i, struct dentry *dentry)
237 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
238 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
239 struct jffs2_inode_info *dead_f = JFFS2_INODE_INFO(dentry->d_inode);
240 int ret;
241 uint32_t now = get_seconds();
243 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
244 dentry->d_name.len, dead_f, now);
245 if (dead_f->inocache)
246 dentry->d_inode->i_nlink = dead_f->inocache->nlink;
247 if (!ret)
248 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
249 return ret;
251 /***********************************************************************/
254 static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct dentry *dentry)
256 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dentry->d_inode->i_sb);
257 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
258 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
259 int ret;
260 uint8_t type;
261 uint32_t now;
263 /* Don't let people make hard links to bad inodes. */
264 if (!f->inocache)
265 return -EIO;
267 if (S_ISDIR(old_dentry->d_inode->i_mode))
268 return -EPERM;
270 /* XXX: This is ugly */
271 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
272 if (!type) type = DT_REG;
274 now = get_seconds();
275 ret = jffs2_do_link(c, dir_f, f->inocache->ino, type, dentry->d_name.name, dentry->d_name.len, now);
277 if (!ret) {
278 down(&f->sem);
279 old_dentry->d_inode->i_nlink = ++f->inocache->nlink;
280 up(&f->sem);
281 d_instantiate(dentry, old_dentry->d_inode);
282 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
283 atomic_inc(&old_dentry->d_inode->i_count);
285 return ret;
288 /***********************************************************************/
290 static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char *target)
292 struct jffs2_inode_info *f, *dir_f;
293 struct jffs2_sb_info *c;
294 struct inode *inode;
295 struct jffs2_raw_inode *ri;
296 struct jffs2_raw_dirent *rd;
297 struct jffs2_full_dnode *fn;
298 struct jffs2_full_dirent *fd;
299 int namelen;
300 uint32_t alloclen;
301 int ret, targetlen = strlen(target);
303 /* FIXME: If you care. We'd need to use frags for the target
304 if it grows much more than this */
305 if (targetlen > 254)
306 return -EINVAL;
308 ri = jffs2_alloc_raw_inode();
310 if (!ri)
311 return -ENOMEM;
313 c = JFFS2_SB_INFO(dir_i->i_sb);
315 /* Try to reserve enough space for both node and dirent.
316 * Just the node will do for now, though
318 namelen = dentry->d_name.len;
319 ret = jffs2_reserve_space(c, sizeof(*ri) + targetlen, &alloclen,
320 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
322 if (ret) {
323 jffs2_free_raw_inode(ri);
324 return ret;
327 inode = jffs2_new_inode(dir_i, S_IFLNK | S_IRWXUGO, ri);
329 if (IS_ERR(inode)) {
330 jffs2_free_raw_inode(ri);
331 jffs2_complete_reservation(c);
332 return PTR_ERR(inode);
335 inode->i_op = &jffs2_symlink_inode_operations;
337 f = JFFS2_INODE_INFO(inode);
339 inode->i_size = targetlen;
340 ri->isize = ri->dsize = ri->csize = cpu_to_je32(inode->i_size);
341 ri->totlen = cpu_to_je32(sizeof(*ri) + inode->i_size);
342 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
344 ri->compr = JFFS2_COMPR_NONE;
345 ri->data_crc = cpu_to_je32(crc32(0, target, targetlen));
346 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
348 fn = jffs2_write_dnode(c, f, ri, target, targetlen, ALLOC_NORMAL);
350 jffs2_free_raw_inode(ri);
352 if (IS_ERR(fn)) {
353 /* Eeek. Wave bye bye */
354 up(&f->sem);
355 jffs2_complete_reservation(c);
356 jffs2_clear_inode(inode);
357 return PTR_ERR(fn);
360 /* We use f->target field to store the target path. */
361 f->target = kmalloc(targetlen + 1, GFP_KERNEL);
362 if (!f->target) {
363 printk(KERN_WARNING "Can't allocate %d bytes of memory\n", targetlen + 1);
364 up(&f->sem);
365 jffs2_complete_reservation(c);
366 jffs2_clear_inode(inode);
367 return -ENOMEM;
370 memcpy(f->target, target, targetlen + 1);
371 D1(printk(KERN_DEBUG "jffs2_symlink: symlink's target '%s' cached\n", (char *)f->target));
373 /* No data here. Only a metadata node, which will be
374 obsoleted by the first data write
376 f->metadata = fn;
377 up(&f->sem);
379 jffs2_complete_reservation(c);
381 ret = jffs2_init_security(inode, dir_i);
382 if (ret) {
383 jffs2_clear_inode(inode);
384 return ret;
386 ret = jffs2_init_acl_post(inode);
387 if (ret) {
388 jffs2_clear_inode(inode);
389 return ret;
392 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
393 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
394 if (ret) {
395 /* Eep. */
396 jffs2_clear_inode(inode);
397 return ret;
400 rd = jffs2_alloc_raw_dirent();
401 if (!rd) {
402 /* Argh. Now we treat it like a normal delete */
403 jffs2_complete_reservation(c);
404 jffs2_clear_inode(inode);
405 return -ENOMEM;
408 dir_f = JFFS2_INODE_INFO(dir_i);
409 down(&dir_f->sem);
411 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
412 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
413 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
414 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
416 rd->pino = cpu_to_je32(dir_i->i_ino);
417 rd->version = cpu_to_je32(++dir_f->highest_version);
418 rd->ino = cpu_to_je32(inode->i_ino);
419 rd->mctime = cpu_to_je32(get_seconds());
420 rd->nsize = namelen;
421 rd->type = DT_LNK;
422 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
423 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
425 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
427 if (IS_ERR(fd)) {
428 /* dirent failed to write. Delete the inode normally
429 as if it were the final unlink() */
430 jffs2_complete_reservation(c);
431 jffs2_free_raw_dirent(rd);
432 up(&dir_f->sem);
433 jffs2_clear_inode(inode);
434 return PTR_ERR(fd);
437 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
439 jffs2_free_raw_dirent(rd);
441 /* Link the fd into the inode's list, obsoleting an old
442 one if necessary. */
443 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
445 up(&dir_f->sem);
446 jffs2_complete_reservation(c);
448 d_instantiate(dentry, inode);
449 return 0;
453 static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode)
455 struct jffs2_inode_info *f, *dir_f;
456 struct jffs2_sb_info *c;
457 struct inode *inode;
458 struct jffs2_raw_inode *ri;
459 struct jffs2_raw_dirent *rd;
460 struct jffs2_full_dnode *fn;
461 struct jffs2_full_dirent *fd;
462 int namelen;
463 uint32_t alloclen;
464 int ret;
466 mode |= S_IFDIR;
468 ri = jffs2_alloc_raw_inode();
469 if (!ri)
470 return -ENOMEM;
472 c = JFFS2_SB_INFO(dir_i->i_sb);
474 /* Try to reserve enough space for both node and dirent.
475 * Just the node will do for now, though
477 namelen = dentry->d_name.len;
478 ret = jffs2_reserve_space(c, sizeof(*ri), &alloclen, ALLOC_NORMAL,
479 JFFS2_SUMMARY_INODE_SIZE);
481 if (ret) {
482 jffs2_free_raw_inode(ri);
483 return ret;
486 inode = jffs2_new_inode(dir_i, mode, ri);
488 if (IS_ERR(inode)) {
489 jffs2_free_raw_inode(ri);
490 jffs2_complete_reservation(c);
491 return PTR_ERR(inode);
494 inode->i_op = &jffs2_dir_inode_operations;
495 inode->i_fop = &jffs2_dir_operations;
496 /* Directories get nlink 2 at start */
497 inode->i_nlink = 2;
499 f = JFFS2_INODE_INFO(inode);
501 ri->data_crc = cpu_to_je32(0);
502 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
504 fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL);
506 jffs2_free_raw_inode(ri);
508 if (IS_ERR(fn)) {
509 /* Eeek. Wave bye bye */
510 up(&f->sem);
511 jffs2_complete_reservation(c);
512 jffs2_clear_inode(inode);
513 return PTR_ERR(fn);
515 /* No data here. Only a metadata node, which will be
516 obsoleted by the first data write
518 f->metadata = fn;
519 up(&f->sem);
521 jffs2_complete_reservation(c);
523 ret = jffs2_init_security(inode, dir_i);
524 if (ret) {
525 jffs2_clear_inode(inode);
526 return ret;
528 ret = jffs2_init_acl_post(inode);
529 if (ret) {
530 jffs2_clear_inode(inode);
531 return ret;
534 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
535 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
536 if (ret) {
537 /* Eep. */
538 jffs2_clear_inode(inode);
539 return ret;
542 rd = jffs2_alloc_raw_dirent();
543 if (!rd) {
544 /* Argh. Now we treat it like a normal delete */
545 jffs2_complete_reservation(c);
546 jffs2_clear_inode(inode);
547 return -ENOMEM;
550 dir_f = JFFS2_INODE_INFO(dir_i);
551 down(&dir_f->sem);
553 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
554 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
555 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
556 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
558 rd->pino = cpu_to_je32(dir_i->i_ino);
559 rd->version = cpu_to_je32(++dir_f->highest_version);
560 rd->ino = cpu_to_je32(inode->i_ino);
561 rd->mctime = cpu_to_je32(get_seconds());
562 rd->nsize = namelen;
563 rd->type = DT_DIR;
564 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
565 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
567 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
569 if (IS_ERR(fd)) {
570 /* dirent failed to write. Delete the inode normally
571 as if it were the final unlink() */
572 jffs2_complete_reservation(c);
573 jffs2_free_raw_dirent(rd);
574 up(&dir_f->sem);
575 jffs2_clear_inode(inode);
576 return PTR_ERR(fd);
579 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
580 inc_nlink(dir_i);
582 jffs2_free_raw_dirent(rd);
584 /* Link the fd into the inode's list, obsoleting an old
585 one if necessary. */
586 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
588 up(&dir_f->sem);
589 jffs2_complete_reservation(c);
591 d_instantiate(dentry, inode);
592 return 0;
595 static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
597 struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
598 struct jffs2_full_dirent *fd;
599 int ret;
601 for (fd = f->dents ; fd; fd = fd->next) {
602 if (fd->ino)
603 return -ENOTEMPTY;
605 ret = jffs2_unlink(dir_i, dentry);
606 if (!ret)
607 drop_nlink(dir_i);
608 return ret;
611 static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, dev_t rdev)
613 struct jffs2_inode_info *f, *dir_f;
614 struct jffs2_sb_info *c;
615 struct inode *inode;
616 struct jffs2_raw_inode *ri;
617 struct jffs2_raw_dirent *rd;
618 struct jffs2_full_dnode *fn;
619 struct jffs2_full_dirent *fd;
620 int namelen;
621 union jffs2_device_node dev;
622 int devlen = 0;
623 uint32_t alloclen;
624 int ret;
626 if (!new_valid_dev(rdev))
627 return -EINVAL;
629 ri = jffs2_alloc_raw_inode();
630 if (!ri)
631 return -ENOMEM;
633 c = JFFS2_SB_INFO(dir_i->i_sb);
635 if (S_ISBLK(mode) || S_ISCHR(mode))
636 devlen = jffs2_encode_dev(&dev, rdev);
638 /* Try to reserve enough space for both node and dirent.
639 * Just the node will do for now, though
641 namelen = dentry->d_name.len;
642 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &alloclen,
643 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
645 if (ret) {
646 jffs2_free_raw_inode(ri);
647 return ret;
650 inode = jffs2_new_inode(dir_i, mode, ri);
652 if (IS_ERR(inode)) {
653 jffs2_free_raw_inode(ri);
654 jffs2_complete_reservation(c);
655 return PTR_ERR(inode);
657 inode->i_op = &jffs2_file_inode_operations;
658 init_special_inode(inode, inode->i_mode, rdev);
660 f = JFFS2_INODE_INFO(inode);
662 ri->dsize = ri->csize = cpu_to_je32(devlen);
663 ri->totlen = cpu_to_je32(sizeof(*ri) + devlen);
664 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
666 ri->compr = JFFS2_COMPR_NONE;
667 ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen));
668 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
670 fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, ALLOC_NORMAL);
672 jffs2_free_raw_inode(ri);
674 if (IS_ERR(fn)) {
675 /* Eeek. Wave bye bye */
676 up(&f->sem);
677 jffs2_complete_reservation(c);
678 jffs2_clear_inode(inode);
679 return PTR_ERR(fn);
681 /* No data here. Only a metadata node, which will be
682 obsoleted by the first data write
684 f->metadata = fn;
685 up(&f->sem);
687 jffs2_complete_reservation(c);
689 ret = jffs2_init_security(inode, dir_i);
690 if (ret) {
691 jffs2_clear_inode(inode);
692 return ret;
694 ret = jffs2_init_acl_post(inode);
695 if (ret) {
696 jffs2_clear_inode(inode);
697 return ret;
700 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
701 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
702 if (ret) {
703 /* Eep. */
704 jffs2_clear_inode(inode);
705 return ret;
708 rd = jffs2_alloc_raw_dirent();
709 if (!rd) {
710 /* Argh. Now we treat it like a normal delete */
711 jffs2_complete_reservation(c);
712 jffs2_clear_inode(inode);
713 return -ENOMEM;
716 dir_f = JFFS2_INODE_INFO(dir_i);
717 down(&dir_f->sem);
719 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
720 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
721 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
722 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
724 rd->pino = cpu_to_je32(dir_i->i_ino);
725 rd->version = cpu_to_je32(++dir_f->highest_version);
726 rd->ino = cpu_to_je32(inode->i_ino);
727 rd->mctime = cpu_to_je32(get_seconds());
728 rd->nsize = namelen;
730 /* XXX: This is ugly. */
731 rd->type = (mode & S_IFMT) >> 12;
733 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
734 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
736 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
738 if (IS_ERR(fd)) {
739 /* dirent failed to write. Delete the inode normally
740 as if it were the final unlink() */
741 jffs2_complete_reservation(c);
742 jffs2_free_raw_dirent(rd);
743 up(&dir_f->sem);
744 jffs2_clear_inode(inode);
745 return PTR_ERR(fd);
748 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
750 jffs2_free_raw_dirent(rd);
752 /* Link the fd into the inode's list, obsoleting an old
753 one if necessary. */
754 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
756 up(&dir_f->sem);
757 jffs2_complete_reservation(c);
759 d_instantiate(dentry, inode);
761 return 0;
764 static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
765 struct inode *new_dir_i, struct dentry *new_dentry)
767 int ret;
768 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
769 struct jffs2_inode_info *victim_f = NULL;
770 uint8_t type;
771 uint32_t now;
773 /* The VFS will check for us and prevent trying to rename a
774 * file over a directory and vice versa, but if it's a directory,
775 * the VFS can't check whether the victim is empty. The filesystem
776 * needs to do that for itself.
778 if (new_dentry->d_inode) {
779 victim_f = JFFS2_INODE_INFO(new_dentry->d_inode);
780 if (S_ISDIR(new_dentry->d_inode->i_mode)) {
781 struct jffs2_full_dirent *fd;
783 down(&victim_f->sem);
784 for (fd = victim_f->dents; fd; fd = fd->next) {
785 if (fd->ino) {
786 up(&victim_f->sem);
787 return -ENOTEMPTY;
790 up(&victim_f->sem);
794 /* XXX: We probably ought to alloc enough space for
795 both nodes at the same time. Writing the new link,
796 then getting -ENOSPC, is quite bad :)
799 /* Make a hard link */
801 /* XXX: This is ugly */
802 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
803 if (!type) type = DT_REG;
805 now = get_seconds();
806 ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i),
807 old_dentry->d_inode->i_ino, type,
808 new_dentry->d_name.name, new_dentry->d_name.len, now);
810 if (ret)
811 return ret;
813 if (victim_f) {
814 /* There was a victim. Kill it off nicely */
815 drop_nlink(new_dentry->d_inode);
816 /* Don't oops if the victim was a dirent pointing to an
817 inode which didn't exist. */
818 if (victim_f->inocache) {
819 down(&victim_f->sem);
820 victim_f->inocache->nlink--;
821 up(&victim_f->sem);
825 /* If it was a directory we moved, and there was no victim,
826 increase i_nlink on its new parent */
827 if (S_ISDIR(old_dentry->d_inode->i_mode) && !victim_f)
828 inc_nlink(new_dir_i);
830 /* Unlink the original */
831 ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
832 old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
834 /* We don't touch inode->i_nlink */
836 if (ret) {
837 /* Oh shit. We really ought to make a single node which can do both atomically */
838 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
839 down(&f->sem);
840 inc_nlink(old_dentry->d_inode);
841 if (f->inocache)
842 f->inocache->nlink++;
843 up(&f->sem);
845 printk(KERN_NOTICE "jffs2_rename(): Link succeeded, unlink failed (err %d). You now have a hard link\n", ret);
846 /* Might as well let the VFS know */
847 d_instantiate(new_dentry, old_dentry->d_inode);
848 atomic_inc(&old_dentry->d_inode->i_count);
849 new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now);
850 return ret;
853 if (S_ISDIR(old_dentry->d_inode->i_mode))
854 drop_nlink(old_dir_i);
856 new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
858 return 0;