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