]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - fs/jffs2/dir.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf
[mirror_ubuntu-artful-kernel.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
5a528957
JP
13#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
14
1da177e4
LT
15#include <linux/kernel.h>
16#include <linux/slab.h>
1da177e4
LT
17#include <linux/fs.h>
18#include <linux/crc32.h>
19#include <linux/jffs2.h>
cbb9a561
DW
20#include "jffs2_fs_i.h"
21#include "jffs2_fs_sb.h"
1da177e4
LT
22#include <linux/time.h>
23#include "nodelist.h"
24
0312fa7c 25static int jffs2_readdir (struct file *, struct dir_context *);
1da177e4 26
4acdaf27 27static int jffs2_create (struct inode *,struct dentry *,umode_t,
ebfc3b49 28 bool);
1da177e4 29static struct dentry *jffs2_lookup (struct inode *,struct dentry *,
00cd8dd3 30 unsigned int);
1da177e4
LT
31static int jffs2_link (struct dentry *,struct inode *,struct dentry *);
32static int jffs2_unlink (struct inode *,struct dentry *);
33static int jffs2_symlink (struct inode *,struct dentry *,const char *);
18bb1db3 34static int jffs2_mkdir (struct inode *,struct dentry *,umode_t);
1da177e4 35static int jffs2_rmdir (struct inode *,struct dentry *);
1a67aafb 36static int jffs2_mknod (struct inode *,struct dentry *,umode_t,dev_t);
1da177e4 37static int jffs2_rename (struct inode *, struct dentry *,
f03b8ad8
MS
38 struct inode *, struct dentry *,
39 unsigned int);
1da177e4 40
4b6f5d20 41const struct file_operations jffs2_dir_operations =
1da177e4
LT
42{
43 .read = generic_read_dir,
c51da20c 44 .iterate_shared=jffs2_readdir,
0533400b 45 .unlocked_ioctl=jffs2_ioctl,
3222a3e5
CH
46 .fsync = jffs2_fsync,
47 .llseek = generic_file_llseek,
1da177e4
LT
48};
49
50
92e1d5be 51const struct inode_operations jffs2_dir_inode_operations =
1da177e4 52{
265489f0
DW
53 .create = jffs2_create,
54 .lookup = jffs2_lookup,
1da177e4
LT
55 .link = jffs2_link,
56 .unlink = jffs2_unlink,
57 .symlink = jffs2_symlink,
58 .mkdir = jffs2_mkdir,
59 .rmdir = jffs2_rmdir,
60 .mknod = jffs2_mknod,
61 .rename = jffs2_rename,
4e34e719 62 .get_acl = jffs2_get_acl,
f2963d45 63 .set_acl = jffs2_set_acl,
1da177e4 64 .setattr = jffs2_setattr,
aa98d7cf 65 .listxattr = jffs2_listxattr,
1da177e4
LT
66};
67
68/***********************************************************************/
69
70
71/* We keep the dirent list sorted in increasing order of name hash,
182ec4ee 72 and we use the same hash function as the dentries. Makes this
1da177e4
LT
73 nice and simple
74*/
75static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target,
00cd8dd3 76 unsigned int flags)
1da177e4
LT
77{
78 struct jffs2_inode_info *dir_f;
1da177e4
LT
79 struct jffs2_full_dirent *fd = NULL, *fd_list;
80 uint32_t ino = 0;
81 struct inode *inode = NULL;
8387ff25 82 unsigned int nhash;
1da177e4 83
9c261b33 84 jffs2_dbg(1, "jffs2_lookup()\n");
1da177e4 85
373d5e71
RP
86 if (target->d_name.len > JFFS2_MAX_NAME_LEN)
87 return ERR_PTR(-ENAMETOOLONG);
88
1da177e4 89 dir_f = JFFS2_INODE_INFO(dir_i);
1da177e4 90
8387ff25
LT
91 /* The 'nhash' on the fd_list is not the same as the dentry hash */
92 nhash = full_name_hash(NULL, target->d_name.name, target->d_name.len);
93
ced22070 94 mutex_lock(&dir_f->sem);
1da177e4
LT
95
96 /* NB: The 2.2 backport will need to explicitly check for '.' and '..' here */
8387ff25
LT
97 for (fd_list = dir_f->dents; fd_list && fd_list->nhash <= nhash; fd_list = fd_list->next) {
98 if (fd_list->nhash == nhash &&
1da177e4
LT
99 (!fd || fd_list->version > fd->version) &&
100 strlen(fd_list->name) == target->d_name.len &&
101 !strncmp(fd_list->name, target->d_name.name, target->d_name.len)) {
102 fd = fd_list;
103 }
104 }
105 if (fd)
106 ino = fd->ino;
ced22070 107 mutex_unlock(&dir_f->sem);
1da177e4 108 if (ino) {
5451f79f 109 inode = jffs2_iget(dir_i->i_sb, ino);
a9049376 110 if (IS_ERR(inode))
da320f05 111 pr_warn("iget() failed for ino #%u\n", ino);
1da177e4
LT
112 }
113
8966c5e0 114 return d_splice_alias(inode, target);
1da177e4
LT
115}
116
117/***********************************************************************/
118
119
0312fa7c 120static int jffs2_readdir(struct file *file, struct dir_context *ctx)
1da177e4 121{
0312fa7c
AV
122 struct inode *inode = file_inode(file);
123 struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
1da177e4 124 struct jffs2_full_dirent *fd;
0312fa7c 125 unsigned long curofs = 1;
1da177e4 126
0312fa7c 127 jffs2_dbg(1, "jffs2_readdir() for dir_i #%lu\n", inode->i_ino);
1da177e4 128
0312fa7c
AV
129 if (!dir_emit_dots(file, ctx))
130 return 0;
1da177e4 131
ced22070 132 mutex_lock(&f->sem);
1da177e4 133 for (fd = f->dents; fd; fd = fd->next) {
1da177e4 134 curofs++;
0312fa7c
AV
135 /* First loop: curofs = 2; pos = 2 */
136 if (curofs < ctx->pos) {
9c261b33 137 jffs2_dbg(2, "Skipping dirent: \"%s\", ino #%u, type %d, because curofs %ld < offset %ld\n",
0312fa7c 138 fd->name, fd->ino, fd->type, curofs, (unsigned long)ctx->pos);
1da177e4
LT
139 continue;
140 }
141 if (!fd->ino) {
9c261b33
JP
142 jffs2_dbg(2, "Skipping deletion dirent \"%s\"\n",
143 fd->name);
0312fa7c 144 ctx->pos++;
1da177e4
LT
145 continue;
146 }
9c261b33 147 jffs2_dbg(2, "Dirent %ld: \"%s\", ino #%u, type %d\n",
0312fa7c
AV
148 (unsigned long)ctx->pos, fd->name, fd->ino, fd->type);
149 if (!dir_emit(ctx, fd->name, strlen(fd->name), fd->ino, fd->type))
1da177e4 150 break;
0312fa7c 151 ctx->pos++;
1da177e4 152 }
ced22070 153 mutex_unlock(&f->sem);
1da177e4
LT
154 return 0;
155}
156
157/***********************************************************************/
158
159
4acdaf27 160static int jffs2_create(struct inode *dir_i, struct dentry *dentry,
ebfc3b49 161 umode_t mode, bool excl)
1da177e4
LT
162{
163 struct jffs2_raw_inode *ri;
164 struct jffs2_inode_info *f, *dir_f;
165 struct jffs2_sb_info *c;
166 struct inode *inode;
167 int ret;
168
169 ri = jffs2_alloc_raw_inode();
170 if (!ri)
171 return -ENOMEM;
182ec4ee 172
1da177e4
LT
173 c = JFFS2_SB_INFO(dir_i->i_sb);
174
9c261b33 175 jffs2_dbg(1, "%s()\n", __func__);
1da177e4 176
cfc8dc6f 177 inode = jffs2_new_inode(dir_i, mode, ri);
1da177e4
LT
178
179 if (IS_ERR(inode)) {
9c261b33 180 jffs2_dbg(1, "jffs2_new_inode() failed\n");
1da177e4
LT
181 jffs2_free_raw_inode(ri);
182 return PTR_ERR(inode);
183 }
184
185 inode->i_op = &jffs2_file_inode_operations;
186 inode->i_fop = &jffs2_file_operations;
187 inode->i_mapping->a_ops = &jffs2_file_address_operations;
188 inode->i_mapping->nrpages = 0;
189
190 f = JFFS2_INODE_INFO(inode);
191 dir_f = JFFS2_INODE_INFO(dir_i);
192
590fe34c
DW
193 /* jffs2_do_create() will want to lock it, _after_ reserving
194 space and taking c-alloc_sem. If we keep it locked here,
195 lockdep gets unhappy (although it's a false positive;
196 nothing else will be looking at this inode yet so there's
197 no chance of AB-BA deadlock involving its f->sem). */
198 mutex_unlock(&f->sem);
199
2a7dba39 200 ret = jffs2_do_create(c, dir_f, f, ri, &dentry->d_name);
aa98d7cf
KK
201 if (ret)
202 goto fail;
1da177e4
LT
203
204 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(ri->ctime));
205
206 jffs2_free_raw_inode(ri);
1da177e4 207
9c261b33
JP
208 jffs2_dbg(1, "%s(): Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n",
209 __func__, inode->i_ino, inode->i_mode, inode->i_nlink,
210 f->inocache->pino_nlink, inode->i_mapping->nrpages);
e72e6497 211
e72e6497 212 unlock_new_inode(inode);
8fc37ec5 213 d_instantiate(dentry, inode);
1da177e4 214 return 0;
aa98d7cf
KK
215
216 fail:
41cce647 217 iget_failed(inode);
aa98d7cf
KK
218 jffs2_free_raw_inode(ri);
219 return ret;
1da177e4
LT
220}
221
222/***********************************************************************/
223
224
225static int jffs2_unlink(struct inode *dir_i, struct dentry *dentry)
226{
227 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
228 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
2b0143b5 229 struct jffs2_inode_info *dead_f = JFFS2_INODE_INFO(d_inode(dentry));
1da177e4 230 int ret;
3a69e0cd 231 uint32_t now = get_seconds();
1da177e4 232
182ec4ee 233 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
3a69e0cd 234 dentry->d_name.len, dead_f, now);
1da177e4 235 if (dead_f->inocache)
2b0143b5 236 set_nlink(d_inode(dentry), dead_f->inocache->pino_nlink);
3a69e0cd
AB
237 if (!ret)
238 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
1da177e4
LT
239 return ret;
240}
241/***********************************************************************/
242
243
244static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct dentry *dentry)
245{
fc64005c 246 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dentry->d_sb);
2b0143b5 247 struct jffs2_inode_info *f = JFFS2_INODE_INFO(d_inode(old_dentry));
1da177e4
LT
248 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
249 int ret;
250 uint8_t type;
3a69e0cd 251 uint32_t now;
1da177e4
LT
252
253 /* Don't let people make hard links to bad inodes. */
254 if (!f->inocache)
255 return -EIO;
256
e36cb0b8 257 if (d_is_dir(old_dentry))
1da177e4
LT
258 return -EPERM;
259
260 /* XXX: This is ugly */
2b0143b5 261 type = (d_inode(old_dentry)->i_mode & S_IFMT) >> 12;
1da177e4
LT
262 if (!type) type = DT_REG;
263
3a69e0cd
AB
264 now = get_seconds();
265 ret = jffs2_do_link(c, dir_f, f->inocache->ino, type, dentry->d_name.name, dentry->d_name.len, now);
1da177e4
LT
266
267 if (!ret) {
ced22070 268 mutex_lock(&f->sem);
2b0143b5 269 set_nlink(d_inode(old_dentry), ++f->inocache->pino_nlink);
ced22070 270 mutex_unlock(&f->sem);
2b0143b5 271 d_instantiate(dentry, d_inode(old_dentry));
3a69e0cd 272 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
2b0143b5 273 ihold(d_inode(old_dentry));
1da177e4
LT
274 }
275 return ret;
276}
277
278/***********************************************************************/
279
280static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char *target)
281{
282 struct jffs2_inode_info *f, *dir_f;
283 struct jffs2_sb_info *c;
284 struct inode *inode;
285 struct jffs2_raw_inode *ri;
286 struct jffs2_raw_dirent *rd;
287 struct jffs2_full_dnode *fn;
288 struct jffs2_full_dirent *fd;
289 int namelen;
9fe4854c 290 uint32_t alloclen;
32f1a95d 291 int ret, targetlen = strlen(target);
1da177e4
LT
292
293 /* FIXME: If you care. We'd need to use frags for the target
294 if it grows much more than this */
32f1a95d 295 if (targetlen > 254)
bde86fec 296 return -ENAMETOOLONG;
1da177e4
LT
297
298 ri = jffs2_alloc_raw_inode();
299
300 if (!ri)
301 return -ENOMEM;
182ec4ee 302
1da177e4 303 c = JFFS2_SB_INFO(dir_i->i_sb);
182ec4ee
TG
304
305 /* Try to reserve enough space for both node and dirent.
306 * Just the node will do for now, though
1da177e4
LT
307 */
308 namelen = dentry->d_name.len;
9fe4854c
DW
309 ret = jffs2_reserve_space(c, sizeof(*ri) + targetlen, &alloclen,
310 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
311
312 if (ret) {
313 jffs2_free_raw_inode(ri);
314 return ret;
315 }
316
cfc8dc6f 317 inode = jffs2_new_inode(dir_i, S_IFLNK | S_IRWXUGO, ri);
1da177e4
LT
318
319 if (IS_ERR(inode)) {
320 jffs2_free_raw_inode(ri);
321 jffs2_complete_reservation(c);
322 return PTR_ERR(inode);
323 }
324
325 inode->i_op = &jffs2_symlink_inode_operations;
326
327 f = JFFS2_INODE_INFO(inode);
328
32f1a95d 329 inode->i_size = targetlen;
1da177e4
LT
330 ri->isize = ri->dsize = ri->csize = cpu_to_je32(inode->i_size);
331 ri->totlen = cpu_to_je32(sizeof(*ri) + inode->i_size);
332 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
333
334 ri->compr = JFFS2_COMPR_NONE;
32f1a95d 335 ri->data_crc = cpu_to_je32(crc32(0, target, targetlen));
1da177e4 336 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 337
9fe4854c 338 fn = jffs2_write_dnode(c, f, ri, target, targetlen, ALLOC_NORMAL);
1da177e4
LT
339
340 jffs2_free_raw_inode(ri);
341
342 if (IS_ERR(fn)) {
343 /* Eeek. Wave bye bye */
ced22070 344 mutex_unlock(&f->sem);
1da177e4 345 jffs2_complete_reservation(c);
f324e4cb
DW
346 ret = PTR_ERR(fn);
347 goto fail;
1da177e4 348 }
32f1a95d 349
2b79adcc 350 /* We use f->target field to store the target path. */
04aadf36 351 f->target = kmemdup(target, targetlen + 1, GFP_KERNEL);
2b79adcc 352 if (!f->target) {
da320f05 353 pr_warn("Can't allocate %d bytes of memory\n", targetlen + 1);
ced22070 354 mutex_unlock(&f->sem);
32f1a95d 355 jffs2_complete_reservation(c);
f324e4cb
DW
356 ret = -ENOMEM;
357 goto fail;
32f1a95d 358 }
a8db149f 359 inode->i_link = f->target;
32f1a95d 360
9c261b33
JP
361 jffs2_dbg(1, "%s(): symlink's target '%s' cached\n",
362 __func__, (char *)f->target);
32f1a95d 363
182ec4ee 364 /* No data here. Only a metadata node, which will be
1da177e4
LT
365 obsoleted by the first data write
366 */
367 f->metadata = fn;
ced22070 368 mutex_unlock(&f->sem);
1da177e4
LT
369
370 jffs2_complete_reservation(c);
aa98d7cf 371
2a7dba39 372 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
f324e4cb
DW
373 if (ret)
374 goto fail;
375
cfc8dc6f 376 ret = jffs2_init_acl_post(inode);
f324e4cb
DW
377 if (ret)
378 goto fail;
aa98d7cf 379
9fe4854c
DW
380 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
381 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
f324e4cb
DW
382 if (ret)
383 goto fail;
1da177e4
LT
384
385 rd = jffs2_alloc_raw_dirent();
386 if (!rd) {
387 /* Argh. Now we treat it like a normal delete */
388 jffs2_complete_reservation(c);
f324e4cb
DW
389 ret = -ENOMEM;
390 goto fail;
1da177e4
LT
391 }
392
393 dir_f = JFFS2_INODE_INFO(dir_i);
ced22070 394 mutex_lock(&dir_f->sem);
1da177e4
LT
395
396 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
397 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
398 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
399 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
400
401 rd->pino = cpu_to_je32(dir_i->i_ino);
402 rd->version = cpu_to_je32(++dir_f->highest_version);
403 rd->ino = cpu_to_je32(inode->i_ino);
404 rd->mctime = cpu_to_je32(get_seconds());
405 rd->nsize = namelen;
406 rd->type = DT_LNK;
407 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
408 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
409
9fe4854c 410 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
1da177e4
LT
411
412 if (IS_ERR(fd)) {
182ec4ee 413 /* dirent failed to write. Delete the inode normally
1da177e4
LT
414 as if it were the final unlink() */
415 jffs2_complete_reservation(c);
416 jffs2_free_raw_dirent(rd);
ced22070 417 mutex_unlock(&dir_f->sem);
f324e4cb
DW
418 ret = PTR_ERR(fd);
419 goto fail;
1da177e4
LT
420 }
421
422 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
423
424 jffs2_free_raw_dirent(rd);
425
426 /* Link the fd into the inode's list, obsoleting an old
427 one if necessary. */
428 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
429
ced22070 430 mutex_unlock(&dir_f->sem);
1da177e4
LT
431 jffs2_complete_reservation(c);
432
e72e6497 433 unlock_new_inode(inode);
8fc37ec5 434 d_instantiate(dentry, inode);
1da177e4 435 return 0;
f324e4cb
DW
436
437 fail:
41cce647 438 iget_failed(inode);
f324e4cb 439 return ret;
1da177e4
LT
440}
441
442
18bb1db3 443static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, umode_t mode)
1da177e4
LT
444{
445 struct jffs2_inode_info *f, *dir_f;
446 struct jffs2_sb_info *c;
447 struct inode *inode;
448 struct jffs2_raw_inode *ri;
449 struct jffs2_raw_dirent *rd;
450 struct jffs2_full_dnode *fn;
451 struct jffs2_full_dirent *fd;
452 int namelen;
9fe4854c 453 uint32_t alloclen;
1da177e4
LT
454 int ret;
455
456 mode |= S_IFDIR;
457
458 ri = jffs2_alloc_raw_inode();
459 if (!ri)
460 return -ENOMEM;
182ec4ee 461
1da177e4
LT
462 c = JFFS2_SB_INFO(dir_i->i_sb);
463
182ec4ee
TG
464 /* Try to reserve enough space for both node and dirent.
465 * Just the node will do for now, though
1da177e4
LT
466 */
467 namelen = dentry->d_name.len;
9fe4854c
DW
468 ret = jffs2_reserve_space(c, sizeof(*ri), &alloclen, ALLOC_NORMAL,
469 JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
470
471 if (ret) {
472 jffs2_free_raw_inode(ri);
473 return ret;
474 }
475
cfc8dc6f 476 inode = jffs2_new_inode(dir_i, mode, ri);
1da177e4
LT
477
478 if (IS_ERR(inode)) {
479 jffs2_free_raw_inode(ri);
480 jffs2_complete_reservation(c);
481 return PTR_ERR(inode);
482 }
483
484 inode->i_op = &jffs2_dir_inode_operations;
485 inode->i_fop = &jffs2_dir_operations;
1da177e4
LT
486
487 f = JFFS2_INODE_INFO(inode);
488
27c72b04 489 /* Directories get nlink 2 at start */
bfe86848 490 set_nlink(inode, 2);
27c72b04
DW
491 /* but ic->pino_nlink is the parent ino# */
492 f->inocache->pino_nlink = dir_i->i_ino;
493
1da177e4
LT
494 ri->data_crc = cpu_to_je32(0);
495 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 496
9fe4854c 497 fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL);
1da177e4
LT
498
499 jffs2_free_raw_inode(ri);
500
501 if (IS_ERR(fn)) {
502 /* Eeek. Wave bye bye */
ced22070 503 mutex_unlock(&f->sem);
1da177e4 504 jffs2_complete_reservation(c);
f324e4cb
DW
505 ret = PTR_ERR(fn);
506 goto fail;
1da177e4 507 }
182ec4ee 508 /* No data here. Only a metadata node, which will be
1da177e4
LT
509 obsoleted by the first data write
510 */
511 f->metadata = fn;
ced22070 512 mutex_unlock(&f->sem);
1da177e4
LT
513
514 jffs2_complete_reservation(c);
aa98d7cf 515
2a7dba39 516 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
f324e4cb
DW
517 if (ret)
518 goto fail;
519
cfc8dc6f 520 ret = jffs2_init_acl_post(inode);
f324e4cb
DW
521 if (ret)
522 goto fail;
aa98d7cf 523
9fe4854c
DW
524 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
525 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
f324e4cb
DW
526 if (ret)
527 goto fail;
182ec4ee 528
1da177e4
LT
529 rd = jffs2_alloc_raw_dirent();
530 if (!rd) {
531 /* Argh. Now we treat it like a normal delete */
532 jffs2_complete_reservation(c);
f324e4cb
DW
533 ret = -ENOMEM;
534 goto fail;
1da177e4
LT
535 }
536
537 dir_f = JFFS2_INODE_INFO(dir_i);
ced22070 538 mutex_lock(&dir_f->sem);
1da177e4
LT
539
540 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
541 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
542 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
543 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
544
545 rd->pino = cpu_to_je32(dir_i->i_ino);
546 rd->version = cpu_to_je32(++dir_f->highest_version);
547 rd->ino = cpu_to_je32(inode->i_ino);
548 rd->mctime = cpu_to_je32(get_seconds());
549 rd->nsize = namelen;
550 rd->type = DT_DIR;
551 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
552 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
553
9fe4854c 554 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
182ec4ee 555
1da177e4 556 if (IS_ERR(fd)) {
182ec4ee 557 /* dirent failed to write. Delete the inode normally
1da177e4
LT
558 as if it were the final unlink() */
559 jffs2_complete_reservation(c);
560 jffs2_free_raw_dirent(rd);
ced22070 561 mutex_unlock(&dir_f->sem);
f324e4cb
DW
562 ret = PTR_ERR(fd);
563 goto fail;
1da177e4
LT
564 }
565
566 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
d8c76e6f 567 inc_nlink(dir_i);
1da177e4
LT
568
569 jffs2_free_raw_dirent(rd);
570
571 /* Link the fd into the inode's list, obsoleting an old
572 one if necessary. */
573 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
574
ced22070 575 mutex_unlock(&dir_f->sem);
1da177e4
LT
576 jffs2_complete_reservation(c);
577
e72e6497 578 unlock_new_inode(inode);
8fc37ec5 579 d_instantiate(dentry, inode);
1da177e4 580 return 0;
f324e4cb
DW
581
582 fail:
41cce647 583 iget_failed(inode);
f324e4cb 584 return ret;
1da177e4
LT
585}
586
587static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
588{
27c72b04
DW
589 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
590 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
2b0143b5 591 struct jffs2_inode_info *f = JFFS2_INODE_INFO(d_inode(dentry));
1da177e4
LT
592 struct jffs2_full_dirent *fd;
593 int ret;
27c72b04 594 uint32_t now = get_seconds();
1da177e4
LT
595
596 for (fd = f->dents ; fd; fd = fd->next) {
597 if (fd->ino)
598 return -ENOTEMPTY;
599 }
27c72b04
DW
600
601 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
602 dentry->d_name.len, f, now);
603 if (!ret) {
604 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
2b0143b5 605 clear_nlink(d_inode(dentry));
9a53c3a7 606 drop_nlink(dir_i);
27c72b04 607 }
1da177e4
LT
608 return ret;
609}
610
1a67aafb 611static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, umode_t 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
1da177e4
LT
626 ri = jffs2_alloc_raw_inode();
627 if (!ri)
628 return -ENOMEM;
182ec4ee 629
1da177e4 630 c = JFFS2_SB_INFO(dir_i->i_sb);
182ec4ee 631
aef9ab47
DW
632 if (S_ISBLK(mode) || S_ISCHR(mode))
633 devlen = jffs2_encode_dev(&dev, rdev);
182ec4ee
TG
634
635 /* Try to reserve enough space for both node and dirent.
636 * Just the node will do for now, though
1da177e4
LT
637 */
638 namelen = dentry->d_name.len;
9fe4854c 639 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &alloclen,
aef9ab47 640 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
641
642 if (ret) {
643 jffs2_free_raw_inode(ri);
644 return ret;
645 }
646
cfc8dc6f 647 inode = jffs2_new_inode(dir_i, mode, ri);
1da177e4
LT
648
649 if (IS_ERR(inode)) {
650 jffs2_free_raw_inode(ri);
651 jffs2_complete_reservation(c);
652 return PTR_ERR(inode);
653 }
654 inode->i_op = &jffs2_file_inode_operations;
655 init_special_inode(inode, inode->i_mode, rdev);
656
657 f = JFFS2_INODE_INFO(inode);
658
659 ri->dsize = ri->csize = cpu_to_je32(devlen);
660 ri->totlen = cpu_to_je32(sizeof(*ri) + devlen);
661 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
662
663 ri->compr = JFFS2_COMPR_NONE;
664 ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen));
665 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 666
9fe4854c 667 fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, ALLOC_NORMAL);
1da177e4
LT
668
669 jffs2_free_raw_inode(ri);
670
671 if (IS_ERR(fn)) {
672 /* Eeek. Wave bye bye */
ced22070 673 mutex_unlock(&f->sem);
1da177e4 674 jffs2_complete_reservation(c);
f324e4cb
DW
675 ret = PTR_ERR(fn);
676 goto fail;
1da177e4 677 }
182ec4ee 678 /* No data here. Only a metadata node, which will be
1da177e4
LT
679 obsoleted by the first data write
680 */
681 f->metadata = fn;
ced22070 682 mutex_unlock(&f->sem);
1da177e4
LT
683
684 jffs2_complete_reservation(c);
aa98d7cf 685
2a7dba39 686 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
f324e4cb
DW
687 if (ret)
688 goto fail;
689
cfc8dc6f 690 ret = jffs2_init_acl_post(inode);
f324e4cb
DW
691 if (ret)
692 goto fail;
aa98d7cf 693
9fe4854c
DW
694 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
695 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
f324e4cb
DW
696 if (ret)
697 goto fail;
1da177e4
LT
698
699 rd = jffs2_alloc_raw_dirent();
700 if (!rd) {
701 /* Argh. Now we treat it like a normal delete */
702 jffs2_complete_reservation(c);
f324e4cb
DW
703 ret = -ENOMEM;
704 goto fail;
1da177e4
LT
705 }
706
707 dir_f = JFFS2_INODE_INFO(dir_i);
ced22070 708 mutex_lock(&dir_f->sem);
1da177e4
LT
709
710 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
711 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
712 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
713 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
714
715 rd->pino = cpu_to_je32(dir_i->i_ino);
716 rd->version = cpu_to_je32(++dir_f->highest_version);
717 rd->ino = cpu_to_je32(inode->i_ino);
718 rd->mctime = cpu_to_je32(get_seconds());
719 rd->nsize = namelen;
720
721 /* XXX: This is ugly. */
722 rd->type = (mode & S_IFMT) >> 12;
723
724 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
725 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
726
9fe4854c 727 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
182ec4ee 728
1da177e4 729 if (IS_ERR(fd)) {
182ec4ee 730 /* dirent failed to write. Delete the inode normally
1da177e4
LT
731 as if it were the final unlink() */
732 jffs2_complete_reservation(c);
733 jffs2_free_raw_dirent(rd);
ced22070 734 mutex_unlock(&dir_f->sem);
f324e4cb
DW
735 ret = PTR_ERR(fd);
736 goto fail;
1da177e4
LT
737 }
738
739 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
740
741 jffs2_free_raw_dirent(rd);
742
743 /* Link the fd into the inode's list, obsoleting an old
744 one if necessary. */
745 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
746
ced22070 747 mutex_unlock(&dir_f->sem);
1da177e4
LT
748 jffs2_complete_reservation(c);
749
e72e6497 750 unlock_new_inode(inode);
8fc37ec5 751 d_instantiate(dentry, inode);
1da177e4 752 return 0;
f324e4cb
DW
753
754 fail:
41cce647 755 iget_failed(inode);
f324e4cb 756 return ret;
1da177e4
LT
757}
758
759static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
f03b8ad8
MS
760 struct inode *new_dir_i, struct dentry *new_dentry,
761 unsigned int flags)
1da177e4
LT
762{
763 int ret;
764 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
765 struct jffs2_inode_info *victim_f = NULL;
766 uint8_t type;
3a69e0cd 767 uint32_t now;
1da177e4 768
f03b8ad8
MS
769 if (flags & ~RENAME_NOREPLACE)
770 return -EINVAL;
771
182ec4ee 772 /* The VFS will check for us and prevent trying to rename a
1da177e4
LT
773 * file over a directory and vice versa, but if it's a directory,
774 * the VFS can't check whether the victim is empty. The filesystem
775 * needs to do that for itself.
776 */
2b0143b5
DH
777 if (d_really_is_positive(new_dentry)) {
778 victim_f = JFFS2_INODE_INFO(d_inode(new_dentry));
e36cb0b8 779 if (d_is_dir(new_dentry)) {
1da177e4
LT
780 struct jffs2_full_dirent *fd;
781
ced22070 782 mutex_lock(&victim_f->sem);
1da177e4
LT
783 for (fd = victim_f->dents; fd; fd = fd->next) {
784 if (fd->ino) {
ced22070 785 mutex_unlock(&victim_f->sem);
1da177e4
LT
786 return -ENOTEMPTY;
787 }
788 }
ced22070 789 mutex_unlock(&victim_f->sem);
1da177e4
LT
790 }
791 }
792
793 /* XXX: We probably ought to alloc enough space for
182ec4ee 794 both nodes at the same time. Writing the new link,
1da177e4
LT
795 then getting -ENOSPC, is quite bad :)
796 */
797
798 /* Make a hard link */
182ec4ee 799
1da177e4 800 /* XXX: This is ugly */
2b0143b5 801 type = (d_inode(old_dentry)->i_mode & S_IFMT) >> 12;
1da177e4
LT
802 if (!type) type = DT_REG;
803
3a69e0cd 804 now = get_seconds();
182ec4ee 805 ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i),
2b0143b5 806 d_inode(old_dentry)->i_ino, type,
3a69e0cd 807 new_dentry->d_name.name, new_dentry->d_name.len, now);
1da177e4
LT
808
809 if (ret)
810 return ret;
811
812 if (victim_f) {
813 /* There was a victim. Kill it off nicely */
e36cb0b8 814 if (d_is_dir(new_dentry))
2b0143b5 815 clear_nlink(d_inode(new_dentry));
22ba747f 816 else
2b0143b5 817 drop_nlink(d_inode(new_dentry));
1da177e4
LT
818 /* Don't oops if the victim was a dirent pointing to an
819 inode which didn't exist. */
820 if (victim_f->inocache) {
ced22070 821 mutex_lock(&victim_f->sem);
e36cb0b8 822 if (d_is_dir(new_dentry))
27c72b04
DW
823 victim_f->inocache->pino_nlink = 0;
824 else
825 victim_f->inocache->pino_nlink--;
ced22070 826 mutex_unlock(&victim_f->sem);
1da177e4
LT
827 }
828 }
829
182ec4ee 830 /* If it was a directory we moved, and there was no victim,
1da177e4 831 increase i_nlink on its new parent */
e36cb0b8 832 if (d_is_dir(old_dentry) && !victim_f)
d8c76e6f 833 inc_nlink(new_dir_i);
1da177e4
LT
834
835 /* Unlink the original */
182ec4ee 836 ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
3a69e0cd 837 old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
1da177e4
LT
838
839 /* We don't touch inode->i_nlink */
840
841 if (ret) {
842 /* Oh shit. We really ought to make a single node which can do both atomically */
2b0143b5 843 struct jffs2_inode_info *f = JFFS2_INODE_INFO(d_inode(old_dentry));
ced22070 844 mutex_lock(&f->sem);
2b0143b5 845 inc_nlink(d_inode(old_dentry));
e36cb0b8 846 if (f->inocache && !d_is_dir(old_dentry))
27c72b04 847 f->inocache->pino_nlink++;
ced22070 848 mutex_unlock(&f->sem);
1da177e4 849
da320f05
JP
850 pr_notice("%s(): Link succeeded, unlink failed (err %d). You now have a hard link\n",
851 __func__, ret);
f9381284
AV
852 /*
853 * We can't keep the target in dcache after that.
854 * For one thing, we can't afford dentry aliases for directories.
855 * For another, if there was a victim, we _can't_ set new inode
856 * for that sucker and we have to trigger mount eviction - the
857 * caller won't do it on its own since we are returning an error.
858 */
859 d_invalidate(new_dentry);
3a69e0cd 860 new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now);
1da177e4
LT
861 return ret;
862 }
863
e36cb0b8 864 if (d_is_dir(old_dentry))
9a53c3a7 865 drop_nlink(old_dir_i);
1da177e4 866
3a69e0cd
AB
867 new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
868
1da177e4
LT
869 return 0;
870}
871