]> bbs.cooldavid.org Git - net-next-2.6.git/blame - fs/jffs2/dir.c
Merge branch 'for-linus' of git://git.infradead.org/users/eparis/notify
[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 369 /* We use f->target field to store the target path. */
04aadf36 370 f->target = kmemdup(target, targetlen + 1, GFP_KERNEL);
2b79adcc 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 379 D1(printk(KERN_DEBUG "jffs2_symlink: symlink's target '%s' cached\n", (char *)f->target));
32f1a95d 380
182ec4ee 381 /* No data here. Only a metadata node, which will be
1da177e4
LT
382 obsoleted by the first data write
383 */
384 f->metadata = fn;
ced22070 385 mutex_unlock(&f->sem);
1da177e4
LT
386
387 jffs2_complete_reservation(c);
aa98d7cf
KK
388
389 ret = jffs2_init_security(inode, dir_i);
f324e4cb
DW
390 if (ret)
391 goto fail;
392
cfc8dc6f 393 ret = jffs2_init_acl_post(inode);
f324e4cb
DW
394 if (ret)
395 goto fail;
aa98d7cf 396
9fe4854c
DW
397 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
398 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
f324e4cb
DW
399 if (ret)
400 goto fail;
1da177e4
LT
401
402 rd = jffs2_alloc_raw_dirent();
403 if (!rd) {
404 /* Argh. Now we treat it like a normal delete */
405 jffs2_complete_reservation(c);
f324e4cb
DW
406 ret = -ENOMEM;
407 goto fail;
1da177e4
LT
408 }
409
410 dir_f = JFFS2_INODE_INFO(dir_i);
ced22070 411 mutex_lock(&dir_f->sem);
1da177e4
LT
412
413 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
414 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
415 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
416 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
417
418 rd->pino = cpu_to_je32(dir_i->i_ino);
419 rd->version = cpu_to_je32(++dir_f->highest_version);
420 rd->ino = cpu_to_je32(inode->i_ino);
421 rd->mctime = cpu_to_je32(get_seconds());
422 rd->nsize = namelen;
423 rd->type = DT_LNK;
424 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
425 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
426
9fe4854c 427 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
1da177e4
LT
428
429 if (IS_ERR(fd)) {
182ec4ee 430 /* dirent failed to write. Delete the inode normally
1da177e4
LT
431 as if it were the final unlink() */
432 jffs2_complete_reservation(c);
433 jffs2_free_raw_dirent(rd);
ced22070 434 mutex_unlock(&dir_f->sem);
f324e4cb
DW
435 ret = PTR_ERR(fd);
436 goto fail;
1da177e4
LT
437 }
438
439 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
440
441 jffs2_free_raw_dirent(rd);
442
443 /* Link the fd into the inode's list, obsoleting an old
444 one if necessary. */
445 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
446
ced22070 447 mutex_unlock(&dir_f->sem);
1da177e4
LT
448 jffs2_complete_reservation(c);
449
450 d_instantiate(dentry, inode);
e72e6497 451 unlock_new_inode(inode);
1da177e4 452 return 0;
f324e4cb
DW
453
454 fail:
41cce647 455 iget_failed(inode);
f324e4cb 456 return ret;
1da177e4
LT
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;
1da177e4
LT
503
504 f = JFFS2_INODE_INFO(inode);
505
27c72b04
DW
506 /* Directories get nlink 2 at start */
507 inode->i_nlink = 2;
508 /* but ic->pino_nlink is the parent ino# */
509 f->inocache->pino_nlink = dir_i->i_ino;
510
1da177e4
LT
511 ri->data_crc = cpu_to_je32(0);
512 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 513
9fe4854c 514 fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL);
1da177e4
LT
515
516 jffs2_free_raw_inode(ri);
517
518 if (IS_ERR(fn)) {
519 /* Eeek. Wave bye bye */
ced22070 520 mutex_unlock(&f->sem);
1da177e4 521 jffs2_complete_reservation(c);
f324e4cb
DW
522 ret = PTR_ERR(fn);
523 goto fail;
1da177e4 524 }
182ec4ee 525 /* No data here. Only a metadata node, which will be
1da177e4
LT
526 obsoleted by the first data write
527 */
528 f->metadata = fn;
ced22070 529 mutex_unlock(&f->sem);
1da177e4
LT
530
531 jffs2_complete_reservation(c);
aa98d7cf
KK
532
533 ret = jffs2_init_security(inode, dir_i);
f324e4cb
DW
534 if (ret)
535 goto fail;
536
cfc8dc6f 537 ret = jffs2_init_acl_post(inode);
f324e4cb
DW
538 if (ret)
539 goto fail;
aa98d7cf 540
9fe4854c
DW
541 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
542 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
f324e4cb
DW
543 if (ret)
544 goto fail;
182ec4ee 545
1da177e4
LT
546 rd = jffs2_alloc_raw_dirent();
547 if (!rd) {
548 /* Argh. Now we treat it like a normal delete */
549 jffs2_complete_reservation(c);
f324e4cb
DW
550 ret = -ENOMEM;
551 goto fail;
1da177e4
LT
552 }
553
554 dir_f = JFFS2_INODE_INFO(dir_i);
ced22070 555 mutex_lock(&dir_f->sem);
1da177e4
LT
556
557 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
558 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
559 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
560 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
561
562 rd->pino = cpu_to_je32(dir_i->i_ino);
563 rd->version = cpu_to_je32(++dir_f->highest_version);
564 rd->ino = cpu_to_je32(inode->i_ino);
565 rd->mctime = cpu_to_je32(get_seconds());
566 rd->nsize = namelen;
567 rd->type = DT_DIR;
568 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
569 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
570
9fe4854c 571 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
182ec4ee 572
1da177e4 573 if (IS_ERR(fd)) {
182ec4ee 574 /* dirent failed to write. Delete the inode normally
1da177e4
LT
575 as if it were the final unlink() */
576 jffs2_complete_reservation(c);
577 jffs2_free_raw_dirent(rd);
ced22070 578 mutex_unlock(&dir_f->sem);
f324e4cb
DW
579 ret = PTR_ERR(fd);
580 goto fail;
1da177e4
LT
581 }
582
583 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
d8c76e6f 584 inc_nlink(dir_i);
1da177e4
LT
585
586 jffs2_free_raw_dirent(rd);
587
588 /* Link the fd into the inode's list, obsoleting an old
589 one if necessary. */
590 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
591
ced22070 592 mutex_unlock(&dir_f->sem);
1da177e4
LT
593 jffs2_complete_reservation(c);
594
595 d_instantiate(dentry, inode);
e72e6497 596 unlock_new_inode(inode);
1da177e4 597 return 0;
f324e4cb
DW
598
599 fail:
41cce647 600 iget_failed(inode);
f324e4cb 601 return ret;
1da177e4
LT
602}
603
604static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
605{
27c72b04
DW
606 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
607 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
1da177e4
LT
608 struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
609 struct jffs2_full_dirent *fd;
610 int ret;
27c72b04 611 uint32_t now = get_seconds();
1da177e4
LT
612
613 for (fd = f->dents ; fd; fd = fd->next) {
614 if (fd->ino)
615 return -ENOTEMPTY;
616 }
27c72b04
DW
617
618 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
619 dentry->d_name.len, f, now);
620 if (!ret) {
621 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
622 clear_nlink(dentry->d_inode);
9a53c3a7 623 drop_nlink(dir_i);
27c72b04 624 }
1da177e4
LT
625 return ret;
626}
627
265489f0 628static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, dev_t rdev)
1da177e4
LT
629{
630 struct jffs2_inode_info *f, *dir_f;
631 struct jffs2_sb_info *c;
632 struct inode *inode;
633 struct jffs2_raw_inode *ri;
634 struct jffs2_raw_dirent *rd;
635 struct jffs2_full_dnode *fn;
636 struct jffs2_full_dirent *fd;
637 int namelen;
aef9ab47 638 union jffs2_device_node dev;
1da177e4 639 int devlen = 0;
9fe4854c 640 uint32_t alloclen;
1da177e4
LT
641 int ret;
642
aef9ab47 643 if (!new_valid_dev(rdev))
1da177e4
LT
644 return -EINVAL;
645
646 ri = jffs2_alloc_raw_inode();
647 if (!ri)
648 return -ENOMEM;
182ec4ee 649
1da177e4 650 c = JFFS2_SB_INFO(dir_i->i_sb);
182ec4ee 651
aef9ab47
DW
652 if (S_ISBLK(mode) || S_ISCHR(mode))
653 devlen = jffs2_encode_dev(&dev, rdev);
182ec4ee
TG
654
655 /* Try to reserve enough space for both node and dirent.
656 * Just the node will do for now, though
1da177e4
LT
657 */
658 namelen = dentry->d_name.len;
9fe4854c 659 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &alloclen,
aef9ab47 660 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
661
662 if (ret) {
663 jffs2_free_raw_inode(ri);
664 return ret;
665 }
666
cfc8dc6f 667 inode = jffs2_new_inode(dir_i, mode, ri);
1da177e4
LT
668
669 if (IS_ERR(inode)) {
670 jffs2_free_raw_inode(ri);
671 jffs2_complete_reservation(c);
672 return PTR_ERR(inode);
673 }
674 inode->i_op = &jffs2_file_inode_operations;
675 init_special_inode(inode, inode->i_mode, rdev);
676
677 f = JFFS2_INODE_INFO(inode);
678
679 ri->dsize = ri->csize = cpu_to_je32(devlen);
680 ri->totlen = cpu_to_je32(sizeof(*ri) + devlen);
681 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
682
683 ri->compr = JFFS2_COMPR_NONE;
684 ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen));
685 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 686
9fe4854c 687 fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, ALLOC_NORMAL);
1da177e4
LT
688
689 jffs2_free_raw_inode(ri);
690
691 if (IS_ERR(fn)) {
692 /* Eeek. Wave bye bye */
ced22070 693 mutex_unlock(&f->sem);
1da177e4 694 jffs2_complete_reservation(c);
f324e4cb
DW
695 ret = PTR_ERR(fn);
696 goto fail;
1da177e4 697 }
182ec4ee 698 /* No data here. Only a metadata node, which will be
1da177e4
LT
699 obsoleted by the first data write
700 */
701 f->metadata = fn;
ced22070 702 mutex_unlock(&f->sem);
1da177e4
LT
703
704 jffs2_complete_reservation(c);
aa98d7cf
KK
705
706 ret = jffs2_init_security(inode, dir_i);
f324e4cb
DW
707 if (ret)
708 goto fail;
709
cfc8dc6f 710 ret = jffs2_init_acl_post(inode);
f324e4cb
DW
711 if (ret)
712 goto fail;
aa98d7cf 713
9fe4854c
DW
714 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
715 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
f324e4cb
DW
716 if (ret)
717 goto fail;
1da177e4
LT
718
719 rd = jffs2_alloc_raw_dirent();
720 if (!rd) {
721 /* Argh. Now we treat it like a normal delete */
722 jffs2_complete_reservation(c);
f324e4cb
DW
723 ret = -ENOMEM;
724 goto fail;
1da177e4
LT
725 }
726
727 dir_f = JFFS2_INODE_INFO(dir_i);
ced22070 728 mutex_lock(&dir_f->sem);
1da177e4
LT
729
730 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
731 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
732 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
733 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
734
735 rd->pino = cpu_to_je32(dir_i->i_ino);
736 rd->version = cpu_to_je32(++dir_f->highest_version);
737 rd->ino = cpu_to_je32(inode->i_ino);
738 rd->mctime = cpu_to_je32(get_seconds());
739 rd->nsize = namelen;
740
741 /* XXX: This is ugly. */
742 rd->type = (mode & S_IFMT) >> 12;
743
744 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
745 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
746
9fe4854c 747 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
182ec4ee 748
1da177e4 749 if (IS_ERR(fd)) {
182ec4ee 750 /* dirent failed to write. Delete the inode normally
1da177e4
LT
751 as if it were the final unlink() */
752 jffs2_complete_reservation(c);
753 jffs2_free_raw_dirent(rd);
ced22070 754 mutex_unlock(&dir_f->sem);
f324e4cb
DW
755 ret = PTR_ERR(fd);
756 goto fail;
1da177e4
LT
757 }
758
759 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
760
761 jffs2_free_raw_dirent(rd);
762
763 /* Link the fd into the inode's list, obsoleting an old
764 one if necessary. */
765 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
766
ced22070 767 mutex_unlock(&dir_f->sem);
1da177e4
LT
768 jffs2_complete_reservation(c);
769
770 d_instantiate(dentry, inode);
e72e6497 771 unlock_new_inode(inode);
1da177e4 772 return 0;
f324e4cb
DW
773
774 fail:
41cce647 775 iget_failed(inode);
f324e4cb 776 return ret;
1da177e4
LT
777}
778
779static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
ef53cb02 780 struct inode *new_dir_i, struct dentry *new_dentry)
1da177e4
LT
781{
782 int ret;
783 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
784 struct jffs2_inode_info *victim_f = NULL;
785 uint8_t type;
3a69e0cd 786 uint32_t now;
1da177e4 787
182ec4ee 788 /* The VFS will check for us and prevent trying to rename a
1da177e4
LT
789 * file over a directory and vice versa, but if it's a directory,
790 * the VFS can't check whether the victim is empty. The filesystem
791 * needs to do that for itself.
792 */
793 if (new_dentry->d_inode) {
794 victim_f = JFFS2_INODE_INFO(new_dentry->d_inode);
795 if (S_ISDIR(new_dentry->d_inode->i_mode)) {
796 struct jffs2_full_dirent *fd;
797
ced22070 798 mutex_lock(&victim_f->sem);
1da177e4
LT
799 for (fd = victim_f->dents; fd; fd = fd->next) {
800 if (fd->ino) {
ced22070 801 mutex_unlock(&victim_f->sem);
1da177e4
LT
802 return -ENOTEMPTY;
803 }
804 }
ced22070 805 mutex_unlock(&victim_f->sem);
1da177e4
LT
806 }
807 }
808
809 /* XXX: We probably ought to alloc enough space for
182ec4ee 810 both nodes at the same time. Writing the new link,
1da177e4
LT
811 then getting -ENOSPC, is quite bad :)
812 */
813
814 /* Make a hard link */
182ec4ee 815
1da177e4
LT
816 /* XXX: This is ugly */
817 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
818 if (!type) type = DT_REG;
819
3a69e0cd 820 now = get_seconds();
182ec4ee 821 ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i),
1da177e4 822 old_dentry->d_inode->i_ino, type,
3a69e0cd 823 new_dentry->d_name.name, new_dentry->d_name.len, now);
1da177e4
LT
824
825 if (ret)
826 return ret;
827
828 if (victim_f) {
829 /* There was a victim. Kill it off nicely */
9a53c3a7 830 drop_nlink(new_dentry->d_inode);
1da177e4
LT
831 /* Don't oops if the victim was a dirent pointing to an
832 inode which didn't exist. */
833 if (victim_f->inocache) {
ced22070 834 mutex_lock(&victim_f->sem);
27c72b04
DW
835 if (S_ISDIR(new_dentry->d_inode->i_mode))
836 victim_f->inocache->pino_nlink = 0;
837 else
838 victim_f->inocache->pino_nlink--;
ced22070 839 mutex_unlock(&victim_f->sem);
1da177e4
LT
840 }
841 }
842
182ec4ee 843 /* If it was a directory we moved, and there was no victim,
1da177e4
LT
844 increase i_nlink on its new parent */
845 if (S_ISDIR(old_dentry->d_inode->i_mode) && !victim_f)
d8c76e6f 846 inc_nlink(new_dir_i);
1da177e4
LT
847
848 /* Unlink the original */
182ec4ee 849 ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
3a69e0cd 850 old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
1da177e4
LT
851
852 /* We don't touch inode->i_nlink */
853
854 if (ret) {
855 /* Oh shit. We really ought to make a single node which can do both atomically */
856 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
ced22070 857 mutex_lock(&f->sem);
d8c76e6f 858 inc_nlink(old_dentry->d_inode);
27c72b04
DW
859 if (f->inocache && !S_ISDIR(old_dentry->d_inode->i_mode))
860 f->inocache->pino_nlink++;
ced22070 861 mutex_unlock(&f->sem);
1da177e4
LT
862
863 printk(KERN_NOTICE "jffs2_rename(): Link succeeded, unlink failed (err %d). You now have a hard link\n", ret);
864 /* Might as well let the VFS know */
865 d_instantiate(new_dentry, old_dentry->d_inode);
7de9c6ee 866 ihold(old_dentry->d_inode);
3a69e0cd 867 new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now);
1da177e4
LT
868 return ret;
869 }
870
871 if (S_ISDIR(old_dentry->d_inode->i_mode))
9a53c3a7 872 drop_nlink(old_dir_i);
1da177e4 873
3a69e0cd
AB
874 new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
875
1da177e4
LT
876 return 0;
877}
878