]> bbs.cooldavid.org Git - net-next-2.6.git/blame - fs/jffs2/dir.c
[MTD] [NAND] at91_nand: Make part_probes[] static
[net-next-2.6.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
89 down(&dir_f->sem);
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;
102 up(&dir_f->sem);
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;
149 down(&f->sem);
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 }
169 up(&f->sem);
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
182ec4ee 211 ret = jffs2_do_create(c, dir_f, f, ri,
1da177e4 212 dentry->d_name.name, dentry->d_name.len);
aa98d7cf
KK
213 if (ret)
214 goto fail;
1da177e4
LT
215
216 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(ri->ctime));
217
218 jffs2_free_raw_inode(ri);
219 d_instantiate(dentry, inode);
220
221 D1(printk(KERN_DEBUG "jffs2_create: Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n",
222 inode->i_ino, inode->i_mode, inode->i_nlink, f->inocache->nlink, inode->i_mapping->nrpages));
223 return 0;
aa98d7cf
KK
224
225 fail:
226 make_bad_inode(inode);
227 iput(inode);
228 jffs2_free_raw_inode(ri);
229 return ret;
1da177e4
LT
230}
231
232/***********************************************************************/
233
234
235static int jffs2_unlink(struct inode *dir_i, struct dentry *dentry)
236{
237 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
238 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
239 struct jffs2_inode_info *dead_f = JFFS2_INODE_INFO(dentry->d_inode);
240 int ret;
3a69e0cd 241 uint32_t now = get_seconds();
1da177e4 242
182ec4ee 243 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
3a69e0cd 244 dentry->d_name.len, dead_f, now);
1da177e4
LT
245 if (dead_f->inocache)
246 dentry->d_inode->i_nlink = dead_f->inocache->nlink;
3a69e0cd
AB
247 if (!ret)
248 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
1da177e4
LT
249 return ret;
250}
251/***********************************************************************/
252
253
254static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct dentry *dentry)
255{
256 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dentry->d_inode->i_sb);
257 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
258 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
259 int ret;
260 uint8_t type;
3a69e0cd 261 uint32_t now;
1da177e4
LT
262
263 /* Don't let people make hard links to bad inodes. */
264 if (!f->inocache)
265 return -EIO;
266
267 if (S_ISDIR(old_dentry->d_inode->i_mode))
268 return -EPERM;
269
270 /* XXX: This is ugly */
271 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
272 if (!type) type = DT_REG;
273
3a69e0cd
AB
274 now = get_seconds();
275 ret = jffs2_do_link(c, dir_f, f->inocache->ino, type, dentry->d_name.name, dentry->d_name.len, now);
1da177e4
LT
276
277 if (!ret) {
278 down(&f->sem);
279 old_dentry->d_inode->i_nlink = ++f->inocache->nlink;
280 up(&f->sem);
281 d_instantiate(dentry, old_dentry->d_inode);
3a69e0cd 282 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
1da177e4
LT
283 atomic_inc(&old_dentry->d_inode->i_count);
284 }
285 return ret;
286}
287
288/***********************************************************************/
289
290static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char *target)
291{
292 struct jffs2_inode_info *f, *dir_f;
293 struct jffs2_sb_info *c;
294 struct inode *inode;
295 struct jffs2_raw_inode *ri;
296 struct jffs2_raw_dirent *rd;
297 struct jffs2_full_dnode *fn;
298 struct jffs2_full_dirent *fd;
299 int namelen;
9fe4854c 300 uint32_t alloclen;
32f1a95d 301 int ret, targetlen = strlen(target);
1da177e4
LT
302
303 /* FIXME: If you care. We'd need to use frags for the target
304 if it grows much more than this */
32f1a95d 305 if (targetlen > 254)
1da177e4
LT
306 return -EINVAL;
307
308 ri = jffs2_alloc_raw_inode();
309
310 if (!ri)
311 return -ENOMEM;
182ec4ee 312
1da177e4 313 c = JFFS2_SB_INFO(dir_i->i_sb);
182ec4ee
TG
314
315 /* Try to reserve enough space for both node and dirent.
316 * Just the node will do for now, though
1da177e4
LT
317 */
318 namelen = dentry->d_name.len;
9fe4854c
DW
319 ret = jffs2_reserve_space(c, sizeof(*ri) + targetlen, &alloclen,
320 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
321
322 if (ret) {
323 jffs2_free_raw_inode(ri);
324 return ret;
325 }
326
cfc8dc6f 327 inode = jffs2_new_inode(dir_i, S_IFLNK | S_IRWXUGO, ri);
1da177e4
LT
328
329 if (IS_ERR(inode)) {
330 jffs2_free_raw_inode(ri);
331 jffs2_complete_reservation(c);
332 return PTR_ERR(inode);
333 }
334
335 inode->i_op = &jffs2_symlink_inode_operations;
336
337 f = JFFS2_INODE_INFO(inode);
338
32f1a95d 339 inode->i_size = targetlen;
1da177e4
LT
340 ri->isize = ri->dsize = ri->csize = cpu_to_je32(inode->i_size);
341 ri->totlen = cpu_to_je32(sizeof(*ri) + inode->i_size);
342 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
343
344 ri->compr = JFFS2_COMPR_NONE;
32f1a95d 345 ri->data_crc = cpu_to_je32(crc32(0, target, targetlen));
1da177e4 346 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 347
9fe4854c 348 fn = jffs2_write_dnode(c, f, ri, target, targetlen, ALLOC_NORMAL);
1da177e4
LT
349
350 jffs2_free_raw_inode(ri);
351
352 if (IS_ERR(fn)) {
353 /* Eeek. Wave bye bye */
354 up(&f->sem);
355 jffs2_complete_reservation(c);
356 jffs2_clear_inode(inode);
357 return PTR_ERR(fn);
358 }
32f1a95d 359
2b79adcc
AB
360 /* We use f->target field to store the target path. */
361 f->target = kmalloc(targetlen + 1, GFP_KERNEL);
362 if (!f->target) {
32f1a95d
AB
363 printk(KERN_WARNING "Can't allocate %d bytes of memory\n", targetlen + 1);
364 up(&f->sem);
365 jffs2_complete_reservation(c);
366 jffs2_clear_inode(inode);
367 return -ENOMEM;
368 }
369
2b79adcc
AB
370 memcpy(f->target, target, targetlen + 1);
371 D1(printk(KERN_DEBUG "jffs2_symlink: symlink's target '%s' cached\n", (char *)f->target));
32f1a95d 372
182ec4ee 373 /* No data here. Only a metadata node, which will be
1da177e4
LT
374 obsoleted by the first data write
375 */
376 f->metadata = fn;
377 up(&f->sem);
378
379 jffs2_complete_reservation(c);
aa98d7cf
KK
380
381 ret = jffs2_init_security(inode, dir_i);
382 if (ret) {
383 jffs2_clear_inode(inode);
384 return ret;
385 }
cfc8dc6f 386 ret = jffs2_init_acl_post(inode);
aa98d7cf
KK
387 if (ret) {
388 jffs2_clear_inode(inode);
389 return ret;
390 }
391
9fe4854c
DW
392 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
393 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
1da177e4
LT
394 if (ret) {
395 /* Eep. */
396 jffs2_clear_inode(inode);
397 return ret;
398 }
399
400 rd = jffs2_alloc_raw_dirent();
401 if (!rd) {
402 /* Argh. Now we treat it like a normal delete */
403 jffs2_complete_reservation(c);
404 jffs2_clear_inode(inode);
405 return -ENOMEM;
406 }
407
408 dir_f = JFFS2_INODE_INFO(dir_i);
409 down(&dir_f->sem);
410
411 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
412 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
413 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
414 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
415
416 rd->pino = cpu_to_je32(dir_i->i_ino);
417 rd->version = cpu_to_je32(++dir_f->highest_version);
418 rd->ino = cpu_to_je32(inode->i_ino);
419 rd->mctime = cpu_to_je32(get_seconds());
420 rd->nsize = namelen;
421 rd->type = DT_LNK;
422 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
423 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
424
9fe4854c 425 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
1da177e4
LT
426
427 if (IS_ERR(fd)) {
182ec4ee 428 /* dirent failed to write. Delete the inode normally
1da177e4
LT
429 as if it were the final unlink() */
430 jffs2_complete_reservation(c);
431 jffs2_free_raw_dirent(rd);
432 up(&dir_f->sem);
433 jffs2_clear_inode(inode);
434 return PTR_ERR(fd);
435 }
436
437 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
438
439 jffs2_free_raw_dirent(rd);
440
441 /* Link the fd into the inode's list, obsoleting an old
442 one if necessary. */
443 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
444
445 up(&dir_f->sem);
446 jffs2_complete_reservation(c);
447
448 d_instantiate(dentry, inode);
449 return 0;
450}
451
452
453static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode)
454{
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;
9fe4854c 463 uint32_t alloclen;
1da177e4
LT
464 int ret;
465
466 mode |= S_IFDIR;
467
468 ri = jffs2_alloc_raw_inode();
469 if (!ri)
470 return -ENOMEM;
182ec4ee 471
1da177e4
LT
472 c = JFFS2_SB_INFO(dir_i->i_sb);
473
182ec4ee
TG
474 /* Try to reserve enough space for both node and dirent.
475 * Just the node will do for now, though
1da177e4
LT
476 */
477 namelen = dentry->d_name.len;
9fe4854c
DW
478 ret = jffs2_reserve_space(c, sizeof(*ri), &alloclen, ALLOC_NORMAL,
479 JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
480
481 if (ret) {
482 jffs2_free_raw_inode(ri);
483 return ret;
484 }
485
cfc8dc6f 486 inode = jffs2_new_inode(dir_i, mode, ri);
1da177e4
LT
487
488 if (IS_ERR(inode)) {
489 jffs2_free_raw_inode(ri);
490 jffs2_complete_reservation(c);
491 return PTR_ERR(inode);
492 }
493
494 inode->i_op = &jffs2_dir_inode_operations;
495 inode->i_fop = &jffs2_dir_operations;
496 /* Directories get nlink 2 at start */
497 inode->i_nlink = 2;
498
499 f = JFFS2_INODE_INFO(inode);
500
501 ri->data_crc = cpu_to_je32(0);
502 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 503
9fe4854c 504 fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL);
1da177e4
LT
505
506 jffs2_free_raw_inode(ri);
507
508 if (IS_ERR(fn)) {
509 /* Eeek. Wave bye bye */
510 up(&f->sem);
511 jffs2_complete_reservation(c);
512 jffs2_clear_inode(inode);
513 return PTR_ERR(fn);
514 }
182ec4ee 515 /* No data here. Only a metadata node, which will be
1da177e4
LT
516 obsoleted by the first data write
517 */
518 f->metadata = fn;
519 up(&f->sem);
520
521 jffs2_complete_reservation(c);
aa98d7cf
KK
522
523 ret = jffs2_init_security(inode, dir_i);
524 if (ret) {
525 jffs2_clear_inode(inode);
526 return ret;
527 }
cfc8dc6f 528 ret = jffs2_init_acl_post(inode);
aa98d7cf
KK
529 if (ret) {
530 jffs2_clear_inode(inode);
531 return ret;
532 }
533
9fe4854c
DW
534 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
535 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
1da177e4
LT
536 if (ret) {
537 /* Eep. */
538 jffs2_clear_inode(inode);
539 return ret;
540 }
182ec4ee 541
1da177e4
LT
542 rd = jffs2_alloc_raw_dirent();
543 if (!rd) {
544 /* Argh. Now we treat it like a normal delete */
545 jffs2_complete_reservation(c);
546 jffs2_clear_inode(inode);
547 return -ENOMEM;
548 }
549
550 dir_f = JFFS2_INODE_INFO(dir_i);
551 down(&dir_f->sem);
552
553 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
554 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
555 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
556 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
557
558 rd->pino = cpu_to_je32(dir_i->i_ino);
559 rd->version = cpu_to_je32(++dir_f->highest_version);
560 rd->ino = cpu_to_je32(inode->i_ino);
561 rd->mctime = cpu_to_je32(get_seconds());
562 rd->nsize = namelen;
563 rd->type = DT_DIR;
564 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
565 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
566
9fe4854c 567 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
182ec4ee 568
1da177e4 569 if (IS_ERR(fd)) {
182ec4ee 570 /* dirent failed to write. Delete the inode normally
1da177e4
LT
571 as if it were the final unlink() */
572 jffs2_complete_reservation(c);
573 jffs2_free_raw_dirent(rd);
574 up(&dir_f->sem);
575 jffs2_clear_inode(inode);
576 return PTR_ERR(fd);
577 }
578
579 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
d8c76e6f 580 inc_nlink(dir_i);
1da177e4
LT
581
582 jffs2_free_raw_dirent(rd);
583
584 /* Link the fd into the inode's list, obsoleting an old
585 one if necessary. */
586 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
587
588 up(&dir_f->sem);
589 jffs2_complete_reservation(c);
590
591 d_instantiate(dentry, inode);
592 return 0;
593}
594
595static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
596{
597 struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
598 struct jffs2_full_dirent *fd;
599 int ret;
600
601 for (fd = f->dents ; fd; fd = fd->next) {
602 if (fd->ino)
603 return -ENOTEMPTY;
604 }
605 ret = jffs2_unlink(dir_i, dentry);
606 if (!ret)
9a53c3a7 607 drop_nlink(dir_i);
1da177e4
LT
608 return ret;
609}
610
265489f0 611static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, dev_t rdev)
1da177e4
LT
612{
613 struct jffs2_inode_info *f, *dir_f;
614 struct jffs2_sb_info *c;
615 struct inode *inode;
616 struct jffs2_raw_inode *ri;
617 struct jffs2_raw_dirent *rd;
618 struct jffs2_full_dnode *fn;
619 struct jffs2_full_dirent *fd;
620 int namelen;
aef9ab47 621 union jffs2_device_node dev;
1da177e4 622 int devlen = 0;
9fe4854c 623 uint32_t alloclen;
1da177e4
LT
624 int ret;
625
aef9ab47 626 if (!new_valid_dev(rdev))
1da177e4
LT
627 return -EINVAL;
628
629 ri = jffs2_alloc_raw_inode();
630 if (!ri)
631 return -ENOMEM;
182ec4ee 632
1da177e4 633 c = JFFS2_SB_INFO(dir_i->i_sb);
182ec4ee 634
aef9ab47
DW
635 if (S_ISBLK(mode) || S_ISCHR(mode))
636 devlen = jffs2_encode_dev(&dev, rdev);
182ec4ee
TG
637
638 /* Try to reserve enough space for both node and dirent.
639 * Just the node will do for now, though
1da177e4
LT
640 */
641 namelen = dentry->d_name.len;
9fe4854c 642 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &alloclen,
aef9ab47 643 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
644
645 if (ret) {
646 jffs2_free_raw_inode(ri);
647 return ret;
648 }
649
cfc8dc6f 650 inode = jffs2_new_inode(dir_i, mode, ri);
1da177e4
LT
651
652 if (IS_ERR(inode)) {
653 jffs2_free_raw_inode(ri);
654 jffs2_complete_reservation(c);
655 return PTR_ERR(inode);
656 }
657 inode->i_op = &jffs2_file_inode_operations;
658 init_special_inode(inode, inode->i_mode, rdev);
659
660 f = JFFS2_INODE_INFO(inode);
661
662 ri->dsize = ri->csize = cpu_to_je32(devlen);
663 ri->totlen = cpu_to_je32(sizeof(*ri) + devlen);
664 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
665
666 ri->compr = JFFS2_COMPR_NONE;
667 ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen));
668 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 669
9fe4854c 670 fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, ALLOC_NORMAL);
1da177e4
LT
671
672 jffs2_free_raw_inode(ri);
673
674 if (IS_ERR(fn)) {
675 /* Eeek. Wave bye bye */
676 up(&f->sem);
677 jffs2_complete_reservation(c);
678 jffs2_clear_inode(inode);
679 return PTR_ERR(fn);
680 }
182ec4ee 681 /* No data here. Only a metadata node, which will be
1da177e4
LT
682 obsoleted by the first data write
683 */
684 f->metadata = fn;
685 up(&f->sem);
686
687 jffs2_complete_reservation(c);
aa98d7cf
KK
688
689 ret = jffs2_init_security(inode, dir_i);
690 if (ret) {
691 jffs2_clear_inode(inode);
692 return ret;
693 }
cfc8dc6f 694 ret = jffs2_init_acl_post(inode);
aa98d7cf
KK
695 if (ret) {
696 jffs2_clear_inode(inode);
697 return ret;
698 }
699
9fe4854c
DW
700 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
701 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
1da177e4
LT
702 if (ret) {
703 /* Eep. */
704 jffs2_clear_inode(inode);
705 return ret;
706 }
707
708 rd = jffs2_alloc_raw_dirent();
709 if (!rd) {
710 /* Argh. Now we treat it like a normal delete */
711 jffs2_complete_reservation(c);
712 jffs2_clear_inode(inode);
713 return -ENOMEM;
714 }
715
716 dir_f = JFFS2_INODE_INFO(dir_i);
717 down(&dir_f->sem);
718
719 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
720 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
721 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
722 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
723
724 rd->pino = cpu_to_je32(dir_i->i_ino);
725 rd->version = cpu_to_je32(++dir_f->highest_version);
726 rd->ino = cpu_to_je32(inode->i_ino);
727 rd->mctime = cpu_to_je32(get_seconds());
728 rd->nsize = namelen;
729
730 /* XXX: This is ugly. */
731 rd->type = (mode & S_IFMT) >> 12;
732
733 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
734 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
735
9fe4854c 736 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
182ec4ee 737
1da177e4 738 if (IS_ERR(fd)) {
182ec4ee 739 /* dirent failed to write. Delete the inode normally
1da177e4
LT
740 as if it were the final unlink() */
741 jffs2_complete_reservation(c);
742 jffs2_free_raw_dirent(rd);
743 up(&dir_f->sem);
744 jffs2_clear_inode(inode);
745 return PTR_ERR(fd);
746 }
747
748 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
749
750 jffs2_free_raw_dirent(rd);
751
752 /* Link the fd into the inode's list, obsoleting an old
753 one if necessary. */
754 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
755
756 up(&dir_f->sem);
757 jffs2_complete_reservation(c);
758
759 d_instantiate(dentry, inode);
760
761 return 0;
762}
763
764static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
ef53cb02 765 struct inode *new_dir_i, struct dentry *new_dentry)
1da177e4
LT
766{
767 int ret;
768 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
769 struct jffs2_inode_info *victim_f = NULL;
770 uint8_t type;
3a69e0cd 771 uint32_t now;
1da177e4 772
182ec4ee 773 /* The VFS will check for us and prevent trying to rename a
1da177e4
LT
774 * file over a directory and vice versa, but if it's a directory,
775 * the VFS can't check whether the victim is empty. The filesystem
776 * needs to do that for itself.
777 */
778 if (new_dentry->d_inode) {
779 victim_f = JFFS2_INODE_INFO(new_dentry->d_inode);
780 if (S_ISDIR(new_dentry->d_inode->i_mode)) {
781 struct jffs2_full_dirent *fd;
782
783 down(&victim_f->sem);
784 for (fd = victim_f->dents; fd; fd = fd->next) {
785 if (fd->ino) {
786 up(&victim_f->sem);
787 return -ENOTEMPTY;
788 }
789 }
790 up(&victim_f->sem);
791 }
792 }
793
794 /* XXX: We probably ought to alloc enough space for
182ec4ee 795 both nodes at the same time. Writing the new link,
1da177e4
LT
796 then getting -ENOSPC, is quite bad :)
797 */
798
799 /* Make a hard link */
182ec4ee 800
1da177e4
LT
801 /* XXX: This is ugly */
802 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
803 if (!type) type = DT_REG;
804
3a69e0cd 805 now = get_seconds();
182ec4ee 806 ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i),
1da177e4 807 old_dentry->d_inode->i_ino, type,
3a69e0cd 808 new_dentry->d_name.name, new_dentry->d_name.len, now);
1da177e4
LT
809
810 if (ret)
811 return ret;
812
813 if (victim_f) {
814 /* There was a victim. Kill it off nicely */
9a53c3a7 815 drop_nlink(new_dentry->d_inode);
1da177e4
LT
816 /* Don't oops if the victim was a dirent pointing to an
817 inode which didn't exist. */
818 if (victim_f->inocache) {
819 down(&victim_f->sem);
820 victim_f->inocache->nlink--;
821 up(&victim_f->sem);
822 }
823 }
824
182ec4ee 825 /* If it was a directory we moved, and there was no victim,
1da177e4
LT
826 increase i_nlink on its new parent */
827 if (S_ISDIR(old_dentry->d_inode->i_mode) && !victim_f)
d8c76e6f 828 inc_nlink(new_dir_i);
1da177e4
LT
829
830 /* Unlink the original */
182ec4ee 831 ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
3a69e0cd 832 old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
1da177e4
LT
833
834 /* We don't touch inode->i_nlink */
835
836 if (ret) {
837 /* Oh shit. We really ought to make a single node which can do both atomically */
838 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
839 down(&f->sem);
d8c76e6f 840 inc_nlink(old_dentry->d_inode);
1da177e4
LT
841 if (f->inocache)
842 f->inocache->nlink++;
843 up(&f->sem);
844
845 printk(KERN_NOTICE "jffs2_rename(): Link succeeded, unlink failed (err %d). You now have a hard link\n", ret);
846 /* Might as well let the VFS know */
847 d_instantiate(new_dentry, old_dentry->d_inode);
848 atomic_inc(&old_dentry->d_inode->i_count);
3a69e0cd 849 new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now);
1da177e4
LT
850 return ret;
851 }
852
853 if (S_ISDIR(old_dentry->d_inode->i_mode))
9a53c3a7 854 drop_nlink(old_dir_i);
1da177e4 855
3a69e0cd
AB
856 new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
857
1da177e4
LT
858 return 0;
859}
860