hyperv: Add processing of MTU reduced by the host
[linux/fpc-iii.git] / fs / jffs2 / dir.c
blob938556025d643349b5166e54b5cfc55ea4767dbe
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 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
15 #include <linux/kernel.h>
16 #include <linux/slab.h>
17 #include <linux/fs.h>
18 #include <linux/crc32.h>
19 #include <linux/jffs2.h>
20 #include "jffs2_fs_i.h"
21 #include "jffs2_fs_sb.h"
22 #include <linux/time.h>
23 #include "nodelist.h"
25 static int jffs2_readdir (struct file *, struct dir_context *);
27 static int jffs2_create (struct inode *,struct dentry *,umode_t,
28 bool);
29 static struct dentry *jffs2_lookup (struct inode *,struct dentry *,
30 unsigned int);
31 static int jffs2_link (struct dentry *,struct inode *,struct dentry *);
32 static int jffs2_unlink (struct inode *,struct dentry *);
33 static int jffs2_symlink (struct inode *,struct dentry *,const char *);
34 static int jffs2_mkdir (struct inode *,struct dentry *,umode_t);
35 static int jffs2_rmdir (struct inode *,struct dentry *);
36 static int jffs2_mknod (struct inode *,struct dentry *,umode_t,dev_t);
37 static int jffs2_rename (struct inode *, struct dentry *,
38 struct inode *, struct dentry *);
40 const struct file_operations jffs2_dir_operations =
42 .read = generic_read_dir,
43 .iterate = jffs2_readdir,
44 .unlocked_ioctl=jffs2_ioctl,
45 .fsync = jffs2_fsync,
46 .llseek = generic_file_llseek,
50 const struct inode_operations jffs2_dir_inode_operations =
52 .create = jffs2_create,
53 .lookup = jffs2_lookup,
54 .link = jffs2_link,
55 .unlink = jffs2_unlink,
56 .symlink = jffs2_symlink,
57 .mkdir = jffs2_mkdir,
58 .rmdir = jffs2_rmdir,
59 .mknod = jffs2_mknod,
60 .rename = jffs2_rename,
61 .get_acl = jffs2_get_acl,
62 .set_acl = jffs2_set_acl,
63 .setattr = jffs2_setattr,
64 .setxattr = jffs2_setxattr,
65 .getxattr = jffs2_getxattr,
66 .listxattr = jffs2_listxattr,
67 .removexattr = jffs2_removexattr
70 /***********************************************************************/
73 /* We keep the dirent list sorted in increasing order of name hash,
74 and we use the same hash function as the dentries. Makes this
75 nice and simple
77 static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target,
78 unsigned int flags)
80 struct jffs2_inode_info *dir_f;
81 struct jffs2_full_dirent *fd = NULL, *fd_list;
82 uint32_t ino = 0;
83 struct inode *inode = NULL;
85 jffs2_dbg(1, "jffs2_lookup()\n");
87 if (target->d_name.len > JFFS2_MAX_NAME_LEN)
88 return ERR_PTR(-ENAMETOOLONG);
90 dir_f = JFFS2_INODE_INFO(dir_i);
92 mutex_lock(&dir_f->sem);
94 /* NB: The 2.2 backport will need to explicitly check for '.' and '..' here */
95 for (fd_list = dir_f->dents; fd_list && fd_list->nhash <= target->d_name.hash; fd_list = fd_list->next) {
96 if (fd_list->nhash == target->d_name.hash &&
97 (!fd || fd_list->version > fd->version) &&
98 strlen(fd_list->name) == target->d_name.len &&
99 !strncmp(fd_list->name, target->d_name.name, target->d_name.len)) {
100 fd = fd_list;
103 if (fd)
104 ino = fd->ino;
105 mutex_unlock(&dir_f->sem);
106 if (ino) {
107 inode = jffs2_iget(dir_i->i_sb, ino);
108 if (IS_ERR(inode))
109 pr_warn("iget() failed for ino #%u\n", ino);
112 return d_splice_alias(inode, target);
115 /***********************************************************************/
118 static int jffs2_readdir(struct file *file, struct dir_context *ctx)
120 struct inode *inode = file_inode(file);
121 struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
122 struct jffs2_full_dirent *fd;
123 unsigned long curofs = 1;
125 jffs2_dbg(1, "jffs2_readdir() for dir_i #%lu\n", inode->i_ino);
127 if (!dir_emit_dots(file, ctx))
128 return 0;
130 mutex_lock(&f->sem);
131 for (fd = f->dents; fd; fd = fd->next) {
132 curofs++;
133 /* First loop: curofs = 2; pos = 2 */
134 if (curofs < ctx->pos) {
135 jffs2_dbg(2, "Skipping dirent: \"%s\", ino #%u, type %d, because curofs %ld < offset %ld\n",
136 fd->name, fd->ino, fd->type, curofs, (unsigned long)ctx->pos);
137 continue;
139 if (!fd->ino) {
140 jffs2_dbg(2, "Skipping deletion dirent \"%s\"\n",
141 fd->name);
142 ctx->pos++;
143 continue;
145 jffs2_dbg(2, "Dirent %ld: \"%s\", ino #%u, type %d\n",
146 (unsigned long)ctx->pos, fd->name, fd->ino, fd->type);
147 if (!dir_emit(ctx, fd->name, strlen(fd->name), fd->ino, fd->type))
148 break;
149 ctx->pos++;
151 mutex_unlock(&f->sem);
152 return 0;
155 /***********************************************************************/
158 static int jffs2_create(struct inode *dir_i, struct dentry *dentry,
159 umode_t mode, bool excl)
161 struct jffs2_raw_inode *ri;
162 struct jffs2_inode_info *f, *dir_f;
163 struct jffs2_sb_info *c;
164 struct inode *inode;
165 int ret;
167 ri = jffs2_alloc_raw_inode();
168 if (!ri)
169 return -ENOMEM;
171 c = JFFS2_SB_INFO(dir_i->i_sb);
173 jffs2_dbg(1, "%s()\n", __func__);
175 inode = jffs2_new_inode(dir_i, mode, ri);
177 if (IS_ERR(inode)) {
178 jffs2_dbg(1, "jffs2_new_inode() failed\n");
179 jffs2_free_raw_inode(ri);
180 return PTR_ERR(inode);
183 inode->i_op = &jffs2_file_inode_operations;
184 inode->i_fop = &jffs2_file_operations;
185 inode->i_mapping->a_ops = &jffs2_file_address_operations;
186 inode->i_mapping->nrpages = 0;
188 f = JFFS2_INODE_INFO(inode);
189 dir_f = JFFS2_INODE_INFO(dir_i);
191 /* jffs2_do_create() will want to lock it, _after_ reserving
192 space and taking c-alloc_sem. If we keep it locked here,
193 lockdep gets unhappy (although it's a false positive;
194 nothing else will be looking at this inode yet so there's
195 no chance of AB-BA deadlock involving its f->sem). */
196 mutex_unlock(&f->sem);
198 ret = jffs2_do_create(c, dir_f, f, ri, &dentry->d_name);
199 if (ret)
200 goto fail;
202 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(ri->ctime));
204 jffs2_free_raw_inode(ri);
206 jffs2_dbg(1, "%s(): Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n",
207 __func__, inode->i_ino, inode->i_mode, inode->i_nlink,
208 f->inocache->pino_nlink, inode->i_mapping->nrpages);
210 unlock_new_inode(inode);
211 d_instantiate(dentry, inode);
212 return 0;
214 fail:
215 iget_failed(inode);
216 jffs2_free_raw_inode(ri);
217 return ret;
220 /***********************************************************************/
223 static int jffs2_unlink(struct inode *dir_i, struct dentry *dentry)
225 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
226 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
227 struct jffs2_inode_info *dead_f = JFFS2_INODE_INFO(dentry->d_inode);
228 int ret;
229 uint32_t now = get_seconds();
231 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
232 dentry->d_name.len, dead_f, now);
233 if (dead_f->inocache)
234 set_nlink(dentry->d_inode, dead_f->inocache->pino_nlink);
235 if (!ret)
236 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
237 return ret;
239 /***********************************************************************/
242 static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct dentry *dentry)
244 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dentry->d_inode->i_sb);
245 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
246 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
247 int ret;
248 uint8_t type;
249 uint32_t now;
251 /* Don't let people make hard links to bad inodes. */
252 if (!f->inocache)
253 return -EIO;
255 if (S_ISDIR(old_dentry->d_inode->i_mode))
256 return -EPERM;
258 /* XXX: This is ugly */
259 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
260 if (!type) type = DT_REG;
262 now = get_seconds();
263 ret = jffs2_do_link(c, dir_f, f->inocache->ino, type, dentry->d_name.name, dentry->d_name.len, now);
265 if (!ret) {
266 mutex_lock(&f->sem);
267 set_nlink(old_dentry->d_inode, ++f->inocache->pino_nlink);
268 mutex_unlock(&f->sem);
269 d_instantiate(dentry, old_dentry->d_inode);
270 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
271 ihold(old_dentry->d_inode);
273 return ret;
276 /***********************************************************************/
278 static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char *target)
280 struct jffs2_inode_info *f, *dir_f;
281 struct jffs2_sb_info *c;
282 struct inode *inode;
283 struct jffs2_raw_inode *ri;
284 struct jffs2_raw_dirent *rd;
285 struct jffs2_full_dnode *fn;
286 struct jffs2_full_dirent *fd;
287 int namelen;
288 uint32_t alloclen;
289 int ret, targetlen = strlen(target);
291 /* FIXME: If you care. We'd need to use frags for the target
292 if it grows much more than this */
293 if (targetlen > 254)
294 return -ENAMETOOLONG;
296 ri = jffs2_alloc_raw_inode();
298 if (!ri)
299 return -ENOMEM;
301 c = JFFS2_SB_INFO(dir_i->i_sb);
303 /* Try to reserve enough space for both node and dirent.
304 * Just the node will do for now, though
306 namelen = dentry->d_name.len;
307 ret = jffs2_reserve_space(c, sizeof(*ri) + targetlen, &alloclen,
308 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
310 if (ret) {
311 jffs2_free_raw_inode(ri);
312 return ret;
315 inode = jffs2_new_inode(dir_i, S_IFLNK | S_IRWXUGO, ri);
317 if (IS_ERR(inode)) {
318 jffs2_free_raw_inode(ri);
319 jffs2_complete_reservation(c);
320 return PTR_ERR(inode);
323 inode->i_op = &jffs2_symlink_inode_operations;
325 f = JFFS2_INODE_INFO(inode);
327 inode->i_size = targetlen;
328 ri->isize = ri->dsize = ri->csize = cpu_to_je32(inode->i_size);
329 ri->totlen = cpu_to_je32(sizeof(*ri) + inode->i_size);
330 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
332 ri->compr = JFFS2_COMPR_NONE;
333 ri->data_crc = cpu_to_je32(crc32(0, target, targetlen));
334 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
336 fn = jffs2_write_dnode(c, f, ri, target, targetlen, ALLOC_NORMAL);
338 jffs2_free_raw_inode(ri);
340 if (IS_ERR(fn)) {
341 /* Eeek. Wave bye bye */
342 mutex_unlock(&f->sem);
343 jffs2_complete_reservation(c);
344 ret = PTR_ERR(fn);
345 goto fail;
348 /* We use f->target field to store the target path. */
349 f->target = kmemdup(target, targetlen + 1, GFP_KERNEL);
350 if (!f->target) {
351 pr_warn("Can't allocate %d bytes of memory\n", targetlen + 1);
352 mutex_unlock(&f->sem);
353 jffs2_complete_reservation(c);
354 ret = -ENOMEM;
355 goto fail;
358 jffs2_dbg(1, "%s(): symlink's target '%s' cached\n",
359 __func__, (char *)f->target);
361 /* No data here. Only a metadata node, which will be
362 obsoleted by the first data write
364 f->metadata = fn;
365 mutex_unlock(&f->sem);
367 jffs2_complete_reservation(c);
369 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
370 if (ret)
371 goto fail;
373 ret = jffs2_init_acl_post(inode);
374 if (ret)
375 goto fail;
377 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
378 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
379 if (ret)
380 goto fail;
382 rd = jffs2_alloc_raw_dirent();
383 if (!rd) {
384 /* Argh. Now we treat it like a normal delete */
385 jffs2_complete_reservation(c);
386 ret = -ENOMEM;
387 goto fail;
390 dir_f = JFFS2_INODE_INFO(dir_i);
391 mutex_lock(&dir_f->sem);
393 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
394 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
395 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
396 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
398 rd->pino = cpu_to_je32(dir_i->i_ino);
399 rd->version = cpu_to_je32(++dir_f->highest_version);
400 rd->ino = cpu_to_je32(inode->i_ino);
401 rd->mctime = cpu_to_je32(get_seconds());
402 rd->nsize = namelen;
403 rd->type = DT_LNK;
404 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
405 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
407 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
409 if (IS_ERR(fd)) {
410 /* dirent failed to write. Delete the inode normally
411 as if it were the final unlink() */
412 jffs2_complete_reservation(c);
413 jffs2_free_raw_dirent(rd);
414 mutex_unlock(&dir_f->sem);
415 ret = PTR_ERR(fd);
416 goto fail;
419 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
421 jffs2_free_raw_dirent(rd);
423 /* Link the fd into the inode's list, obsoleting an old
424 one if necessary. */
425 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
427 mutex_unlock(&dir_f->sem);
428 jffs2_complete_reservation(c);
430 unlock_new_inode(inode);
431 d_instantiate(dentry, inode);
432 return 0;
434 fail:
435 iget_failed(inode);
436 return ret;
440 static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, umode_t mode)
442 struct jffs2_inode_info *f, *dir_f;
443 struct jffs2_sb_info *c;
444 struct inode *inode;
445 struct jffs2_raw_inode *ri;
446 struct jffs2_raw_dirent *rd;
447 struct jffs2_full_dnode *fn;
448 struct jffs2_full_dirent *fd;
449 int namelen;
450 uint32_t alloclen;
451 int ret;
453 mode |= S_IFDIR;
455 ri = jffs2_alloc_raw_inode();
456 if (!ri)
457 return -ENOMEM;
459 c = JFFS2_SB_INFO(dir_i->i_sb);
461 /* Try to reserve enough space for both node and dirent.
462 * Just the node will do for now, though
464 namelen = dentry->d_name.len;
465 ret = jffs2_reserve_space(c, sizeof(*ri), &alloclen, ALLOC_NORMAL,
466 JFFS2_SUMMARY_INODE_SIZE);
468 if (ret) {
469 jffs2_free_raw_inode(ri);
470 return ret;
473 inode = jffs2_new_inode(dir_i, mode, ri);
475 if (IS_ERR(inode)) {
476 jffs2_free_raw_inode(ri);
477 jffs2_complete_reservation(c);
478 return PTR_ERR(inode);
481 inode->i_op = &jffs2_dir_inode_operations;
482 inode->i_fop = &jffs2_dir_operations;
484 f = JFFS2_INODE_INFO(inode);
486 /* Directories get nlink 2 at start */
487 set_nlink(inode, 2);
488 /* but ic->pino_nlink is the parent ino# */
489 f->inocache->pino_nlink = dir_i->i_ino;
491 ri->data_crc = cpu_to_je32(0);
492 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
494 fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL);
496 jffs2_free_raw_inode(ri);
498 if (IS_ERR(fn)) {
499 /* Eeek. Wave bye bye */
500 mutex_unlock(&f->sem);
501 jffs2_complete_reservation(c);
502 ret = PTR_ERR(fn);
503 goto fail;
505 /* No data here. Only a metadata node, which will be
506 obsoleted by the first data write
508 f->metadata = fn;
509 mutex_unlock(&f->sem);
511 jffs2_complete_reservation(c);
513 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
514 if (ret)
515 goto fail;
517 ret = jffs2_init_acl_post(inode);
518 if (ret)
519 goto fail;
521 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
522 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
523 if (ret)
524 goto fail;
526 rd = jffs2_alloc_raw_dirent();
527 if (!rd) {
528 /* Argh. Now we treat it like a normal delete */
529 jffs2_complete_reservation(c);
530 ret = -ENOMEM;
531 goto fail;
534 dir_f = JFFS2_INODE_INFO(dir_i);
535 mutex_lock(&dir_f->sem);
537 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
538 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
539 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
540 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
542 rd->pino = cpu_to_je32(dir_i->i_ino);
543 rd->version = cpu_to_je32(++dir_f->highest_version);
544 rd->ino = cpu_to_je32(inode->i_ino);
545 rd->mctime = cpu_to_je32(get_seconds());
546 rd->nsize = namelen;
547 rd->type = DT_DIR;
548 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
549 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
551 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
553 if (IS_ERR(fd)) {
554 /* dirent failed to write. Delete the inode normally
555 as if it were the final unlink() */
556 jffs2_complete_reservation(c);
557 jffs2_free_raw_dirent(rd);
558 mutex_unlock(&dir_f->sem);
559 ret = PTR_ERR(fd);
560 goto fail;
563 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
564 inc_nlink(dir_i);
566 jffs2_free_raw_dirent(rd);
568 /* Link the fd into the inode's list, obsoleting an old
569 one if necessary. */
570 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
572 mutex_unlock(&dir_f->sem);
573 jffs2_complete_reservation(c);
575 unlock_new_inode(inode);
576 d_instantiate(dentry, inode);
577 return 0;
579 fail:
580 iget_failed(inode);
581 return ret;
584 static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
586 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
587 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
588 struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
589 struct jffs2_full_dirent *fd;
590 int ret;
591 uint32_t now = get_seconds();
593 for (fd = f->dents ; fd; fd = fd->next) {
594 if (fd->ino)
595 return -ENOTEMPTY;
598 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
599 dentry->d_name.len, f, now);
600 if (!ret) {
601 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
602 clear_nlink(dentry->d_inode);
603 drop_nlink(dir_i);
605 return ret;
608 static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, umode_t mode, dev_t rdev)
610 struct jffs2_inode_info *f, *dir_f;
611 struct jffs2_sb_info *c;
612 struct inode *inode;
613 struct jffs2_raw_inode *ri;
614 struct jffs2_raw_dirent *rd;
615 struct jffs2_full_dnode *fn;
616 struct jffs2_full_dirent *fd;
617 int namelen;
618 union jffs2_device_node dev;
619 int devlen = 0;
620 uint32_t alloclen;
621 int ret;
623 if (!new_valid_dev(rdev))
624 return -EINVAL;
626 ri = jffs2_alloc_raw_inode();
627 if (!ri)
628 return -ENOMEM;
630 c = JFFS2_SB_INFO(dir_i->i_sb);
632 if (S_ISBLK(mode) || S_ISCHR(mode))
633 devlen = jffs2_encode_dev(&dev, rdev);
635 /* Try to reserve enough space for both node and dirent.
636 * Just the node will do for now, though
638 namelen = dentry->d_name.len;
639 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &alloclen,
640 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
642 if (ret) {
643 jffs2_free_raw_inode(ri);
644 return ret;
647 inode = jffs2_new_inode(dir_i, mode, ri);
649 if (IS_ERR(inode)) {
650 jffs2_free_raw_inode(ri);
651 jffs2_complete_reservation(c);
652 return PTR_ERR(inode);
654 inode->i_op = &jffs2_file_inode_operations;
655 init_special_inode(inode, inode->i_mode, rdev);
657 f = JFFS2_INODE_INFO(inode);
659 ri->dsize = ri->csize = cpu_to_je32(devlen);
660 ri->totlen = cpu_to_je32(sizeof(*ri) + devlen);
661 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
663 ri->compr = JFFS2_COMPR_NONE;
664 ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen));
665 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
667 fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, ALLOC_NORMAL);
669 jffs2_free_raw_inode(ri);
671 if (IS_ERR(fn)) {
672 /* Eeek. Wave bye bye */
673 mutex_unlock(&f->sem);
674 jffs2_complete_reservation(c);
675 ret = PTR_ERR(fn);
676 goto fail;
678 /* No data here. Only a metadata node, which will be
679 obsoleted by the first data write
681 f->metadata = fn;
682 mutex_unlock(&f->sem);
684 jffs2_complete_reservation(c);
686 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
687 if (ret)
688 goto fail;
690 ret = jffs2_init_acl_post(inode);
691 if (ret)
692 goto fail;
694 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
695 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
696 if (ret)
697 goto fail;
699 rd = jffs2_alloc_raw_dirent();
700 if (!rd) {
701 /* Argh. Now we treat it like a normal delete */
702 jffs2_complete_reservation(c);
703 ret = -ENOMEM;
704 goto fail;
707 dir_f = JFFS2_INODE_INFO(dir_i);
708 mutex_lock(&dir_f->sem);
710 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
711 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
712 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
713 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
715 rd->pino = cpu_to_je32(dir_i->i_ino);
716 rd->version = cpu_to_je32(++dir_f->highest_version);
717 rd->ino = cpu_to_je32(inode->i_ino);
718 rd->mctime = cpu_to_je32(get_seconds());
719 rd->nsize = namelen;
721 /* XXX: This is ugly. */
722 rd->type = (mode & S_IFMT) >> 12;
724 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
725 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
727 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
729 if (IS_ERR(fd)) {
730 /* dirent failed to write. Delete the inode normally
731 as if it were the final unlink() */
732 jffs2_complete_reservation(c);
733 jffs2_free_raw_dirent(rd);
734 mutex_unlock(&dir_f->sem);
735 ret = PTR_ERR(fd);
736 goto fail;
739 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
741 jffs2_free_raw_dirent(rd);
743 /* Link the fd into the inode's list, obsoleting an old
744 one if necessary. */
745 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
747 mutex_unlock(&dir_f->sem);
748 jffs2_complete_reservation(c);
750 unlock_new_inode(inode);
751 d_instantiate(dentry, inode);
752 return 0;
754 fail:
755 iget_failed(inode);
756 return ret;
759 static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
760 struct inode *new_dir_i, struct dentry *new_dentry)
762 int ret;
763 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
764 struct jffs2_inode_info *victim_f = NULL;
765 uint8_t type;
766 uint32_t now;
768 /* The VFS will check for us and prevent trying to rename a
769 * file over a directory and vice versa, but if it's a directory,
770 * the VFS can't check whether the victim is empty. The filesystem
771 * needs to do that for itself.
773 if (new_dentry->d_inode) {
774 victim_f = JFFS2_INODE_INFO(new_dentry->d_inode);
775 if (S_ISDIR(new_dentry->d_inode->i_mode)) {
776 struct jffs2_full_dirent *fd;
778 mutex_lock(&victim_f->sem);
779 for (fd = victim_f->dents; fd; fd = fd->next) {
780 if (fd->ino) {
781 mutex_unlock(&victim_f->sem);
782 return -ENOTEMPTY;
785 mutex_unlock(&victim_f->sem);
789 /* XXX: We probably ought to alloc enough space for
790 both nodes at the same time. Writing the new link,
791 then getting -ENOSPC, is quite bad :)
794 /* Make a hard link */
796 /* XXX: This is ugly */
797 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
798 if (!type) type = DT_REG;
800 now = get_seconds();
801 ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i),
802 old_dentry->d_inode->i_ino, type,
803 new_dentry->d_name.name, new_dentry->d_name.len, now);
805 if (ret)
806 return ret;
808 if (victim_f) {
809 /* There was a victim. Kill it off nicely */
810 if (S_ISDIR(new_dentry->d_inode->i_mode))
811 clear_nlink(new_dentry->d_inode);
812 else
813 drop_nlink(new_dentry->d_inode);
814 /* Don't oops if the victim was a dirent pointing to an
815 inode which didn't exist. */
816 if (victim_f->inocache) {
817 mutex_lock(&victim_f->sem);
818 if (S_ISDIR(new_dentry->d_inode->i_mode))
819 victim_f->inocache->pino_nlink = 0;
820 else
821 victim_f->inocache->pino_nlink--;
822 mutex_unlock(&victim_f->sem);
826 /* If it was a directory we moved, and there was no victim,
827 increase i_nlink on its new parent */
828 if (S_ISDIR(old_dentry->d_inode->i_mode) && !victim_f)
829 inc_nlink(new_dir_i);
831 /* Unlink the original */
832 ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
833 old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
835 /* We don't touch inode->i_nlink */
837 if (ret) {
838 /* Oh shit. We really ought to make a single node which can do both atomically */
839 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
840 mutex_lock(&f->sem);
841 inc_nlink(old_dentry->d_inode);
842 if (f->inocache && !S_ISDIR(old_dentry->d_inode->i_mode))
843 f->inocache->pino_nlink++;
844 mutex_unlock(&f->sem);
846 pr_notice("%s(): Link succeeded, unlink failed (err %d). You now have a hard link\n",
847 __func__, ret);
848 /* Might as well let the VFS know */
849 d_instantiate(new_dentry, old_dentry->d_inode);
850 ihold(old_dentry->d_inode);
851 new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now);
852 return ret;
855 if (S_ISDIR(old_dentry->d_inode->i_mode))
856 drop_nlink(old_dir_i);
858 new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
860 return 0;