OMAPDSS: VENC: fix NULL pointer dereference in DSS2 VENC sysfs debug attr on OMAP4
[zen-stable.git] / fs / jffs2 / dir.c
blob973ac5822bd7814cd8f4e6d43ae31c2a3b3f6d84
1 /*
2 * JFFS2 -- Journalling Flash File System, Version 2.
4 * Copyright © 2001-2007 Red Hat, Inc.
5 * Copyright © 2004-2010 David Woodhouse <dwmw2@infradead.org>
7 * Created by David Woodhouse <dwmw2@infradead.org>
9 * For licensing information, see the file 'LICENCE' in this directory.
13 #include <linux/kernel.h>
14 #include <linux/slab.h>
15 #include <linux/fs.h>
16 #include <linux/crc32.h>
17 #include <linux/jffs2.h>
18 #include "jffs2_fs_i.h"
19 #include "jffs2_fs_sb.h"
20 #include <linux/time.h>
21 #include "nodelist.h"
23 static int jffs2_readdir (struct file *, void *, filldir_t);
25 static int jffs2_create (struct inode *,struct dentry *,umode_t,
26 struct nameidata *);
27 static struct dentry *jffs2_lookup (struct inode *,struct dentry *,
28 struct nameidata *);
29 static int jffs2_link (struct dentry *,struct inode *,struct dentry *);
30 static int jffs2_unlink (struct inode *,struct dentry *);
31 static int jffs2_symlink (struct inode *,struct dentry *,const char *);
32 static int jffs2_mkdir (struct inode *,struct dentry *,umode_t);
33 static int jffs2_rmdir (struct inode *,struct dentry *);
34 static int jffs2_mknod (struct inode *,struct dentry *,umode_t,dev_t);
35 static int jffs2_rename (struct inode *, struct dentry *,
36 struct inode *, struct dentry *);
38 const struct file_operations jffs2_dir_operations =
40 .read = generic_read_dir,
41 .readdir = jffs2_readdir,
42 .unlocked_ioctl=jffs2_ioctl,
43 .fsync = jffs2_fsync,
44 .llseek = generic_file_llseek,
48 const struct inode_operations jffs2_dir_inode_operations =
50 .create = jffs2_create,
51 .lookup = jffs2_lookup,
52 .link = jffs2_link,
53 .unlink = jffs2_unlink,
54 .symlink = jffs2_symlink,
55 .mkdir = jffs2_mkdir,
56 .rmdir = jffs2_rmdir,
57 .mknod = jffs2_mknod,
58 .rename = jffs2_rename,
59 .get_acl = jffs2_get_acl,
60 .setattr = jffs2_setattr,
61 .setxattr = jffs2_setxattr,
62 .getxattr = jffs2_getxattr,
63 .listxattr = jffs2_listxattr,
64 .removexattr = jffs2_removexattr
67 /***********************************************************************/
70 /* We keep the dirent list sorted in increasing order of name hash,
71 and we use the same hash function as the dentries. Makes this
72 nice and simple
74 static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target,
75 struct nameidata *nd)
77 struct jffs2_inode_info *dir_f;
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);
89 mutex_lock(&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 mutex_unlock(&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);
109 return d_splice_alias(inode, target);
112 /***********************************************************************/
115 static int jffs2_readdir(struct file *filp, void *dirent, filldir_t filldir)
117 struct jffs2_inode_info *f;
118 struct inode *inode = filp->f_path.dentry->d_inode;
119 struct jffs2_full_dirent *fd;
120 unsigned long offset, curofs;
122 D1(printk(KERN_DEBUG "jffs2_readdir() for dir_i #%lu\n", filp->f_path.dentry->d_inode->i_ino));
124 f = JFFS2_INODE_INFO(inode);
126 offset = filp->f_pos;
128 if (offset == 0) {
129 D1(printk(KERN_DEBUG "Dirent 0: \".\", ino #%lu\n", inode->i_ino));
130 if (filldir(dirent, ".", 1, 0, inode->i_ino, DT_DIR) < 0)
131 goto out;
132 offset++;
134 if (offset == 1) {
135 unsigned long pino = parent_ino(filp->f_path.dentry);
136 D1(printk(KERN_DEBUG "Dirent 1: \"..\", ino #%lu\n", pino));
137 if (filldir(dirent, "..", 2, 1, pino, DT_DIR) < 0)
138 goto out;
139 offset++;
142 curofs=1;
143 mutex_lock(&f->sem);
144 for (fd = f->dents; fd; fd = fd->next) {
146 curofs++;
147 /* First loop: curofs = 2; offset = 2 */
148 if (curofs < offset) {
149 D2(printk(KERN_DEBUG "Skipping dirent: \"%s\", ino #%u, type %d, because curofs %ld < offset %ld\n",
150 fd->name, fd->ino, fd->type, curofs, offset));
151 continue;
153 if (!fd->ino) {
154 D2(printk(KERN_DEBUG "Skipping deletion dirent \"%s\"\n", fd->name));
155 offset++;
156 continue;
158 D2(printk(KERN_DEBUG "Dirent %ld: \"%s\", ino #%u, type %d\n", offset, fd->name, fd->ino, fd->type));
159 if (filldir(dirent, fd->name, strlen(fd->name), offset, fd->ino, fd->type) < 0)
160 break;
161 offset++;
163 mutex_unlock(&f->sem);
164 out:
165 filp->f_pos = offset;
166 return 0;
169 /***********************************************************************/
172 static int jffs2_create(struct inode *dir_i, struct dentry *dentry,
173 umode_t mode, struct nameidata *nd)
175 struct jffs2_raw_inode *ri;
176 struct jffs2_inode_info *f, *dir_f;
177 struct jffs2_sb_info *c;
178 struct inode *inode;
179 int ret;
181 ri = jffs2_alloc_raw_inode();
182 if (!ri)
183 return -ENOMEM;
185 c = JFFS2_SB_INFO(dir_i->i_sb);
187 D1(printk(KERN_DEBUG "jffs2_create()\n"));
189 inode = jffs2_new_inode(dir_i, mode, ri);
191 if (IS_ERR(inode)) {
192 D1(printk(KERN_DEBUG "jffs2_new_inode() failed\n"));
193 jffs2_free_raw_inode(ri);
194 return PTR_ERR(inode);
197 inode->i_op = &jffs2_file_inode_operations;
198 inode->i_fop = &jffs2_file_operations;
199 inode->i_mapping->a_ops = &jffs2_file_address_operations;
200 inode->i_mapping->nrpages = 0;
202 f = JFFS2_INODE_INFO(inode);
203 dir_f = JFFS2_INODE_INFO(dir_i);
205 /* jffs2_do_create() will want to lock it, _after_ reserving
206 space and taking c-alloc_sem. If we keep it locked here,
207 lockdep gets unhappy (although it's a false positive;
208 nothing else will be looking at this inode yet so there's
209 no chance of AB-BA deadlock involving its f->sem). */
210 mutex_unlock(&f->sem);
212 ret = jffs2_do_create(c, dir_f, f, ri, &dentry->d_name);
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);
220 D1(printk(KERN_DEBUG "jffs2_create: Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n",
221 inode->i_ino, inode->i_mode, inode->i_nlink,
222 f->inocache->pino_nlink, inode->i_mapping->nrpages));
224 d_instantiate(dentry, inode);
225 unlock_new_inode(inode);
226 return 0;
228 fail:
229 iget_failed(inode);
230 jffs2_free_raw_inode(ri);
231 return ret;
234 /***********************************************************************/
237 static int jffs2_unlink(struct inode *dir_i, struct dentry *dentry)
239 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
240 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
241 struct jffs2_inode_info *dead_f = JFFS2_INODE_INFO(dentry->d_inode);
242 int ret;
243 uint32_t now = get_seconds();
245 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
246 dentry->d_name.len, dead_f, now);
247 if (dead_f->inocache)
248 set_nlink(dentry->d_inode, dead_f->inocache->pino_nlink);
249 if (!ret)
250 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
251 return ret;
253 /***********************************************************************/
256 static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct dentry *dentry)
258 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dentry->d_inode->i_sb);
259 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
260 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
261 int ret;
262 uint8_t type;
263 uint32_t now;
265 /* Don't let people make hard links to bad inodes. */
266 if (!f->inocache)
267 return -EIO;
269 if (S_ISDIR(old_dentry->d_inode->i_mode))
270 return -EPERM;
272 /* XXX: This is ugly */
273 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
274 if (!type) type = DT_REG;
276 now = get_seconds();
277 ret = jffs2_do_link(c, dir_f, f->inocache->ino, type, dentry->d_name.name, dentry->d_name.len, now);
279 if (!ret) {
280 mutex_lock(&f->sem);
281 set_nlink(old_dentry->d_inode, ++f->inocache->pino_nlink);
282 mutex_unlock(&f->sem);
283 d_instantiate(dentry, old_dentry->d_inode);
284 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
285 ihold(old_dentry->d_inode);
287 return ret;
290 /***********************************************************************/
292 static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char *target)
294 struct jffs2_inode_info *f, *dir_f;
295 struct jffs2_sb_info *c;
296 struct inode *inode;
297 struct jffs2_raw_inode *ri;
298 struct jffs2_raw_dirent *rd;
299 struct jffs2_full_dnode *fn;
300 struct jffs2_full_dirent *fd;
301 int namelen;
302 uint32_t alloclen;
303 int ret, targetlen = strlen(target);
305 /* FIXME: If you care. We'd need to use frags for the target
306 if it grows much more than this */
307 if (targetlen > 254)
308 return -ENAMETOOLONG;
310 ri = jffs2_alloc_raw_inode();
312 if (!ri)
313 return -ENOMEM;
315 c = JFFS2_SB_INFO(dir_i->i_sb);
317 /* Try to reserve enough space for both node and dirent.
318 * Just the node will do for now, though
320 namelen = dentry->d_name.len;
321 ret = jffs2_reserve_space(c, sizeof(*ri) + targetlen, &alloclen,
322 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
324 if (ret) {
325 jffs2_free_raw_inode(ri);
326 return ret;
329 inode = jffs2_new_inode(dir_i, S_IFLNK | S_IRWXUGO, ri);
331 if (IS_ERR(inode)) {
332 jffs2_free_raw_inode(ri);
333 jffs2_complete_reservation(c);
334 return PTR_ERR(inode);
337 inode->i_op = &jffs2_symlink_inode_operations;
339 f = JFFS2_INODE_INFO(inode);
341 inode->i_size = targetlen;
342 ri->isize = ri->dsize = ri->csize = cpu_to_je32(inode->i_size);
343 ri->totlen = cpu_to_je32(sizeof(*ri) + inode->i_size);
344 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
346 ri->compr = JFFS2_COMPR_NONE;
347 ri->data_crc = cpu_to_je32(crc32(0, target, targetlen));
348 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
350 fn = jffs2_write_dnode(c, f, ri, target, targetlen, ALLOC_NORMAL);
352 jffs2_free_raw_inode(ri);
354 if (IS_ERR(fn)) {
355 /* Eeek. Wave bye bye */
356 mutex_unlock(&f->sem);
357 jffs2_complete_reservation(c);
358 ret = PTR_ERR(fn);
359 goto fail;
362 /* We use f->target field to store the target path. */
363 f->target = kmemdup(target, targetlen + 1, GFP_KERNEL);
364 if (!f->target) {
365 printk(KERN_WARNING "Can't allocate %d bytes of memory\n", targetlen + 1);
366 mutex_unlock(&f->sem);
367 jffs2_complete_reservation(c);
368 ret = -ENOMEM;
369 goto fail;
372 D1(printk(KERN_DEBUG "jffs2_symlink: symlink's target '%s' cached\n", (char *)f->target));
374 /* No data here. Only a metadata node, which will be
375 obsoleted by the first data write
377 f->metadata = fn;
378 mutex_unlock(&f->sem);
380 jffs2_complete_reservation(c);
382 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
383 if (ret)
384 goto fail;
386 ret = jffs2_init_acl_post(inode);
387 if (ret)
388 goto fail;
390 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
391 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
392 if (ret)
393 goto fail;
395 rd = jffs2_alloc_raw_dirent();
396 if (!rd) {
397 /* Argh. Now we treat it like a normal delete */
398 jffs2_complete_reservation(c);
399 ret = -ENOMEM;
400 goto fail;
403 dir_f = JFFS2_INODE_INFO(dir_i);
404 mutex_lock(&dir_f->sem);
406 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
407 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
408 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
409 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
411 rd->pino = cpu_to_je32(dir_i->i_ino);
412 rd->version = cpu_to_je32(++dir_f->highest_version);
413 rd->ino = cpu_to_je32(inode->i_ino);
414 rd->mctime = cpu_to_je32(get_seconds());
415 rd->nsize = namelen;
416 rd->type = DT_LNK;
417 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
418 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
420 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
422 if (IS_ERR(fd)) {
423 /* dirent failed to write. Delete the inode normally
424 as if it were the final unlink() */
425 jffs2_complete_reservation(c);
426 jffs2_free_raw_dirent(rd);
427 mutex_unlock(&dir_f->sem);
428 ret = PTR_ERR(fd);
429 goto fail;
432 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
434 jffs2_free_raw_dirent(rd);
436 /* Link the fd into the inode's list, obsoleting an old
437 one if necessary. */
438 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
440 mutex_unlock(&dir_f->sem);
441 jffs2_complete_reservation(c);
443 d_instantiate(dentry, inode);
444 unlock_new_inode(inode);
445 return 0;
447 fail:
448 iget_failed(inode);
449 return ret;
453 static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, umode_t 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;
497 f = JFFS2_INODE_INFO(inode);
499 /* Directories get nlink 2 at start */
500 set_nlink(inode, 2);
501 /* but ic->pino_nlink is the parent ino# */
502 f->inocache->pino_nlink = dir_i->i_ino;
504 ri->data_crc = cpu_to_je32(0);
505 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
507 fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL);
509 jffs2_free_raw_inode(ri);
511 if (IS_ERR(fn)) {
512 /* Eeek. Wave bye bye */
513 mutex_unlock(&f->sem);
514 jffs2_complete_reservation(c);
515 ret = PTR_ERR(fn);
516 goto fail;
518 /* No data here. Only a metadata node, which will be
519 obsoleted by the first data write
521 f->metadata = fn;
522 mutex_unlock(&f->sem);
524 jffs2_complete_reservation(c);
526 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
527 if (ret)
528 goto fail;
530 ret = jffs2_init_acl_post(inode);
531 if (ret)
532 goto fail;
534 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
535 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
536 if (ret)
537 goto fail;
539 rd = jffs2_alloc_raw_dirent();
540 if (!rd) {
541 /* Argh. Now we treat it like a normal delete */
542 jffs2_complete_reservation(c);
543 ret = -ENOMEM;
544 goto fail;
547 dir_f = JFFS2_INODE_INFO(dir_i);
548 mutex_lock(&dir_f->sem);
550 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
551 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
552 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
553 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
555 rd->pino = cpu_to_je32(dir_i->i_ino);
556 rd->version = cpu_to_je32(++dir_f->highest_version);
557 rd->ino = cpu_to_je32(inode->i_ino);
558 rd->mctime = cpu_to_je32(get_seconds());
559 rd->nsize = namelen;
560 rd->type = DT_DIR;
561 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
562 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
564 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
566 if (IS_ERR(fd)) {
567 /* dirent failed to write. Delete the inode normally
568 as if it were the final unlink() */
569 jffs2_complete_reservation(c);
570 jffs2_free_raw_dirent(rd);
571 mutex_unlock(&dir_f->sem);
572 ret = PTR_ERR(fd);
573 goto fail;
576 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
577 inc_nlink(dir_i);
579 jffs2_free_raw_dirent(rd);
581 /* Link the fd into the inode's list, obsoleting an old
582 one if necessary. */
583 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
585 mutex_unlock(&dir_f->sem);
586 jffs2_complete_reservation(c);
588 d_instantiate(dentry, inode);
589 unlock_new_inode(inode);
590 return 0;
592 fail:
593 iget_failed(inode);
594 return ret;
597 static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
599 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
600 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
601 struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
602 struct jffs2_full_dirent *fd;
603 int ret;
604 uint32_t now = get_seconds();
606 for (fd = f->dents ; fd; fd = fd->next) {
607 if (fd->ino)
608 return -ENOTEMPTY;
611 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
612 dentry->d_name.len, f, now);
613 if (!ret) {
614 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
615 clear_nlink(dentry->d_inode);
616 drop_nlink(dir_i);
618 return ret;
621 static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, umode_t mode, dev_t rdev)
623 struct jffs2_inode_info *f, *dir_f;
624 struct jffs2_sb_info *c;
625 struct inode *inode;
626 struct jffs2_raw_inode *ri;
627 struct jffs2_raw_dirent *rd;
628 struct jffs2_full_dnode *fn;
629 struct jffs2_full_dirent *fd;
630 int namelen;
631 union jffs2_device_node dev;
632 int devlen = 0;
633 uint32_t alloclen;
634 int ret;
636 if (!new_valid_dev(rdev))
637 return -EINVAL;
639 ri = jffs2_alloc_raw_inode();
640 if (!ri)
641 return -ENOMEM;
643 c = JFFS2_SB_INFO(dir_i->i_sb);
645 if (S_ISBLK(mode) || S_ISCHR(mode))
646 devlen = jffs2_encode_dev(&dev, rdev);
648 /* Try to reserve enough space for both node and dirent.
649 * Just the node will do for now, though
651 namelen = dentry->d_name.len;
652 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &alloclen,
653 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
655 if (ret) {
656 jffs2_free_raw_inode(ri);
657 return ret;
660 inode = jffs2_new_inode(dir_i, mode, ri);
662 if (IS_ERR(inode)) {
663 jffs2_free_raw_inode(ri);
664 jffs2_complete_reservation(c);
665 return PTR_ERR(inode);
667 inode->i_op = &jffs2_file_inode_operations;
668 init_special_inode(inode, inode->i_mode, rdev);
670 f = JFFS2_INODE_INFO(inode);
672 ri->dsize = ri->csize = cpu_to_je32(devlen);
673 ri->totlen = cpu_to_je32(sizeof(*ri) + devlen);
674 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
676 ri->compr = JFFS2_COMPR_NONE;
677 ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen));
678 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
680 fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, ALLOC_NORMAL);
682 jffs2_free_raw_inode(ri);
684 if (IS_ERR(fn)) {
685 /* Eeek. Wave bye bye */
686 mutex_unlock(&f->sem);
687 jffs2_complete_reservation(c);
688 ret = PTR_ERR(fn);
689 goto fail;
691 /* No data here. Only a metadata node, which will be
692 obsoleted by the first data write
694 f->metadata = fn;
695 mutex_unlock(&f->sem);
697 jffs2_complete_reservation(c);
699 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
700 if (ret)
701 goto fail;
703 ret = jffs2_init_acl_post(inode);
704 if (ret)
705 goto fail;
707 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
708 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
709 if (ret)
710 goto fail;
712 rd = jffs2_alloc_raw_dirent();
713 if (!rd) {
714 /* Argh. Now we treat it like a normal delete */
715 jffs2_complete_reservation(c);
716 ret = -ENOMEM;
717 goto fail;
720 dir_f = JFFS2_INODE_INFO(dir_i);
721 mutex_lock(&dir_f->sem);
723 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
724 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
725 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
726 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
728 rd->pino = cpu_to_je32(dir_i->i_ino);
729 rd->version = cpu_to_je32(++dir_f->highest_version);
730 rd->ino = cpu_to_je32(inode->i_ino);
731 rd->mctime = cpu_to_je32(get_seconds());
732 rd->nsize = namelen;
734 /* XXX: This is ugly. */
735 rd->type = (mode & S_IFMT) >> 12;
737 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
738 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
740 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
742 if (IS_ERR(fd)) {
743 /* dirent failed to write. Delete the inode normally
744 as if it were the final unlink() */
745 jffs2_complete_reservation(c);
746 jffs2_free_raw_dirent(rd);
747 mutex_unlock(&dir_f->sem);
748 ret = PTR_ERR(fd);
749 goto fail;
752 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
754 jffs2_free_raw_dirent(rd);
756 /* Link the fd into the inode's list, obsoleting an old
757 one if necessary. */
758 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
760 mutex_unlock(&dir_f->sem);
761 jffs2_complete_reservation(c);
763 d_instantiate(dentry, inode);
764 unlock_new_inode(inode);
765 return 0;
767 fail:
768 iget_failed(inode);
769 return ret;
772 static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
773 struct inode *new_dir_i, struct dentry *new_dentry)
775 int ret;
776 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
777 struct jffs2_inode_info *victim_f = NULL;
778 uint8_t type;
779 uint32_t now;
781 /* The VFS will check for us and prevent trying to rename a
782 * file over a directory and vice versa, but if it's a directory,
783 * the VFS can't check whether the victim is empty. The filesystem
784 * needs to do that for itself.
786 if (new_dentry->d_inode) {
787 victim_f = JFFS2_INODE_INFO(new_dentry->d_inode);
788 if (S_ISDIR(new_dentry->d_inode->i_mode)) {
789 struct jffs2_full_dirent *fd;
791 mutex_lock(&victim_f->sem);
792 for (fd = victim_f->dents; fd; fd = fd->next) {
793 if (fd->ino) {
794 mutex_unlock(&victim_f->sem);
795 return -ENOTEMPTY;
798 mutex_unlock(&victim_f->sem);
802 /* XXX: We probably ought to alloc enough space for
803 both nodes at the same time. Writing the new link,
804 then getting -ENOSPC, is quite bad :)
807 /* Make a hard link */
809 /* XXX: This is ugly */
810 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
811 if (!type) type = DT_REG;
813 now = get_seconds();
814 ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i),
815 old_dentry->d_inode->i_ino, type,
816 new_dentry->d_name.name, new_dentry->d_name.len, now);
818 if (ret)
819 return ret;
821 if (victim_f) {
822 /* There was a victim. Kill it off nicely */
823 if (S_ISDIR(new_dentry->d_inode->i_mode))
824 clear_nlink(new_dentry->d_inode);
825 else
826 drop_nlink(new_dentry->d_inode);
827 /* Don't oops if the victim was a dirent pointing to an
828 inode which didn't exist. */
829 if (victim_f->inocache) {
830 mutex_lock(&victim_f->sem);
831 if (S_ISDIR(new_dentry->d_inode->i_mode))
832 victim_f->inocache->pino_nlink = 0;
833 else
834 victim_f->inocache->pino_nlink--;
835 mutex_unlock(&victim_f->sem);
839 /* If it was a directory we moved, and there was no victim,
840 increase i_nlink on its new parent */
841 if (S_ISDIR(old_dentry->d_inode->i_mode) && !victim_f)
842 inc_nlink(new_dir_i);
844 /* Unlink the original */
845 ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
846 old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
848 /* We don't touch inode->i_nlink */
850 if (ret) {
851 /* Oh shit. We really ought to make a single node which can do both atomically */
852 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
853 mutex_lock(&f->sem);
854 inc_nlink(old_dentry->d_inode);
855 if (f->inocache && !S_ISDIR(old_dentry->d_inode->i_mode))
856 f->inocache->pino_nlink++;
857 mutex_unlock(&f->sem);
859 printk(KERN_NOTICE "jffs2_rename(): Link succeeded, unlink failed (err %d). You now have a hard link\n", ret);
860 /* Might as well let the VFS know */
861 d_instantiate(new_dentry, old_dentry->d_inode);
862 ihold(old_dentry->d_inode);
863 new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now);
864 return ret;
867 if (S_ISDIR(old_dentry->d_inode->i_mode))
868 drop_nlink(old_dir_i);
870 new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
872 return 0;