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