Fix common misspellings
[GitHub/mt8127/android_kernel_alcatel_ttab.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.
6088c058 5 * Copyright © 2004-2010 David Woodhouse <dwmw2@infradead.org>
1da177e4
LT
6 *
7 * Created by David Woodhouse <dwmw2@infradead.org>
8 *
9 * For licensing information, see the file 'LICENCE' in this directory.
10 *
1da177e4
LT
11 */
12
13#include <linux/kernel.h>
14#include <linux/slab.h>
1da177e4
LT
15#include <linux/fs.h>
16#include <linux/crc32.h>
17#include <linux/jffs2.h>
cbb9a561
DW
18#include "jffs2_fs_i.h"
19#include "jffs2_fs_sb.h"
1da177e4
LT
20#include <linux/time.h>
21#include "nodelist.h"
22
1da177e4
LT
23static int jffs2_readdir (struct file *, void *, filldir_t);
24
25static int jffs2_create (struct inode *,struct dentry *,int,
26 struct nameidata *);
27static struct dentry *jffs2_lookup (struct inode *,struct dentry *,
28 struct nameidata *);
29static int jffs2_link (struct dentry *,struct inode *,struct dentry *);
30static int jffs2_unlink (struct inode *,struct dentry *);
31static int jffs2_symlink (struct inode *,struct dentry *,const char *);
32static int jffs2_mkdir (struct inode *,struct dentry *,int);
33static int jffs2_rmdir (struct inode *,struct dentry *);
265489f0 34static int jffs2_mknod (struct inode *,struct dentry *,int,dev_t);
1da177e4 35static int jffs2_rename (struct inode *, struct dentry *,
ef53cb02 36 struct inode *, struct dentry *);
1da177e4 37
4b6f5d20 38const struct file_operations jffs2_dir_operations =
1da177e4
LT
39{
40 .read = generic_read_dir,
41 .readdir = jffs2_readdir,
0533400b 42 .unlocked_ioctl=jffs2_ioctl,
3222a3e5
CH
43 .fsync = jffs2_fsync,
44 .llseek = generic_file_llseek,
1da177e4
LT
45};
46
47
92e1d5be 48const struct inode_operations jffs2_dir_inode_operations =
1da177e4 49{
265489f0
DW
50 .create = jffs2_create,
51 .lookup = jffs2_lookup,
1da177e4
LT
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,
18f4c644 59 .check_acl = jffs2_check_acl,
1da177e4 60 .setattr = jffs2_setattr,
aa98d7cf
KK
61 .setxattr = jffs2_setxattr,
62 .getxattr = jffs2_getxattr,
63 .listxattr = jffs2_listxattr,
64 .removexattr = jffs2_removexattr
1da177e4
LT
65};
66
67/***********************************************************************/
68
69
70/* We keep the dirent list sorted in increasing order of name hash,
182ec4ee 71 and we use the same hash function as the dentries. Makes this
1da177e4
LT
72 nice and simple
73*/
74static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target,
75 struct nameidata *nd)
76{
77 struct jffs2_inode_info *dir_f;
78 struct jffs2_sb_info *c;
79 struct jffs2_full_dirent *fd = NULL, *fd_list;
80 uint32_t ino = 0;
81 struct inode *inode = NULL;
82
83 D1(printk(KERN_DEBUG "jffs2_lookup()\n"));
84
373d5e71
RP
85 if (target->d_name.len > JFFS2_MAX_NAME_LEN)
86 return ERR_PTR(-ENAMETOOLONG);
87
1da177e4
LT
88 dir_f = JFFS2_INODE_INFO(dir_i);
89 c = JFFS2_SB_INFO(dir_i->i_sb);
90
ced22070 91 mutex_lock(&dir_f->sem);
1da177e4
LT
92
93 /* NB: The 2.2 backport will need to explicitly check for '.' and '..' here */
94 for (fd_list = dir_f->dents; fd_list && fd_list->nhash <= target->d_name.hash; fd_list = fd_list->next) {
182ec4ee 95 if (fd_list->nhash == target->d_name.hash &&
1da177e4
LT
96 (!fd || fd_list->version > fd->version) &&
97 strlen(fd_list->name) == target->d_name.len &&
98 !strncmp(fd_list->name, target->d_name.name, target->d_name.len)) {
99 fd = fd_list;
100 }
101 }
102 if (fd)
103 ino = fd->ino;
ced22070 104 mutex_unlock(&dir_f->sem);
1da177e4 105 if (ino) {
5451f79f
DH
106 inode = jffs2_iget(dir_i->i_sb, ino);
107 if (IS_ERR(inode)) {
1da177e4 108 printk(KERN_WARNING "iget() failed for ino #%u\n", ino);
5451f79f 109 return ERR_CAST(inode);
1da177e4
LT
110 }
111 }
112
8966c5e0 113 return d_splice_alias(inode, target);
1da177e4
LT
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
2a7dba39 218 ret = jffs2_do_create(c, dir_f, f, ri, &dentry->d_name);
aa98d7cf
KK
219 if (ret)
220 goto fail;
1da177e4
LT
221
222 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(ri->ctime));
223
224 jffs2_free_raw_inode(ri);
1da177e4
LT
225
226 D1(printk(KERN_DEBUG "jffs2_create: Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n",
27c72b04
DW
227 inode->i_ino, inode->i_mode, inode->i_nlink,
228 f->inocache->pino_nlink, inode->i_mapping->nrpages));
e72e6497
DW
229
230 d_instantiate(dentry, inode);
231 unlock_new_inode(inode);
1da177e4 232 return 0;
aa98d7cf
KK
233
234 fail:
41cce647 235 iget_failed(inode);
aa98d7cf
KK
236 jffs2_free_raw_inode(ri);
237 return ret;
1da177e4
LT
238}
239
240/***********************************************************************/
241
242
243static int jffs2_unlink(struct inode *dir_i, struct dentry *dentry)
244{
245 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
246 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
247 struct jffs2_inode_info *dead_f = JFFS2_INODE_INFO(dentry->d_inode);
248 int ret;
3a69e0cd 249 uint32_t now = get_seconds();
1da177e4 250
182ec4ee 251 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
3a69e0cd 252 dentry->d_name.len, dead_f, now);
1da177e4 253 if (dead_f->inocache)
27c72b04 254 dentry->d_inode->i_nlink = dead_f->inocache->pino_nlink;
3a69e0cd
AB
255 if (!ret)
256 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
1da177e4
LT
257 return ret;
258}
259/***********************************************************************/
260
261
262static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct dentry *dentry)
263{
264 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dentry->d_inode->i_sb);
265 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
266 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
267 int ret;
268 uint8_t type;
3a69e0cd 269 uint32_t now;
1da177e4
LT
270
271 /* Don't let people make hard links to bad inodes. */
272 if (!f->inocache)
273 return -EIO;
274
275 if (S_ISDIR(old_dentry->d_inode->i_mode))
276 return -EPERM;
277
278 /* XXX: This is ugly */
279 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
280 if (!type) type = DT_REG;
281
3a69e0cd
AB
282 now = get_seconds();
283 ret = jffs2_do_link(c, dir_f, f->inocache->ino, type, dentry->d_name.name, dentry->d_name.len, now);
1da177e4
LT
284
285 if (!ret) {
ced22070 286 mutex_lock(&f->sem);
27c72b04 287 old_dentry->d_inode->i_nlink = ++f->inocache->pino_nlink;
ced22070 288 mutex_unlock(&f->sem);
1da177e4 289 d_instantiate(dentry, old_dentry->d_inode);
3a69e0cd 290 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
7de9c6ee 291 ihold(old_dentry->d_inode);
1da177e4
LT
292 }
293 return ret;
294}
295
296/***********************************************************************/
297
298static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char *target)
299{
300 struct jffs2_inode_info *f, *dir_f;
301 struct jffs2_sb_info *c;
302 struct inode *inode;
303 struct jffs2_raw_inode *ri;
304 struct jffs2_raw_dirent *rd;
305 struct jffs2_full_dnode *fn;
306 struct jffs2_full_dirent *fd;
307 int namelen;
9fe4854c 308 uint32_t alloclen;
32f1a95d 309 int ret, targetlen = strlen(target);
1da177e4
LT
310
311 /* FIXME: If you care. We'd need to use frags for the target
312 if it grows much more than this */
32f1a95d 313 if (targetlen > 254)
bde86fec 314 return -ENAMETOOLONG;
1da177e4
LT
315
316 ri = jffs2_alloc_raw_inode();
317
318 if (!ri)
319 return -ENOMEM;
182ec4ee 320
1da177e4 321 c = JFFS2_SB_INFO(dir_i->i_sb);
182ec4ee
TG
322
323 /* Try to reserve enough space for both node and dirent.
324 * Just the node will do for now, though
1da177e4
LT
325 */
326 namelen = dentry->d_name.len;
9fe4854c
DW
327 ret = jffs2_reserve_space(c, sizeof(*ri) + targetlen, &alloclen,
328 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
329
330 if (ret) {
331 jffs2_free_raw_inode(ri);
332 return ret;
333 }
334
cfc8dc6f 335 inode = jffs2_new_inode(dir_i, S_IFLNK | S_IRWXUGO, ri);
1da177e4
LT
336
337 if (IS_ERR(inode)) {
338 jffs2_free_raw_inode(ri);
339 jffs2_complete_reservation(c);
340 return PTR_ERR(inode);
341 }
342
343 inode->i_op = &jffs2_symlink_inode_operations;
344
345 f = JFFS2_INODE_INFO(inode);
346
32f1a95d 347 inode->i_size = targetlen;
1da177e4
LT
348 ri->isize = ri->dsize = ri->csize = cpu_to_je32(inode->i_size);
349 ri->totlen = cpu_to_je32(sizeof(*ri) + inode->i_size);
350 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
351
352 ri->compr = JFFS2_COMPR_NONE;
32f1a95d 353 ri->data_crc = cpu_to_je32(crc32(0, target, targetlen));
1da177e4 354 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 355
9fe4854c 356 fn = jffs2_write_dnode(c, f, ri, target, targetlen, ALLOC_NORMAL);
1da177e4
LT
357
358 jffs2_free_raw_inode(ri);
359
360 if (IS_ERR(fn)) {
361 /* Eeek. Wave bye bye */
ced22070 362 mutex_unlock(&f->sem);
1da177e4 363 jffs2_complete_reservation(c);
f324e4cb
DW
364 ret = PTR_ERR(fn);
365 goto fail;
1da177e4 366 }
32f1a95d 367
2b79adcc 368 /* We use f->target field to store the target path. */
04aadf36 369 f->target = kmemdup(target, targetlen + 1, GFP_KERNEL);
2b79adcc 370 if (!f->target) {
32f1a95d 371 printk(KERN_WARNING "Can't allocate %d bytes of memory\n", targetlen + 1);
ced22070 372 mutex_unlock(&f->sem);
32f1a95d 373 jffs2_complete_reservation(c);
f324e4cb
DW
374 ret = -ENOMEM;
375 goto fail;
32f1a95d
AB
376 }
377
2b79adcc 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 387
2a7dba39 388 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
f324e4cb
DW
389 if (ret)
390 goto fail;
391
cfc8dc6f 392 ret = jffs2_init_acl_post(inode);
f324e4cb
DW
393 if (ret)
394 goto fail;
aa98d7cf 395
9fe4854c
DW
396 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
397 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
f324e4cb
DW
398 if (ret)
399 goto fail;
1da177e4
LT
400
401 rd = jffs2_alloc_raw_dirent();
402 if (!rd) {
403 /* Argh. Now we treat it like a normal delete */
404 jffs2_complete_reservation(c);
f324e4cb
DW
405 ret = -ENOMEM;
406 goto fail;
1da177e4
LT
407 }
408
409 dir_f = JFFS2_INODE_INFO(dir_i);
ced22070 410 mutex_lock(&dir_f->sem);
1da177e4
LT
411
412 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
413 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
414 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
415 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
416
417 rd->pino = cpu_to_je32(dir_i->i_ino);
418 rd->version = cpu_to_je32(++dir_f->highest_version);
419 rd->ino = cpu_to_je32(inode->i_ino);
420 rd->mctime = cpu_to_je32(get_seconds());
421 rd->nsize = namelen;
422 rd->type = DT_LNK;
423 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
424 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
425
9fe4854c 426 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
1da177e4
LT
427
428 if (IS_ERR(fd)) {
182ec4ee 429 /* dirent failed to write. Delete the inode normally
1da177e4
LT
430 as if it were the final unlink() */
431 jffs2_complete_reservation(c);
432 jffs2_free_raw_dirent(rd);
ced22070 433 mutex_unlock(&dir_f->sem);
f324e4cb
DW
434 ret = PTR_ERR(fd);
435 goto fail;
1da177e4
LT
436 }
437
438 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
439
440 jffs2_free_raw_dirent(rd);
441
442 /* Link the fd into the inode's list, obsoleting an old
443 one if necessary. */
444 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
445
ced22070 446 mutex_unlock(&dir_f->sem);
1da177e4
LT
447 jffs2_complete_reservation(c);
448
449 d_instantiate(dentry, inode);
e72e6497 450 unlock_new_inode(inode);
1da177e4 451 return 0;
f324e4cb
DW
452
453 fail:
41cce647 454 iget_failed(inode);
f324e4cb 455 return ret;
1da177e4
LT
456}
457
458
459static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode)
460{
461 struct jffs2_inode_info *f, *dir_f;
462 struct jffs2_sb_info *c;
463 struct inode *inode;
464 struct jffs2_raw_inode *ri;
465 struct jffs2_raw_dirent *rd;
466 struct jffs2_full_dnode *fn;
467 struct jffs2_full_dirent *fd;
468 int namelen;
9fe4854c 469 uint32_t alloclen;
1da177e4
LT
470 int ret;
471
472 mode |= S_IFDIR;
473
474 ri = jffs2_alloc_raw_inode();
475 if (!ri)
476 return -ENOMEM;
182ec4ee 477
1da177e4
LT
478 c = JFFS2_SB_INFO(dir_i->i_sb);
479
182ec4ee
TG
480 /* Try to reserve enough space for both node and dirent.
481 * Just the node will do for now, though
1da177e4
LT
482 */
483 namelen = dentry->d_name.len;
9fe4854c
DW
484 ret = jffs2_reserve_space(c, sizeof(*ri), &alloclen, ALLOC_NORMAL,
485 JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
486
487 if (ret) {
488 jffs2_free_raw_inode(ri);
489 return ret;
490 }
491
cfc8dc6f 492 inode = jffs2_new_inode(dir_i, mode, ri);
1da177e4
LT
493
494 if (IS_ERR(inode)) {
495 jffs2_free_raw_inode(ri);
496 jffs2_complete_reservation(c);
497 return PTR_ERR(inode);
498 }
499
500 inode->i_op = &jffs2_dir_inode_operations;
501 inode->i_fop = &jffs2_dir_operations;
1da177e4
LT
502
503 f = JFFS2_INODE_INFO(inode);
504
27c72b04
DW
505 /* Directories get nlink 2 at start */
506 inode->i_nlink = 2;
507 /* but ic->pino_nlink is the parent ino# */
508 f->inocache->pino_nlink = dir_i->i_ino;
509
1da177e4
LT
510 ri->data_crc = cpu_to_je32(0);
511 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 512
9fe4854c 513 fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL);
1da177e4
LT
514
515 jffs2_free_raw_inode(ri);
516
517 if (IS_ERR(fn)) {
518 /* Eeek. Wave bye bye */
ced22070 519 mutex_unlock(&f->sem);
1da177e4 520 jffs2_complete_reservation(c);
f324e4cb
DW
521 ret = PTR_ERR(fn);
522 goto fail;
1da177e4 523 }
182ec4ee 524 /* No data here. Only a metadata node, which will be
1da177e4
LT
525 obsoleted by the first data write
526 */
527 f->metadata = fn;
ced22070 528 mutex_unlock(&f->sem);
1da177e4
LT
529
530 jffs2_complete_reservation(c);
aa98d7cf 531
2a7dba39 532 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
f324e4cb
DW
533 if (ret)
534 goto fail;
535
cfc8dc6f 536 ret = jffs2_init_acl_post(inode);
f324e4cb
DW
537 if (ret)
538 goto fail;
aa98d7cf 539
9fe4854c
DW
540 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
541 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
f324e4cb
DW
542 if (ret)
543 goto fail;
182ec4ee 544
1da177e4
LT
545 rd = jffs2_alloc_raw_dirent();
546 if (!rd) {
547 /* Argh. Now we treat it like a normal delete */
548 jffs2_complete_reservation(c);
f324e4cb
DW
549 ret = -ENOMEM;
550 goto fail;
1da177e4
LT
551 }
552
553 dir_f = JFFS2_INODE_INFO(dir_i);
ced22070 554 mutex_lock(&dir_f->sem);
1da177e4
LT
555
556 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
557 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
558 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
559 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
560
561 rd->pino = cpu_to_je32(dir_i->i_ino);
562 rd->version = cpu_to_je32(++dir_f->highest_version);
563 rd->ino = cpu_to_je32(inode->i_ino);
564 rd->mctime = cpu_to_je32(get_seconds());
565 rd->nsize = namelen;
566 rd->type = DT_DIR;
567 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
568 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
569
9fe4854c 570 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
182ec4ee 571
1da177e4 572 if (IS_ERR(fd)) {
182ec4ee 573 /* dirent failed to write. Delete the inode normally
1da177e4
LT
574 as if it were the final unlink() */
575 jffs2_complete_reservation(c);
576 jffs2_free_raw_dirent(rd);
ced22070 577 mutex_unlock(&dir_f->sem);
f324e4cb
DW
578 ret = PTR_ERR(fd);
579 goto fail;
1da177e4
LT
580 }
581
582 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
d8c76e6f 583 inc_nlink(dir_i);
1da177e4
LT
584
585 jffs2_free_raw_dirent(rd);
586
587 /* Link the fd into the inode's list, obsoleting an old
588 one if necessary. */
589 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
590
ced22070 591 mutex_unlock(&dir_f->sem);
1da177e4
LT
592 jffs2_complete_reservation(c);
593
594 d_instantiate(dentry, inode);
e72e6497 595 unlock_new_inode(inode);
1da177e4 596 return 0;
f324e4cb
DW
597
598 fail:
41cce647 599 iget_failed(inode);
f324e4cb 600 return ret;
1da177e4
LT
601}
602
603static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
604{
27c72b04
DW
605 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
606 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
1da177e4
LT
607 struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
608 struct jffs2_full_dirent *fd;
609 int ret;
27c72b04 610 uint32_t now = get_seconds();
1da177e4
LT
611
612 for (fd = f->dents ; fd; fd = fd->next) {
613 if (fd->ino)
614 return -ENOTEMPTY;
615 }
27c72b04
DW
616
617 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
618 dentry->d_name.len, f, now);
619 if (!ret) {
620 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
621 clear_nlink(dentry->d_inode);
9a53c3a7 622 drop_nlink(dir_i);
27c72b04 623 }
1da177e4
LT
624 return ret;
625}
626
265489f0 627static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, dev_t rdev)
1da177e4
LT
628{
629 struct jffs2_inode_info *f, *dir_f;
630 struct jffs2_sb_info *c;
631 struct inode *inode;
632 struct jffs2_raw_inode *ri;
633 struct jffs2_raw_dirent *rd;
634 struct jffs2_full_dnode *fn;
635 struct jffs2_full_dirent *fd;
636 int namelen;
aef9ab47 637 union jffs2_device_node dev;
1da177e4 638 int devlen = 0;
9fe4854c 639 uint32_t alloclen;
1da177e4
LT
640 int ret;
641
aef9ab47 642 if (!new_valid_dev(rdev))
1da177e4
LT
643 return -EINVAL;
644
645 ri = jffs2_alloc_raw_inode();
646 if (!ri)
647 return -ENOMEM;
182ec4ee 648
1da177e4 649 c = JFFS2_SB_INFO(dir_i->i_sb);
182ec4ee 650
aef9ab47
DW
651 if (S_ISBLK(mode) || S_ISCHR(mode))
652 devlen = jffs2_encode_dev(&dev, rdev);
182ec4ee
TG
653
654 /* Try to reserve enough space for both node and dirent.
655 * Just the node will do for now, though
1da177e4
LT
656 */
657 namelen = dentry->d_name.len;
9fe4854c 658 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &alloclen,
aef9ab47 659 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
660
661 if (ret) {
662 jffs2_free_raw_inode(ri);
663 return ret;
664 }
665
cfc8dc6f 666 inode = jffs2_new_inode(dir_i, mode, ri);
1da177e4
LT
667
668 if (IS_ERR(inode)) {
669 jffs2_free_raw_inode(ri);
670 jffs2_complete_reservation(c);
671 return PTR_ERR(inode);
672 }
673 inode->i_op = &jffs2_file_inode_operations;
674 init_special_inode(inode, inode->i_mode, rdev);
675
676 f = JFFS2_INODE_INFO(inode);
677
678 ri->dsize = ri->csize = cpu_to_je32(devlen);
679 ri->totlen = cpu_to_je32(sizeof(*ri) + devlen);
680 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
681
682 ri->compr = JFFS2_COMPR_NONE;
683 ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen));
684 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 685
9fe4854c 686 fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, ALLOC_NORMAL);
1da177e4
LT
687
688 jffs2_free_raw_inode(ri);
689
690 if (IS_ERR(fn)) {
691 /* Eeek. Wave bye bye */
ced22070 692 mutex_unlock(&f->sem);
1da177e4 693 jffs2_complete_reservation(c);
f324e4cb
DW
694 ret = PTR_ERR(fn);
695 goto fail;
1da177e4 696 }
182ec4ee 697 /* No data here. Only a metadata node, which will be
1da177e4
LT
698 obsoleted by the first data write
699 */
700 f->metadata = fn;
ced22070 701 mutex_unlock(&f->sem);
1da177e4
LT
702
703 jffs2_complete_reservation(c);
aa98d7cf 704
2a7dba39 705 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
f324e4cb
DW
706 if (ret)
707 goto fail;
708
cfc8dc6f 709 ret = jffs2_init_acl_post(inode);
f324e4cb
DW
710 if (ret)
711 goto fail;
aa98d7cf 712
9fe4854c
DW
713 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
714 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
f324e4cb
DW
715 if (ret)
716 goto fail;
1da177e4
LT
717
718 rd = jffs2_alloc_raw_dirent();
719 if (!rd) {
720 /* Argh. Now we treat it like a normal delete */
721 jffs2_complete_reservation(c);
f324e4cb
DW
722 ret = -ENOMEM;
723 goto fail;
1da177e4
LT
724 }
725
726 dir_f = JFFS2_INODE_INFO(dir_i);
ced22070 727 mutex_lock(&dir_f->sem);
1da177e4
LT
728
729 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
730 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
731 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
732 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
733
734 rd->pino = cpu_to_je32(dir_i->i_ino);
735 rd->version = cpu_to_je32(++dir_f->highest_version);
736 rd->ino = cpu_to_je32(inode->i_ino);
737 rd->mctime = cpu_to_je32(get_seconds());
738 rd->nsize = namelen;
739
740 /* XXX: This is ugly. */
741 rd->type = (mode & S_IFMT) >> 12;
742
743 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
744 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
745
9fe4854c 746 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
182ec4ee 747
1da177e4 748 if (IS_ERR(fd)) {
182ec4ee 749 /* dirent failed to write. Delete the inode normally
1da177e4
LT
750 as if it were the final unlink() */
751 jffs2_complete_reservation(c);
752 jffs2_free_raw_dirent(rd);
ced22070 753 mutex_unlock(&dir_f->sem);
f324e4cb
DW
754 ret = PTR_ERR(fd);
755 goto fail;
1da177e4
LT
756 }
757
758 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
759
760 jffs2_free_raw_dirent(rd);
761
762 /* Link the fd into the inode's list, obsoleting an old
763 one if necessary. */
764 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
765
ced22070 766 mutex_unlock(&dir_f->sem);
1da177e4
LT
767 jffs2_complete_reservation(c);
768
769 d_instantiate(dentry, inode);
e72e6497 770 unlock_new_inode(inode);
1da177e4 771 return 0;
f324e4cb
DW
772
773 fail:
41cce647 774 iget_failed(inode);
f324e4cb 775 return ret;
1da177e4
LT
776}
777
778static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
ef53cb02 779 struct inode *new_dir_i, struct dentry *new_dentry)
1da177e4
LT
780{
781 int ret;
782 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
783 struct jffs2_inode_info *victim_f = NULL;
784 uint8_t type;
3a69e0cd 785 uint32_t now;
1da177e4 786
182ec4ee 787 /* The VFS will check for us and prevent trying to rename a
1da177e4
LT
788 * file over a directory and vice versa, but if it's a directory,
789 * the VFS can't check whether the victim is empty. The filesystem
790 * needs to do that for itself.
791 */
792 if (new_dentry->d_inode) {
793 victim_f = JFFS2_INODE_INFO(new_dentry->d_inode);
794 if (S_ISDIR(new_dentry->d_inode->i_mode)) {
795 struct jffs2_full_dirent *fd;
796
ced22070 797 mutex_lock(&victim_f->sem);
1da177e4
LT
798 for (fd = victim_f->dents; fd; fd = fd->next) {
799 if (fd->ino) {
ced22070 800 mutex_unlock(&victim_f->sem);
1da177e4
LT
801 return -ENOTEMPTY;
802 }
803 }
ced22070 804 mutex_unlock(&victim_f->sem);
1da177e4
LT
805 }
806 }
807
808 /* XXX: We probably ought to alloc enough space for
182ec4ee 809 both nodes at the same time. Writing the new link,
1da177e4
LT
810 then getting -ENOSPC, is quite bad :)
811 */
812
813 /* Make a hard link */
182ec4ee 814
1da177e4
LT
815 /* XXX: This is ugly */
816 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
817 if (!type) type = DT_REG;
818
3a69e0cd 819 now = get_seconds();
182ec4ee 820 ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i),
1da177e4 821 old_dentry->d_inode->i_ino, type,
3a69e0cd 822 new_dentry->d_name.name, new_dentry->d_name.len, now);
1da177e4
LT
823
824 if (ret)
825 return ret;
826
827 if (victim_f) {
828 /* There was a victim. Kill it off nicely */
9a53c3a7 829 drop_nlink(new_dentry->d_inode);
1da177e4
LT
830 /* Don't oops if the victim was a dirent pointing to an
831 inode which didn't exist. */
832 if (victim_f->inocache) {
ced22070 833 mutex_lock(&victim_f->sem);
27c72b04
DW
834 if (S_ISDIR(new_dentry->d_inode->i_mode))
835 victim_f->inocache->pino_nlink = 0;
836 else
837 victim_f->inocache->pino_nlink--;
ced22070 838 mutex_unlock(&victim_f->sem);
1da177e4
LT
839 }
840 }
841
182ec4ee 842 /* If it was a directory we moved, and there was no victim,
1da177e4
LT
843 increase i_nlink on its new parent */
844 if (S_ISDIR(old_dentry->d_inode->i_mode) && !victim_f)
d8c76e6f 845 inc_nlink(new_dir_i);
1da177e4
LT
846
847 /* Unlink the original */
182ec4ee 848 ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
3a69e0cd 849 old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
1da177e4
LT
850
851 /* We don't touch inode->i_nlink */
852
853 if (ret) {
854 /* Oh shit. We really ought to make a single node which can do both atomically */
855 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
ced22070 856 mutex_lock(&f->sem);
d8c76e6f 857 inc_nlink(old_dentry->d_inode);
27c72b04
DW
858 if (f->inocache && !S_ISDIR(old_dentry->d_inode->i_mode))
859 f->inocache->pino_nlink++;
ced22070 860 mutex_unlock(&f->sem);
1da177e4
LT
861
862 printk(KERN_NOTICE "jffs2_rename(): Link succeeded, unlink failed (err %d). You now have a hard link\n", ret);
863 /* Might as well let the VFS know */
864 d_instantiate(new_dentry, old_dentry->d_inode);
7de9c6ee 865 ihold(old_dentry->d_inode);
3a69e0cd 866 new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now);
1da177e4
LT
867 return ret;
868 }
869
870 if (S_ISDIR(old_dentry->d_inode->i_mode))
9a53c3a7 871 drop_nlink(old_dir_i);
1da177e4 872
3a69e0cd
AB
873 new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
874
1da177e4
LT
875 return 0;
876}
877