thinkpad-acpi: drop HKEY event 0x5010
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / fs / jffs2 / dir.c
blob6f60cc910f4c568f527354357f60d63349a1d8c5
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 .unlocked_ioctl=jffs2_ioctl,
42 .fsync = jffs2_fsync,
43 .llseek = generic_file_llseek,
47 const struct inode_operations jffs2_dir_inode_operations =
49 .create = jffs2_create,
50 .lookup = jffs2_lookup,
51 .link = jffs2_link,
52 .unlink = jffs2_unlink,
53 .symlink = jffs2_symlink,
54 .mkdir = jffs2_mkdir,
55 .rmdir = jffs2_rmdir,
56 .mknod = jffs2_mknod,
57 .rename = jffs2_rename,
58 .permission = jffs2_permission,
59 .setattr = jffs2_setattr,
60 .setxattr = jffs2_setxattr,
61 .getxattr = jffs2_getxattr,
62 .listxattr = jffs2_listxattr,
63 .removexattr = jffs2_removexattr
66 /***********************************************************************/
69 /* We keep the dirent list sorted in increasing order of name hash,
70 and we use the same hash function as the dentries. Makes this
71 nice and simple
73 static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target,
74 struct nameidata *nd)
76 struct jffs2_inode_info *dir_f;
77 struct jffs2_sb_info *c;
78 struct jffs2_full_dirent *fd = NULL, *fd_list;
79 uint32_t ino = 0;
80 struct inode *inode = NULL;
82 D1(printk(KERN_DEBUG "jffs2_lookup()\n"));
84 if (target->d_name.len > JFFS2_MAX_NAME_LEN)
85 return ERR_PTR(-ENAMETOOLONG);
87 dir_f = JFFS2_INODE_INFO(dir_i);
88 c = JFFS2_SB_INFO(dir_i->i_sb);
90 mutex_lock(&dir_f->sem);
92 /* NB: The 2.2 backport will need to explicitly check for '.' and '..' here */
93 for (fd_list = dir_f->dents; fd_list && fd_list->nhash <= target->d_name.hash; fd_list = fd_list->next) {
94 if (fd_list->nhash == target->d_name.hash &&
95 (!fd || fd_list->version > fd->version) &&
96 strlen(fd_list->name) == target->d_name.len &&
97 !strncmp(fd_list->name, target->d_name.name, target->d_name.len)) {
98 fd = fd_list;
101 if (fd)
102 ino = fd->ino;
103 mutex_unlock(&dir_f->sem);
104 if (ino) {
105 inode = jffs2_iget(dir_i->i_sb, ino);
106 if (IS_ERR(inode)) {
107 printk(KERN_WARNING "iget() failed for ino #%u\n", ino);
108 return ERR_CAST(inode);
112 return d_splice_alias(inode, target);
115 /***********************************************************************/
118 static int jffs2_readdir(struct file *filp, void *dirent, filldir_t filldir)
120 struct jffs2_inode_info *f;
121 struct jffs2_sb_info *c;
122 struct inode *inode = filp->f_path.dentry->d_inode;
123 struct jffs2_full_dirent *fd;
124 unsigned long offset, curofs;
126 D1(printk(KERN_DEBUG "jffs2_readdir() for dir_i #%lu\n", filp->f_path.dentry->d_inode->i_ino));
128 f = JFFS2_INODE_INFO(inode);
129 c = JFFS2_SB_INFO(inode->i_sb);
131 offset = filp->f_pos;
133 if (offset == 0) {
134 D1(printk(KERN_DEBUG "Dirent 0: \".\", ino #%lu\n", inode->i_ino));
135 if (filldir(dirent, ".", 1, 0, inode->i_ino, DT_DIR) < 0)
136 goto out;
137 offset++;
139 if (offset == 1) {
140 unsigned long pino = parent_ino(filp->f_path.dentry);
141 D1(printk(KERN_DEBUG "Dirent 1: \"..\", ino #%lu\n", pino));
142 if (filldir(dirent, "..", 2, 1, pino, DT_DIR) < 0)
143 goto out;
144 offset++;
147 curofs=1;
148 mutex_lock(&f->sem);
149 for (fd = f->dents; fd; fd = fd->next) {
151 curofs++;
152 /* First loop: curofs = 2; offset = 2 */
153 if (curofs < offset) {
154 D2(printk(KERN_DEBUG "Skipping dirent: \"%s\", ino #%u, type %d, because curofs %ld < offset %ld\n",
155 fd->name, fd->ino, fd->type, curofs, offset));
156 continue;
158 if (!fd->ino) {
159 D2(printk(KERN_DEBUG "Skipping deletion dirent \"%s\"\n", fd->name));
160 offset++;
161 continue;
163 D2(printk(KERN_DEBUG "Dirent %ld: \"%s\", ino #%u, type %d\n", offset, fd->name, fd->ino, fd->type));
164 if (filldir(dirent, fd->name, strlen(fd->name), offset, fd->ino, fd->type) < 0)
165 break;
166 offset++;
168 mutex_unlock(&f->sem);
169 out:
170 filp->f_pos = offset;
171 return 0;
174 /***********************************************************************/
177 static int jffs2_create(struct inode *dir_i, struct dentry *dentry, int mode,
178 struct nameidata *nd)
180 struct jffs2_raw_inode *ri;
181 struct jffs2_inode_info *f, *dir_f;
182 struct jffs2_sb_info *c;
183 struct inode *inode;
184 int ret;
186 ri = jffs2_alloc_raw_inode();
187 if (!ri)
188 return -ENOMEM;
190 c = JFFS2_SB_INFO(dir_i->i_sb);
192 D1(printk(KERN_DEBUG "jffs2_create()\n"));
194 inode = jffs2_new_inode(dir_i, mode, ri);
196 if (IS_ERR(inode)) {
197 D1(printk(KERN_DEBUG "jffs2_new_inode() failed\n"));
198 jffs2_free_raw_inode(ri);
199 return PTR_ERR(inode);
202 inode->i_op = &jffs2_file_inode_operations;
203 inode->i_fop = &jffs2_file_operations;
204 inode->i_mapping->a_ops = &jffs2_file_address_operations;
205 inode->i_mapping->nrpages = 0;
207 f = JFFS2_INODE_INFO(inode);
208 dir_f = JFFS2_INODE_INFO(dir_i);
210 /* jffs2_do_create() will want to lock it, _after_ reserving
211 space and taking c-alloc_sem. If we keep it locked here,
212 lockdep gets unhappy (although it's a false positive;
213 nothing else will be looking at this inode yet so there's
214 no chance of AB-BA deadlock involving its f->sem). */
215 mutex_unlock(&f->sem);
217 ret = jffs2_do_create(c, dir_f, f, ri,
218 dentry->d_name.name, dentry->d_name.len);
219 if (ret)
220 goto fail;
222 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(ri->ctime));
224 jffs2_free_raw_inode(ri);
225 d_instantiate(dentry, inode);
227 D1(printk(KERN_DEBUG "jffs2_create: Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n",
228 inode->i_ino, inode->i_mode, inode->i_nlink,
229 f->inocache->pino_nlink, inode->i_mapping->nrpages));
230 return 0;
232 fail:
233 make_bad_inode(inode);
234 iput(inode);
235 jffs2_free_raw_inode(ri);
236 return ret;
239 /***********************************************************************/
242 static int jffs2_unlink(struct inode *dir_i, struct dentry *dentry)
244 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
245 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
246 struct jffs2_inode_info *dead_f = JFFS2_INODE_INFO(dentry->d_inode);
247 int ret;
248 uint32_t now = get_seconds();
250 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
251 dentry->d_name.len, dead_f, now);
252 if (dead_f->inocache)
253 dentry->d_inode->i_nlink = dead_f->inocache->pino_nlink;
254 if (!ret)
255 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
256 return ret;
258 /***********************************************************************/
261 static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct dentry *dentry)
263 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dentry->d_inode->i_sb);
264 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
265 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
266 int ret;
267 uint8_t type;
268 uint32_t now;
270 /* Don't let people make hard links to bad inodes. */
271 if (!f->inocache)
272 return -EIO;
274 if (S_ISDIR(old_dentry->d_inode->i_mode))
275 return -EPERM;
277 /* XXX: This is ugly */
278 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
279 if (!type) type = DT_REG;
281 now = get_seconds();
282 ret = jffs2_do_link(c, dir_f, f->inocache->ino, type, dentry->d_name.name, dentry->d_name.len, now);
284 if (!ret) {
285 mutex_lock(&f->sem);
286 old_dentry->d_inode->i_nlink = ++f->inocache->pino_nlink;
287 mutex_unlock(&f->sem);
288 d_instantiate(dentry, old_dentry->d_inode);
289 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
290 atomic_inc(&old_dentry->d_inode->i_count);
292 return ret;
295 /***********************************************************************/
297 static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char *target)
299 struct jffs2_inode_info *f, *dir_f;
300 struct jffs2_sb_info *c;
301 struct inode *inode;
302 struct jffs2_raw_inode *ri;
303 struct jffs2_raw_dirent *rd;
304 struct jffs2_full_dnode *fn;
305 struct jffs2_full_dirent *fd;
306 int namelen;
307 uint32_t alloclen;
308 int ret, targetlen = strlen(target);
310 /* FIXME: If you care. We'd need to use frags for the target
311 if it grows much more than this */
312 if (targetlen > 254)
313 return -ENAMETOOLONG;
315 ri = jffs2_alloc_raw_inode();
317 if (!ri)
318 return -ENOMEM;
320 c = JFFS2_SB_INFO(dir_i->i_sb);
322 /* Try to reserve enough space for both node and dirent.
323 * Just the node will do for now, though
325 namelen = dentry->d_name.len;
326 ret = jffs2_reserve_space(c, sizeof(*ri) + targetlen, &alloclen,
327 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
329 if (ret) {
330 jffs2_free_raw_inode(ri);
331 return ret;
334 inode = jffs2_new_inode(dir_i, S_IFLNK | S_IRWXUGO, ri);
336 if (IS_ERR(inode)) {
337 jffs2_free_raw_inode(ri);
338 jffs2_complete_reservation(c);
339 return PTR_ERR(inode);
342 inode->i_op = &jffs2_symlink_inode_operations;
344 f = JFFS2_INODE_INFO(inode);
346 inode->i_size = targetlen;
347 ri->isize = ri->dsize = ri->csize = cpu_to_je32(inode->i_size);
348 ri->totlen = cpu_to_je32(sizeof(*ri) + inode->i_size);
349 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
351 ri->compr = JFFS2_COMPR_NONE;
352 ri->data_crc = cpu_to_je32(crc32(0, target, targetlen));
353 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
355 fn = jffs2_write_dnode(c, f, ri, target, targetlen, ALLOC_NORMAL);
357 jffs2_free_raw_inode(ri);
359 if (IS_ERR(fn)) {
360 /* Eeek. Wave bye bye */
361 mutex_unlock(&f->sem);
362 jffs2_complete_reservation(c);
363 jffs2_clear_inode(inode);
364 return PTR_ERR(fn);
367 /* We use f->target field to store the target path. */
368 f->target = kmalloc(targetlen + 1, GFP_KERNEL);
369 if (!f->target) {
370 printk(KERN_WARNING "Can't allocate %d bytes of memory\n", targetlen + 1);
371 mutex_unlock(&f->sem);
372 jffs2_complete_reservation(c);
373 jffs2_clear_inode(inode);
374 return -ENOMEM;
377 memcpy(f->target, target, targetlen + 1);
378 D1(printk(KERN_DEBUG "jffs2_symlink: symlink's target '%s' cached\n", (char *)f->target));
380 /* No data here. Only a metadata node, which will be
381 obsoleted by the first data write
383 f->metadata = fn;
384 mutex_unlock(&f->sem);
386 jffs2_complete_reservation(c);
388 ret = jffs2_init_security(inode, dir_i);
389 if (ret) {
390 jffs2_clear_inode(inode);
391 return ret;
393 ret = jffs2_init_acl_post(inode);
394 if (ret) {
395 jffs2_clear_inode(inode);
396 return ret;
399 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
400 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
401 if (ret) {
402 /* Eep. */
403 jffs2_clear_inode(inode);
404 return ret;
407 rd = jffs2_alloc_raw_dirent();
408 if (!rd) {
409 /* Argh. Now we treat it like a normal delete */
410 jffs2_complete_reservation(c);
411 jffs2_clear_inode(inode);
412 return -ENOMEM;
415 dir_f = JFFS2_INODE_INFO(dir_i);
416 mutex_lock(&dir_f->sem);
418 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
419 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
420 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
421 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
423 rd->pino = cpu_to_je32(dir_i->i_ino);
424 rd->version = cpu_to_je32(++dir_f->highest_version);
425 rd->ino = cpu_to_je32(inode->i_ino);
426 rd->mctime = cpu_to_je32(get_seconds());
427 rd->nsize = namelen;
428 rd->type = DT_LNK;
429 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
430 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
432 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
434 if (IS_ERR(fd)) {
435 /* dirent failed to write. Delete the inode normally
436 as if it were the final unlink() */
437 jffs2_complete_reservation(c);
438 jffs2_free_raw_dirent(rd);
439 mutex_unlock(&dir_f->sem);
440 jffs2_clear_inode(inode);
441 return PTR_ERR(fd);
444 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
446 jffs2_free_raw_dirent(rd);
448 /* Link the fd into the inode's list, obsoleting an old
449 one if necessary. */
450 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
452 mutex_unlock(&dir_f->sem);
453 jffs2_complete_reservation(c);
455 d_instantiate(dentry, inode);
456 return 0;
460 static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode)
462 struct jffs2_inode_info *f, *dir_f;
463 struct jffs2_sb_info *c;
464 struct inode *inode;
465 struct jffs2_raw_inode *ri;
466 struct jffs2_raw_dirent *rd;
467 struct jffs2_full_dnode *fn;
468 struct jffs2_full_dirent *fd;
469 int namelen;
470 uint32_t alloclen;
471 int ret;
473 mode |= S_IFDIR;
475 ri = jffs2_alloc_raw_inode();
476 if (!ri)
477 return -ENOMEM;
479 c = JFFS2_SB_INFO(dir_i->i_sb);
481 /* Try to reserve enough space for both node and dirent.
482 * Just the node will do for now, though
484 namelen = dentry->d_name.len;
485 ret = jffs2_reserve_space(c, sizeof(*ri), &alloclen, ALLOC_NORMAL,
486 JFFS2_SUMMARY_INODE_SIZE);
488 if (ret) {
489 jffs2_free_raw_inode(ri);
490 return ret;
493 inode = jffs2_new_inode(dir_i, mode, ri);
495 if (IS_ERR(inode)) {
496 jffs2_free_raw_inode(ri);
497 jffs2_complete_reservation(c);
498 return PTR_ERR(inode);
501 inode->i_op = &jffs2_dir_inode_operations;
502 inode->i_fop = &jffs2_dir_operations;
504 f = JFFS2_INODE_INFO(inode);
506 /* Directories get nlink 2 at start */
507 inode->i_nlink = 2;
508 /* but ic->pino_nlink is the parent ino# */
509 f->inocache->pino_nlink = dir_i->i_ino;
511 ri->data_crc = cpu_to_je32(0);
512 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
514 fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL);
516 jffs2_free_raw_inode(ri);
518 if (IS_ERR(fn)) {
519 /* Eeek. Wave bye bye */
520 mutex_unlock(&f->sem);
521 jffs2_complete_reservation(c);
522 jffs2_clear_inode(inode);
523 return PTR_ERR(fn);
525 /* No data here. Only a metadata node, which will be
526 obsoleted by the first data write
528 f->metadata = fn;
529 mutex_unlock(&f->sem);
531 jffs2_complete_reservation(c);
533 ret = jffs2_init_security(inode, dir_i);
534 if (ret) {
535 jffs2_clear_inode(inode);
536 return ret;
538 ret = jffs2_init_acl_post(inode);
539 if (ret) {
540 jffs2_clear_inode(inode);
541 return ret;
544 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
545 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
546 if (ret) {
547 /* Eep. */
548 jffs2_clear_inode(inode);
549 return ret;
552 rd = jffs2_alloc_raw_dirent();
553 if (!rd) {
554 /* Argh. Now we treat it like a normal delete */
555 jffs2_complete_reservation(c);
556 jffs2_clear_inode(inode);
557 return -ENOMEM;
560 dir_f = JFFS2_INODE_INFO(dir_i);
561 mutex_lock(&dir_f->sem);
563 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
564 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
565 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
566 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
568 rd->pino = cpu_to_je32(dir_i->i_ino);
569 rd->version = cpu_to_je32(++dir_f->highest_version);
570 rd->ino = cpu_to_je32(inode->i_ino);
571 rd->mctime = cpu_to_je32(get_seconds());
572 rd->nsize = namelen;
573 rd->type = DT_DIR;
574 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
575 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
577 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
579 if (IS_ERR(fd)) {
580 /* dirent failed to write. Delete the inode normally
581 as if it were the final unlink() */
582 jffs2_complete_reservation(c);
583 jffs2_free_raw_dirent(rd);
584 mutex_unlock(&dir_f->sem);
585 jffs2_clear_inode(inode);
586 return PTR_ERR(fd);
589 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
590 inc_nlink(dir_i);
592 jffs2_free_raw_dirent(rd);
594 /* Link the fd into the inode's list, obsoleting an old
595 one if necessary. */
596 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
598 mutex_unlock(&dir_f->sem);
599 jffs2_complete_reservation(c);
601 d_instantiate(dentry, inode);
602 return 0;
605 static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
607 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
608 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
609 struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
610 struct jffs2_full_dirent *fd;
611 int ret;
612 uint32_t now = get_seconds();
614 for (fd = f->dents ; fd; fd = fd->next) {
615 if (fd->ino)
616 return -ENOTEMPTY;
619 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
620 dentry->d_name.len, f, now);
621 if (!ret) {
622 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
623 clear_nlink(dentry->d_inode);
624 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 int ret;
644 if (!new_valid_dev(rdev))
645 return -EINVAL;
647 ri = jffs2_alloc_raw_inode();
648 if (!ri)
649 return -ENOMEM;
651 c = JFFS2_SB_INFO(dir_i->i_sb);
653 if (S_ISBLK(mode) || S_ISCHR(mode))
654 devlen = jffs2_encode_dev(&dev, rdev);
656 /* Try to reserve enough space for both node and dirent.
657 * Just the node will do for now, though
659 namelen = dentry->d_name.len;
660 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &alloclen,
661 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
663 if (ret) {
664 jffs2_free_raw_inode(ri);
665 return ret;
668 inode = jffs2_new_inode(dir_i, mode, ri);
670 if (IS_ERR(inode)) {
671 jffs2_free_raw_inode(ri);
672 jffs2_complete_reservation(c);
673 return PTR_ERR(inode);
675 inode->i_op = &jffs2_file_inode_operations;
676 init_special_inode(inode, inode->i_mode, rdev);
678 f = JFFS2_INODE_INFO(inode);
680 ri->dsize = ri->csize = cpu_to_je32(devlen);
681 ri->totlen = cpu_to_je32(sizeof(*ri) + devlen);
682 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
684 ri->compr = JFFS2_COMPR_NONE;
685 ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen));
686 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
688 fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, ALLOC_NORMAL);
690 jffs2_free_raw_inode(ri);
692 if (IS_ERR(fn)) {
693 /* Eeek. Wave bye bye */
694 mutex_unlock(&f->sem);
695 jffs2_complete_reservation(c);
696 jffs2_clear_inode(inode);
697 return PTR_ERR(fn);
699 /* No data here. Only a metadata node, which will be
700 obsoleted by the first data write
702 f->metadata = fn;
703 mutex_unlock(&f->sem);
705 jffs2_complete_reservation(c);
707 ret = jffs2_init_security(inode, dir_i);
708 if (ret) {
709 jffs2_clear_inode(inode);
710 return ret;
712 ret = jffs2_init_acl_post(inode);
713 if (ret) {
714 jffs2_clear_inode(inode);
715 return ret;
718 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
719 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
720 if (ret) {
721 /* Eep. */
722 jffs2_clear_inode(inode);
723 return ret;
726 rd = jffs2_alloc_raw_dirent();
727 if (!rd) {
728 /* Argh. Now we treat it like a normal delete */
729 jffs2_complete_reservation(c);
730 jffs2_clear_inode(inode);
731 return -ENOMEM;
734 dir_f = JFFS2_INODE_INFO(dir_i);
735 mutex_lock(&dir_f->sem);
737 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
738 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
739 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
740 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
742 rd->pino = cpu_to_je32(dir_i->i_ino);
743 rd->version = cpu_to_je32(++dir_f->highest_version);
744 rd->ino = cpu_to_je32(inode->i_ino);
745 rd->mctime = cpu_to_je32(get_seconds());
746 rd->nsize = namelen;
748 /* XXX: This is ugly. */
749 rd->type = (mode & S_IFMT) >> 12;
751 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
752 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
754 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
756 if (IS_ERR(fd)) {
757 /* dirent failed to write. Delete the inode normally
758 as if it were the final unlink() */
759 jffs2_complete_reservation(c);
760 jffs2_free_raw_dirent(rd);
761 mutex_unlock(&dir_f->sem);
762 jffs2_clear_inode(inode);
763 return PTR_ERR(fd);
766 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
768 jffs2_free_raw_dirent(rd);
770 /* Link the fd into the inode's list, obsoleting an old
771 one if necessary. */
772 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
774 mutex_unlock(&dir_f->sem);
775 jffs2_complete_reservation(c);
777 d_instantiate(dentry, inode);
779 return 0;
782 static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
783 struct inode *new_dir_i, struct dentry *new_dentry)
785 int ret;
786 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
787 struct jffs2_inode_info *victim_f = NULL;
788 uint8_t type;
789 uint32_t now;
791 /* The VFS will check for us and prevent trying to rename a
792 * file over a directory and vice versa, but if it's a directory,
793 * the VFS can't check whether the victim is empty. The filesystem
794 * needs to do that for itself.
796 if (new_dentry->d_inode) {
797 victim_f = JFFS2_INODE_INFO(new_dentry->d_inode);
798 if (S_ISDIR(new_dentry->d_inode->i_mode)) {
799 struct jffs2_full_dirent *fd;
801 mutex_lock(&victim_f->sem);
802 for (fd = victim_f->dents; fd; fd = fd->next) {
803 if (fd->ino) {
804 mutex_unlock(&victim_f->sem);
805 return -ENOTEMPTY;
808 mutex_unlock(&victim_f->sem);
812 /* XXX: We probably ought to alloc enough space for
813 both nodes at the same time. Writing the new link,
814 then getting -ENOSPC, is quite bad :)
817 /* Make a hard link */
819 /* XXX: This is ugly */
820 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
821 if (!type) type = DT_REG;
823 now = get_seconds();
824 ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i),
825 old_dentry->d_inode->i_ino, type,
826 new_dentry->d_name.name, new_dentry->d_name.len, now);
828 if (ret)
829 return ret;
831 if (victim_f) {
832 /* There was a victim. Kill it off nicely */
833 drop_nlink(new_dentry->d_inode);
834 /* Don't oops if the victim was a dirent pointing to an
835 inode which didn't exist. */
836 if (victim_f->inocache) {
837 mutex_lock(&victim_f->sem);
838 if (S_ISDIR(new_dentry->d_inode->i_mode))
839 victim_f->inocache->pino_nlink = 0;
840 else
841 victim_f->inocache->pino_nlink--;
842 mutex_unlock(&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 mutex_lock(&f->sem);
861 inc_nlink(old_dentry->d_inode);
862 if (f->inocache && !S_ISDIR(old_dentry->d_inode->i_mode))
863 f->inocache->pino_nlink++;
864 mutex_unlock(&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;