[JFFS2] Invert last argument of jffs2_gc_fetch_inode(), make it boolean.
[linux-2.6-block.git] / fs / jffs2 / dir.c
CommitLineData
1da177e4
LT
1/*
2 * JFFS2 -- Journalling Flash File System, Version 2.
3 *
c00c310e 4 * Copyright © 2001-2007 Red Hat, Inc.
1da177e4
LT
5 *
6 * Created by David Woodhouse <dwmw2@infradead.org>
7 *
8 * For licensing information, see the file 'LICENCE' in this directory.
9 *
1da177e4
LT
10 */
11
12#include <linux/kernel.h>
13#include <linux/slab.h>
1da177e4
LT
14#include <linux/fs.h>
15#include <linux/crc32.h>
16#include <linux/jffs2.h>
cbb9a561
DW
17#include "jffs2_fs_i.h"
18#include "jffs2_fs_sb.h"
1da177e4
LT
19#include <linux/time.h>
20#include "nodelist.h"
21
1da177e4
LT
22static int jffs2_readdir (struct file *, void *, filldir_t);
23
24static int jffs2_create (struct inode *,struct dentry *,int,
25 struct nameidata *);
26static struct dentry *jffs2_lookup (struct inode *,struct dentry *,
27 struct nameidata *);
28static int jffs2_link (struct dentry *,struct inode *,struct dentry *);
29static int jffs2_unlink (struct inode *,struct dentry *);
30static int jffs2_symlink (struct inode *,struct dentry *,const char *);
31static int jffs2_mkdir (struct inode *,struct dentry *,int);
32static int jffs2_rmdir (struct inode *,struct dentry *);
265489f0 33static int jffs2_mknod (struct inode *,struct dentry *,int,dev_t);
1da177e4 34static int jffs2_rename (struct inode *, struct dentry *,
ef53cb02 35 struct inode *, struct dentry *);
1da177e4 36
4b6f5d20 37const struct file_operations jffs2_dir_operations =
1da177e4
LT
38{
39 .read = generic_read_dir,
40 .readdir = jffs2_readdir,
41 .ioctl = jffs2_ioctl,
42 .fsync = jffs2_fsync
43};
44
45
92e1d5be 46const struct inode_operations jffs2_dir_inode_operations =
1da177e4 47{
265489f0
DW
48 .create = jffs2_create,
49 .lookup = jffs2_lookup,
1da177e4
LT
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,
aa98d7cf 57 .permission = jffs2_permission,
1da177e4 58 .setattr = jffs2_setattr,
aa98d7cf
KK
59 .setxattr = jffs2_setxattr,
60 .getxattr = jffs2_getxattr,
61 .listxattr = jffs2_listxattr,
62 .removexattr = jffs2_removexattr
1da177e4
LT
63};
64
65/***********************************************************************/
66
67
68/* We keep the dirent list sorted in increasing order of name hash,
182ec4ee 69 and we use the same hash function as the dentries. Makes this
1da177e4
LT
70 nice and simple
71*/
72static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target,
73 struct nameidata *nd)
74{
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;
80
81 D1(printk(KERN_DEBUG "jffs2_lookup()\n"));
82
373d5e71
RP
83 if (target->d_name.len > JFFS2_MAX_NAME_LEN)
84 return ERR_PTR(-ENAMETOOLONG);
85
1da177e4
LT
86 dir_f = JFFS2_INODE_INFO(dir_i);
87 c = JFFS2_SB_INFO(dir_i->i_sb);
88
ced22070 89 mutex_lock(&dir_f->sem);
1da177e4
LT
90
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) {
182ec4ee 93 if (fd_list->nhash == target->d_name.hash &&
1da177e4
LT
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;
98 }
99 }
100 if (fd)
101 ino = fd->ino;
ced22070 102 mutex_unlock(&dir_f->sem);
1da177e4 103 if (ino) {
5451f79f
DH
104 inode = jffs2_iget(dir_i->i_sb, ino);
105 if (IS_ERR(inode)) {
1da177e4 106 printk(KERN_WARNING "iget() failed for ino #%u\n", ino);
5451f79f 107 return ERR_CAST(inode);
1da177e4
LT
108 }
109 }
110
111 d_add(target, inode);
112
113 return NULL;
114}
115
116/***********************************************************************/
117
118
119static int jffs2_readdir(struct file *filp, void *dirent, filldir_t filldir)
120{
121 struct jffs2_inode_info *f;
122 struct jffs2_sb_info *c;
ec2e203c 123 struct inode *inode = filp->f_path.dentry->d_inode;
1da177e4
LT
124 struct jffs2_full_dirent *fd;
125 unsigned long offset, curofs;
126
ec2e203c 127 D1(printk(KERN_DEBUG "jffs2_readdir() for dir_i #%lu\n", filp->f_path.dentry->d_inode->i_ino));
1da177e4
LT
128
129 f = JFFS2_INODE_INFO(inode);
130 c = JFFS2_SB_INFO(inode->i_sb);
131
132 offset = filp->f_pos;
133
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++;
139 }
140 if (offset == 1) {
ec2e203c 141 unsigned long pino = parent_ino(filp->f_path.dentry);
1da177e4
LT
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++;
146 }
147
148 curofs=1;
ced22070 149 mutex_lock(&f->sem);
1da177e4
LT
150 for (fd = f->dents; fd; fd = fd->next) {
151
152 curofs++;
153 /* First loop: curofs = 2; offset = 2 */
154 if (curofs < offset) {
182ec4ee 155 D2(printk(KERN_DEBUG "Skipping dirent: \"%s\", ino #%u, type %d, because curofs %ld < offset %ld\n",
1da177e4
LT
156 fd->name, fd->ino, fd->type, curofs, offset));
157 continue;
158 }
159 if (!fd->ino) {
160 D2(printk(KERN_DEBUG "Skipping deletion dirent \"%s\"\n", fd->name));
161 offset++;
162 continue;
163 }
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++;
168 }
ced22070 169 mutex_unlock(&f->sem);
1da177e4
LT
170 out:
171 filp->f_pos = offset;
172 return 0;
173}
174
175/***********************************************************************/
176
177
178static int jffs2_create(struct inode *dir_i, struct dentry *dentry, int mode,
179 struct nameidata *nd)
180{
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;
186
187 ri = jffs2_alloc_raw_inode();
188 if (!ri)
189 return -ENOMEM;
182ec4ee 190
1da177e4
LT
191 c = JFFS2_SB_INFO(dir_i->i_sb);
192
193 D1(printk(KERN_DEBUG "jffs2_create()\n"));
194
cfc8dc6f 195 inode = jffs2_new_inode(dir_i, mode, ri);
1da177e4
LT
196
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);
201 }
202
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;
207
208 f = JFFS2_INODE_INFO(inode);
209 dir_f = JFFS2_INODE_INFO(dir_i);
210
590fe34c
DW
211 /* jffs2_do_create() will want to lock it, _after_ reserving
212 space and taking c-alloc_sem. If we keep it locked here,
213 lockdep gets unhappy (although it's a false positive;
214 nothing else will be looking at this inode yet so there's
215 no chance of AB-BA deadlock involving its f->sem). */
216 mutex_unlock(&f->sem);
217
182ec4ee 218 ret = jffs2_do_create(c, dir_f, f, ri,
1da177e4 219 dentry->d_name.name, dentry->d_name.len);
aa98d7cf
KK
220 if (ret)
221 goto fail;
1da177e4
LT
222
223 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(ri->ctime));
224
225 jffs2_free_raw_inode(ri);
226 d_instantiate(dentry, inode);
227
228 D1(printk(KERN_DEBUG "jffs2_create: Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n",
229 inode->i_ino, inode->i_mode, inode->i_nlink, f->inocache->nlink, inode->i_mapping->nrpages));
230 return 0;
aa98d7cf
KK
231
232 fail:
233 make_bad_inode(inode);
234 iput(inode);
235 jffs2_free_raw_inode(ri);
236 return ret;
1da177e4
LT
237}
238
239/***********************************************************************/
240
241
242static int jffs2_unlink(struct inode *dir_i, struct dentry *dentry)
243{
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;
3a69e0cd 248 uint32_t now = get_seconds();
1da177e4 249
182ec4ee 250 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
3a69e0cd 251 dentry->d_name.len, dead_f, now);
1da177e4
LT
252 if (dead_f->inocache)
253 dentry->d_inode->i_nlink = dead_f->inocache->nlink;
3a69e0cd
AB
254 if (!ret)
255 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
1da177e4
LT
256 return ret;
257}
258/***********************************************************************/
259
260
261static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct dentry *dentry)
262{
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;
3a69e0cd 268 uint32_t now;
1da177e4
LT
269
270 /* Don't let people make hard links to bad inodes. */
271 if (!f->inocache)
272 return -EIO;
273
274 if (S_ISDIR(old_dentry->d_inode->i_mode))
275 return -EPERM;
276
277 /* XXX: This is ugly */
278 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
279 if (!type) type = DT_REG;
280
3a69e0cd
AB
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);
1da177e4
LT
283
284 if (!ret) {
ced22070 285 mutex_lock(&f->sem);
1da177e4 286 old_dentry->d_inode->i_nlink = ++f->inocache->nlink;
ced22070 287 mutex_unlock(&f->sem);
1da177e4 288 d_instantiate(dentry, old_dentry->d_inode);
3a69e0cd 289 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
1da177e4
LT
290 atomic_inc(&old_dentry->d_inode->i_count);
291 }
292 return ret;
293}
294
295/***********************************************************************/
296
297static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char *target)
298{
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;
9fe4854c 307 uint32_t alloclen;
32f1a95d 308 int ret, targetlen = strlen(target);
1da177e4
LT
309
310 /* FIXME: If you care. We'd need to use frags for the target
311 if it grows much more than this */
32f1a95d 312 if (targetlen > 254)
1da177e4
LT
313 return -EINVAL;
314
315 ri = jffs2_alloc_raw_inode();
316
317 if (!ri)
318 return -ENOMEM;
182ec4ee 319
1da177e4 320 c = JFFS2_SB_INFO(dir_i->i_sb);
182ec4ee
TG
321
322 /* Try to reserve enough space for both node and dirent.
323 * Just the node will do for now, though
1da177e4
LT
324 */
325 namelen = dentry->d_name.len;
9fe4854c
DW
326 ret = jffs2_reserve_space(c, sizeof(*ri) + targetlen, &alloclen,
327 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
328
329 if (ret) {
330 jffs2_free_raw_inode(ri);
331 return ret;
332 }
333
cfc8dc6f 334 inode = jffs2_new_inode(dir_i, S_IFLNK | S_IRWXUGO, ri);
1da177e4
LT
335
336 if (IS_ERR(inode)) {
337 jffs2_free_raw_inode(ri);
338 jffs2_complete_reservation(c);
339 return PTR_ERR(inode);
340 }
341
342 inode->i_op = &jffs2_symlink_inode_operations;
343
344 f = JFFS2_INODE_INFO(inode);
345
32f1a95d 346 inode->i_size = targetlen;
1da177e4
LT
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));
350
351 ri->compr = JFFS2_COMPR_NONE;
32f1a95d 352 ri->data_crc = cpu_to_je32(crc32(0, target, targetlen));
1da177e4 353 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 354
9fe4854c 355 fn = jffs2_write_dnode(c, f, ri, target, targetlen, ALLOC_NORMAL);
1da177e4
LT
356
357 jffs2_free_raw_inode(ri);
358
359 if (IS_ERR(fn)) {
360 /* Eeek. Wave bye bye */
ced22070 361 mutex_unlock(&f->sem);
1da177e4
LT
362 jffs2_complete_reservation(c);
363 jffs2_clear_inode(inode);
364 return PTR_ERR(fn);
365 }
32f1a95d 366
2b79adcc
AB
367 /* We use f->target field to store the target path. */
368 f->target = kmalloc(targetlen + 1, GFP_KERNEL);
369 if (!f->target) {
32f1a95d 370 printk(KERN_WARNING "Can't allocate %d bytes of memory\n", targetlen + 1);
ced22070 371 mutex_unlock(&f->sem);
32f1a95d
AB
372 jffs2_complete_reservation(c);
373 jffs2_clear_inode(inode);
374 return -ENOMEM;
375 }
376
2b79adcc
AB
377 memcpy(f->target, target, targetlen + 1);
378 D1(printk(KERN_DEBUG "jffs2_symlink: symlink's target '%s' cached\n", (char *)f->target));
32f1a95d 379
182ec4ee 380 /* No data here. Only a metadata node, which will be
1da177e4
LT
381 obsoleted by the first data write
382 */
383 f->metadata = fn;
ced22070 384 mutex_unlock(&f->sem);
1da177e4
LT
385
386 jffs2_complete_reservation(c);
aa98d7cf
KK
387
388 ret = jffs2_init_security(inode, dir_i);
389 if (ret) {
390 jffs2_clear_inode(inode);
391 return ret;
392 }
cfc8dc6f 393 ret = jffs2_init_acl_post(inode);
aa98d7cf
KK
394 if (ret) {
395 jffs2_clear_inode(inode);
396 return ret;
397 }
398
9fe4854c
DW
399 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
400 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
1da177e4
LT
401 if (ret) {
402 /* Eep. */
403 jffs2_clear_inode(inode);
404 return ret;
405 }
406
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;
413 }
414
415 dir_f = JFFS2_INODE_INFO(dir_i);
ced22070 416 mutex_lock(&dir_f->sem);
1da177e4
LT
417
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));
422
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));
431
9fe4854c 432 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
1da177e4
LT
433
434 if (IS_ERR(fd)) {
182ec4ee 435 /* dirent failed to write. Delete the inode normally
1da177e4
LT
436 as if it were the final unlink() */
437 jffs2_complete_reservation(c);
438 jffs2_free_raw_dirent(rd);
ced22070 439 mutex_unlock(&dir_f->sem);
1da177e4
LT
440 jffs2_clear_inode(inode);
441 return PTR_ERR(fd);
442 }
443
444 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
445
446 jffs2_free_raw_dirent(rd);
447
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);
451
ced22070 452 mutex_unlock(&dir_f->sem);
1da177e4
LT
453 jffs2_complete_reservation(c);
454
455 d_instantiate(dentry, inode);
456 return 0;
457}
458
459
460static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode)
461{
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;
9fe4854c 470 uint32_t alloclen;
1da177e4
LT
471 int ret;
472
473 mode |= S_IFDIR;
474
475 ri = jffs2_alloc_raw_inode();
476 if (!ri)
477 return -ENOMEM;
182ec4ee 478
1da177e4
LT
479 c = JFFS2_SB_INFO(dir_i->i_sb);
480
182ec4ee
TG
481 /* Try to reserve enough space for both node and dirent.
482 * Just the node will do for now, though
1da177e4
LT
483 */
484 namelen = dentry->d_name.len;
9fe4854c
DW
485 ret = jffs2_reserve_space(c, sizeof(*ri), &alloclen, ALLOC_NORMAL,
486 JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
487
488 if (ret) {
489 jffs2_free_raw_inode(ri);
490 return ret;
491 }
492
cfc8dc6f 493 inode = jffs2_new_inode(dir_i, mode, ri);
1da177e4
LT
494
495 if (IS_ERR(inode)) {
496 jffs2_free_raw_inode(ri);
497 jffs2_complete_reservation(c);
498 return PTR_ERR(inode);
499 }
500
501 inode->i_op = &jffs2_dir_inode_operations;
502 inode->i_fop = &jffs2_dir_operations;
503 /* Directories get nlink 2 at start */
504 inode->i_nlink = 2;
505
506 f = JFFS2_INODE_INFO(inode);
507
508 ri->data_crc = cpu_to_je32(0);
509 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 510
9fe4854c 511 fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL);
1da177e4
LT
512
513 jffs2_free_raw_inode(ri);
514
515 if (IS_ERR(fn)) {
516 /* Eeek. Wave bye bye */
ced22070 517 mutex_unlock(&f->sem);
1da177e4
LT
518 jffs2_complete_reservation(c);
519 jffs2_clear_inode(inode);
520 return PTR_ERR(fn);
521 }
182ec4ee 522 /* No data here. Only a metadata node, which will be
1da177e4
LT
523 obsoleted by the first data write
524 */
525 f->metadata = fn;
ced22070 526 mutex_unlock(&f->sem);
1da177e4
LT
527
528 jffs2_complete_reservation(c);
aa98d7cf
KK
529
530 ret = jffs2_init_security(inode, dir_i);
531 if (ret) {
532 jffs2_clear_inode(inode);
533 return ret;
534 }
cfc8dc6f 535 ret = jffs2_init_acl_post(inode);
aa98d7cf
KK
536 if (ret) {
537 jffs2_clear_inode(inode);
538 return ret;
539 }
540
9fe4854c
DW
541 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
542 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
1da177e4
LT
543 if (ret) {
544 /* Eep. */
545 jffs2_clear_inode(inode);
546 return ret;
547 }
182ec4ee 548
1da177e4
LT
549 rd = jffs2_alloc_raw_dirent();
550 if (!rd) {
551 /* Argh. Now we treat it like a normal delete */
552 jffs2_complete_reservation(c);
553 jffs2_clear_inode(inode);
554 return -ENOMEM;
555 }
556
557 dir_f = JFFS2_INODE_INFO(dir_i);
ced22070 558 mutex_lock(&dir_f->sem);
1da177e4
LT
559
560 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
561 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
562 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
563 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
564
565 rd->pino = cpu_to_je32(dir_i->i_ino);
566 rd->version = cpu_to_je32(++dir_f->highest_version);
567 rd->ino = cpu_to_je32(inode->i_ino);
568 rd->mctime = cpu_to_je32(get_seconds());
569 rd->nsize = namelen;
570 rd->type = DT_DIR;
571 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
572 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
573
9fe4854c 574 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
182ec4ee 575
1da177e4 576 if (IS_ERR(fd)) {
182ec4ee 577 /* dirent failed to write. Delete the inode normally
1da177e4
LT
578 as if it were the final unlink() */
579 jffs2_complete_reservation(c);
580 jffs2_free_raw_dirent(rd);
ced22070 581 mutex_unlock(&dir_f->sem);
1da177e4
LT
582 jffs2_clear_inode(inode);
583 return PTR_ERR(fd);
584 }
585
586 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
d8c76e6f 587 inc_nlink(dir_i);
1da177e4
LT
588
589 jffs2_free_raw_dirent(rd);
590
591 /* Link the fd into the inode's list, obsoleting an old
592 one if necessary. */
593 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
594
ced22070 595 mutex_unlock(&dir_f->sem);
1da177e4
LT
596 jffs2_complete_reservation(c);
597
598 d_instantiate(dentry, inode);
599 return 0;
600}
601
602static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
603{
604 struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
605 struct jffs2_full_dirent *fd;
606 int ret;
607
608 for (fd = f->dents ; fd; fd = fd->next) {
609 if (fd->ino)
610 return -ENOTEMPTY;
611 }
612 ret = jffs2_unlink(dir_i, dentry);
613 if (!ret)
9a53c3a7 614 drop_nlink(dir_i);
1da177e4
LT
615 return ret;
616}
617
265489f0 618static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, dev_t rdev)
1da177e4
LT
619{
620 struct jffs2_inode_info *f, *dir_f;
621 struct jffs2_sb_info *c;
622 struct inode *inode;
623 struct jffs2_raw_inode *ri;
624 struct jffs2_raw_dirent *rd;
625 struct jffs2_full_dnode *fn;
626 struct jffs2_full_dirent *fd;
627 int namelen;
aef9ab47 628 union jffs2_device_node dev;
1da177e4 629 int devlen = 0;
9fe4854c 630 uint32_t alloclen;
1da177e4
LT
631 int ret;
632
aef9ab47 633 if (!new_valid_dev(rdev))
1da177e4
LT
634 return -EINVAL;
635
636 ri = jffs2_alloc_raw_inode();
637 if (!ri)
638 return -ENOMEM;
182ec4ee 639
1da177e4 640 c = JFFS2_SB_INFO(dir_i->i_sb);
182ec4ee 641
aef9ab47
DW
642 if (S_ISBLK(mode) || S_ISCHR(mode))
643 devlen = jffs2_encode_dev(&dev, rdev);
182ec4ee
TG
644
645 /* Try to reserve enough space for both node and dirent.
646 * Just the node will do for now, though
1da177e4
LT
647 */
648 namelen = dentry->d_name.len;
9fe4854c 649 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &alloclen,
aef9ab47 650 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
651
652 if (ret) {
653 jffs2_free_raw_inode(ri);
654 return ret;
655 }
656
cfc8dc6f 657 inode = jffs2_new_inode(dir_i, mode, ri);
1da177e4
LT
658
659 if (IS_ERR(inode)) {
660 jffs2_free_raw_inode(ri);
661 jffs2_complete_reservation(c);
662 return PTR_ERR(inode);
663 }
664 inode->i_op = &jffs2_file_inode_operations;
665 init_special_inode(inode, inode->i_mode, rdev);
666
667 f = JFFS2_INODE_INFO(inode);
668
669 ri->dsize = ri->csize = cpu_to_je32(devlen);
670 ri->totlen = cpu_to_je32(sizeof(*ri) + devlen);
671 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
672
673 ri->compr = JFFS2_COMPR_NONE;
674 ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen));
675 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 676
9fe4854c 677 fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, ALLOC_NORMAL);
1da177e4
LT
678
679 jffs2_free_raw_inode(ri);
680
681 if (IS_ERR(fn)) {
682 /* Eeek. Wave bye bye */
ced22070 683 mutex_unlock(&f->sem);
1da177e4
LT
684 jffs2_complete_reservation(c);
685 jffs2_clear_inode(inode);
686 return PTR_ERR(fn);
687 }
182ec4ee 688 /* No data here. Only a metadata node, which will be
1da177e4
LT
689 obsoleted by the first data write
690 */
691 f->metadata = fn;
ced22070 692 mutex_unlock(&f->sem);
1da177e4
LT
693
694 jffs2_complete_reservation(c);
aa98d7cf
KK
695
696 ret = jffs2_init_security(inode, dir_i);
697 if (ret) {
698 jffs2_clear_inode(inode);
699 return ret;
700 }
cfc8dc6f 701 ret = jffs2_init_acl_post(inode);
aa98d7cf
KK
702 if (ret) {
703 jffs2_clear_inode(inode);
704 return ret;
705 }
706
9fe4854c
DW
707 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
708 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
1da177e4
LT
709 if (ret) {
710 /* Eep. */
711 jffs2_clear_inode(inode);
712 return ret;
713 }
714
715 rd = jffs2_alloc_raw_dirent();
716 if (!rd) {
717 /* Argh. Now we treat it like a normal delete */
718 jffs2_complete_reservation(c);
719 jffs2_clear_inode(inode);
720 return -ENOMEM;
721 }
722
723 dir_f = JFFS2_INODE_INFO(dir_i);
ced22070 724 mutex_lock(&dir_f->sem);
1da177e4
LT
725
726 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
727 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
728 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
729 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
730
731 rd->pino = cpu_to_je32(dir_i->i_ino);
732 rd->version = cpu_to_je32(++dir_f->highest_version);
733 rd->ino = cpu_to_je32(inode->i_ino);
734 rd->mctime = cpu_to_je32(get_seconds());
735 rd->nsize = namelen;
736
737 /* XXX: This is ugly. */
738 rd->type = (mode & S_IFMT) >> 12;
739
740 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
741 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
742
9fe4854c 743 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
182ec4ee 744
1da177e4 745 if (IS_ERR(fd)) {
182ec4ee 746 /* dirent failed to write. Delete the inode normally
1da177e4
LT
747 as if it were the final unlink() */
748 jffs2_complete_reservation(c);
749 jffs2_free_raw_dirent(rd);
ced22070 750 mutex_unlock(&dir_f->sem);
1da177e4
LT
751 jffs2_clear_inode(inode);
752 return PTR_ERR(fd);
753 }
754
755 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
756
757 jffs2_free_raw_dirent(rd);
758
759 /* Link the fd into the inode's list, obsoleting an old
760 one if necessary. */
761 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
762
ced22070 763 mutex_unlock(&dir_f->sem);
1da177e4
LT
764 jffs2_complete_reservation(c);
765
766 d_instantiate(dentry, inode);
767
768 return 0;
769}
770
771static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
ef53cb02 772 struct inode *new_dir_i, struct dentry *new_dentry)
1da177e4
LT
773{
774 int ret;
775 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
776 struct jffs2_inode_info *victim_f = NULL;
777 uint8_t type;
3a69e0cd 778 uint32_t now;
1da177e4 779
182ec4ee 780 /* The VFS will check for us and prevent trying to rename a
1da177e4
LT
781 * file over a directory and vice versa, but if it's a directory,
782 * the VFS can't check whether the victim is empty. The filesystem
783 * needs to do that for itself.
784 */
785 if (new_dentry->d_inode) {
786 victim_f = JFFS2_INODE_INFO(new_dentry->d_inode);
787 if (S_ISDIR(new_dentry->d_inode->i_mode)) {
788 struct jffs2_full_dirent *fd;
789
ced22070 790 mutex_lock(&victim_f->sem);
1da177e4
LT
791 for (fd = victim_f->dents; fd; fd = fd->next) {
792 if (fd->ino) {
ced22070 793 mutex_unlock(&victim_f->sem);
1da177e4
LT
794 return -ENOTEMPTY;
795 }
796 }
ced22070 797 mutex_unlock(&victim_f->sem);
1da177e4
LT
798 }
799 }
800
801 /* XXX: We probably ought to alloc enough space for
182ec4ee 802 both nodes at the same time. Writing the new link,
1da177e4
LT
803 then getting -ENOSPC, is quite bad :)
804 */
805
806 /* Make a hard link */
182ec4ee 807
1da177e4
LT
808 /* XXX: This is ugly */
809 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
810 if (!type) type = DT_REG;
811
3a69e0cd 812 now = get_seconds();
182ec4ee 813 ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i),
1da177e4 814 old_dentry->d_inode->i_ino, type,
3a69e0cd 815 new_dentry->d_name.name, new_dentry->d_name.len, now);
1da177e4
LT
816
817 if (ret)
818 return ret;
819
820 if (victim_f) {
821 /* There was a victim. Kill it off nicely */
9a53c3a7 822 drop_nlink(new_dentry->d_inode);
1da177e4
LT
823 /* Don't oops if the victim was a dirent pointing to an
824 inode which didn't exist. */
825 if (victim_f->inocache) {
ced22070 826 mutex_lock(&victim_f->sem);
1da177e4 827 victim_f->inocache->nlink--;
ced22070 828 mutex_unlock(&victim_f->sem);
1da177e4
LT
829 }
830 }
831
182ec4ee 832 /* If it was a directory we moved, and there was no victim,
1da177e4
LT
833 increase i_nlink on its new parent */
834 if (S_ISDIR(old_dentry->d_inode->i_mode) && !victim_f)
d8c76e6f 835 inc_nlink(new_dir_i);
1da177e4
LT
836
837 /* Unlink the original */
182ec4ee 838 ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
3a69e0cd 839 old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
1da177e4
LT
840
841 /* We don't touch inode->i_nlink */
842
843 if (ret) {
844 /* Oh shit. We really ought to make a single node which can do both atomically */
845 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
ced22070 846 mutex_lock(&f->sem);
d8c76e6f 847 inc_nlink(old_dentry->d_inode);
1da177e4
LT
848 if (f->inocache)
849 f->inocache->nlink++;
ced22070 850 mutex_unlock(&f->sem);
1da177e4
LT
851
852 printk(KERN_NOTICE "jffs2_rename(): Link succeeded, unlink failed (err %d). You now have a hard link\n", ret);
853 /* Might as well let the VFS know */
854 d_instantiate(new_dentry, old_dentry->d_inode);
855 atomic_inc(&old_dentry->d_inode->i_count);
3a69e0cd 856 new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now);
1da177e4
LT
857 return ret;
858 }
859
860 if (S_ISDIR(old_dentry->d_inode->i_mode))
9a53c3a7 861 drop_nlink(old_dir_i);
1da177e4 862
3a69e0cd
AB
863 new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
864
1da177e4
LT
865 return 0;
866}
867