fs: port ->mknod() to pass mnt_idmap
[linux-2.6-block.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
6c960e68 27static int jffs2_create (struct mnt_idmap *, struct inode *,
549c7297 28 struct dentry *, umode_t, 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 *);
7a77db95 33static int jffs2_symlink (struct mnt_idmap *, struct inode *,
549c7297 34 struct dentry *, const char *);
c54bd91e 35static int jffs2_mkdir (struct mnt_idmap *, struct inode *,struct dentry *,
549c7297 36 umode_t);
1da177e4 37static int jffs2_rmdir (struct inode *,struct dentry *);
5ebb29be 38static int jffs2_mknod (struct mnt_idmap *, struct inode *,struct dentry *,
549c7297
CB
39 umode_t,dev_t);
40static int jffs2_rename (struct user_namespace *, struct inode *,
41 struct dentry *, struct inode *, struct dentry *,
f03b8ad8 42 unsigned int);
1da177e4 43
4b6f5d20 44const struct file_operations jffs2_dir_operations =
1da177e4
LT
45{
46 .read = generic_read_dir,
c51da20c 47 .iterate_shared=jffs2_readdir,
0533400b 48 .unlocked_ioctl=jffs2_ioctl,
3222a3e5
CH
49 .fsync = jffs2_fsync,
50 .llseek = generic_file_llseek,
1da177e4
LT
51};
52
53
92e1d5be 54const struct inode_operations jffs2_dir_inode_operations =
1da177e4 55{
265489f0
DW
56 .create = jffs2_create,
57 .lookup = jffs2_lookup,
1da177e4
LT
58 .link = jffs2_link,
59 .unlink = jffs2_unlink,
60 .symlink = jffs2_symlink,
61 .mkdir = jffs2_mkdir,
62 .rmdir = jffs2_rmdir,
63 .mknod = jffs2_mknod,
64 .rename = jffs2_rename,
cac2f8b8 65 .get_inode_acl = jffs2_get_acl,
f2963d45 66 .set_acl = jffs2_set_acl,
1da177e4 67 .setattr = jffs2_setattr,
aa98d7cf 68 .listxattr = jffs2_listxattr,
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
6c960e68 163static int jffs2_create(struct mnt_idmap *idmap, struct inode *dir_i,
549c7297 164 struct dentry *dentry, 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 206
c4592b9c 207 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(ri->ctime));
1da177e4
LT
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
1e2e547a 215 d_instantiate_new(dentry, inode);
1da177e4 216 return 0;
aa98d7cf
KK
217
218 fail:
41cce647 219 iget_failed(inode);
aa98d7cf
KK
220 jffs2_free_raw_inode(ri);
221 return ret;
1da177e4
LT
222}
223
224/***********************************************************************/
225
226
227static int jffs2_unlink(struct inode *dir_i, struct dentry *dentry)
228{
229 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
230 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
2b0143b5 231 struct jffs2_inode_info *dead_f = JFFS2_INODE_INFO(d_inode(dentry));
1da177e4 232 int ret;
c4592b9c 233 uint32_t now = JFFS2_NOW();
1da177e4 234
182ec4ee 235 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
3a69e0cd 236 dentry->d_name.len, dead_f, now);
1da177e4 237 if (dead_f->inocache)
2b0143b5 238 set_nlink(d_inode(dentry), dead_f->inocache->pino_nlink);
3a69e0cd 239 if (!ret)
c4592b9c 240 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
1da177e4
LT
241 return ret;
242}
243/***********************************************************************/
244
245
246static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct dentry *dentry)
247{
fc64005c 248 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dentry->d_sb);
2b0143b5 249 struct jffs2_inode_info *f = JFFS2_INODE_INFO(d_inode(old_dentry));
1da177e4
LT
250 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
251 int ret;
252 uint8_t type;
3a69e0cd 253 uint32_t now;
1da177e4
LT
254
255 /* Don't let people make hard links to bad inodes. */
256 if (!f->inocache)
257 return -EIO;
258
e36cb0b8 259 if (d_is_dir(old_dentry))
1da177e4
LT
260 return -EPERM;
261
262 /* XXX: This is ugly */
2b0143b5 263 type = (d_inode(old_dentry)->i_mode & S_IFMT) >> 12;
1da177e4
LT
264 if (!type) type = DT_REG;
265
c4592b9c 266 now = JFFS2_NOW();
3a69e0cd 267 ret = jffs2_do_link(c, dir_f, f->inocache->ino, type, dentry->d_name.name, dentry->d_name.len, now);
1da177e4
LT
268
269 if (!ret) {
ced22070 270 mutex_lock(&f->sem);
2b0143b5 271 set_nlink(d_inode(old_dentry), ++f->inocache->pino_nlink);
ced22070 272 mutex_unlock(&f->sem);
2b0143b5 273 d_instantiate(dentry, d_inode(old_dentry));
c4592b9c 274 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
2b0143b5 275 ihold(d_inode(old_dentry));
1da177e4
LT
276 }
277 return ret;
278}
279
280/***********************************************************************/
281
7a77db95 282static int jffs2_symlink (struct mnt_idmap *idmap, struct inode *dir_i,
549c7297 283 struct dentry *dentry, const char *target)
1da177e4
LT
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);
c4592b9c 407 rd->mctime = cpu_to_je32(JFFS2_NOW());
1da177e4
LT
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
c4592b9c 425 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
1da177e4
LT
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
1e2e547a 436 d_instantiate_new(dentry, inode);
1da177e4 437 return 0;
f324e4cb
DW
438
439 fail:
41cce647 440 iget_failed(inode);
f324e4cb 441 return ret;
1da177e4
LT
442}
443
444
c54bd91e 445static int jffs2_mkdir (struct mnt_idmap *idmap, struct inode *dir_i,
549c7297 446 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);
c4592b9c 551 rd->mctime = cpu_to_je32(JFFS2_NOW());
1da177e4
LT
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
c4592b9c 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
1e2e547a 581 d_instantiate_new(dentry, inode);
1da177e4 582 return 0;
f324e4cb
DW
583
584 fail:
41cce647 585 iget_failed(inode);
f324e4cb 586 return ret;
1da177e4
LT
587}
588
589static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
590{
27c72b04
DW
591 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
592 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
2b0143b5 593 struct jffs2_inode_info *f = JFFS2_INODE_INFO(d_inode(dentry));
1da177e4
LT
594 struct jffs2_full_dirent *fd;
595 int ret;
c4592b9c 596 uint32_t now = JFFS2_NOW();
1da177e4 597
798b7347 598 mutex_lock(&f->sem);
1da177e4 599 for (fd = f->dents ; fd; fd = fd->next) {
798b7347
ZL
600 if (fd->ino) {
601 mutex_unlock(&f->sem);
1da177e4 602 return -ENOTEMPTY;
798b7347 603 }
1da177e4 604 }
798b7347 605 mutex_unlock(&f->sem);
27c72b04
DW
606
607 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
608 dentry->d_name.len, f, now);
609 if (!ret) {
c4592b9c 610 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
2b0143b5 611 clear_nlink(d_inode(dentry));
9a53c3a7 612 drop_nlink(dir_i);
27c72b04 613 }
1da177e4
LT
614 return ret;
615}
616
5ebb29be 617static int jffs2_mknod (struct mnt_idmap *idmap, struct inode *dir_i,
549c7297 618 struct dentry *dentry, umode_t mode, dev_t rdev)
1da177e4
LT
619{
620 struct jffs2_inode_info *f, *dir_f;
621 struct jffs2_sb_info *c;
622 struct inode *inode;
623 struct jffs2_raw_inode *ri;
624 struct jffs2_raw_dirent *rd;
625 struct jffs2_full_dnode *fn;
626 struct jffs2_full_dirent *fd;
627 int namelen;
aef9ab47 628 union jffs2_device_node dev;
1da177e4 629 int devlen = 0;
9fe4854c 630 uint32_t alloclen;
1da177e4
LT
631 int ret;
632
1da177e4
LT
633 ri = jffs2_alloc_raw_inode();
634 if (!ri)
635 return -ENOMEM;
182ec4ee 636
1da177e4 637 c = JFFS2_SB_INFO(dir_i->i_sb);
182ec4ee 638
aef9ab47
DW
639 if (S_ISBLK(mode) || S_ISCHR(mode))
640 devlen = jffs2_encode_dev(&dev, rdev);
182ec4ee
TG
641
642 /* Try to reserve enough space for both node and dirent.
643 * Just the node will do for now, though
1da177e4
LT
644 */
645 namelen = dentry->d_name.len;
9fe4854c 646 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &alloclen,
aef9ab47 647 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
648
649 if (ret) {
650 jffs2_free_raw_inode(ri);
651 return ret;
652 }
653
cfc8dc6f 654 inode = jffs2_new_inode(dir_i, mode, ri);
1da177e4
LT
655
656 if (IS_ERR(inode)) {
657 jffs2_free_raw_inode(ri);
658 jffs2_complete_reservation(c);
659 return PTR_ERR(inode);
660 }
661 inode->i_op = &jffs2_file_inode_operations;
662 init_special_inode(inode, inode->i_mode, rdev);
663
664 f = JFFS2_INODE_INFO(inode);
665
666 ri->dsize = ri->csize = cpu_to_je32(devlen);
667 ri->totlen = cpu_to_je32(sizeof(*ri) + devlen);
668 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
669
670 ri->compr = JFFS2_COMPR_NONE;
671 ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen));
672 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 673
9fe4854c 674 fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, ALLOC_NORMAL);
1da177e4
LT
675
676 jffs2_free_raw_inode(ri);
677
678 if (IS_ERR(fn)) {
679 /* Eeek. Wave bye bye */
ced22070 680 mutex_unlock(&f->sem);
1da177e4 681 jffs2_complete_reservation(c);
f324e4cb
DW
682 ret = PTR_ERR(fn);
683 goto fail;
1da177e4 684 }
182ec4ee 685 /* No data here. Only a metadata node, which will be
1da177e4
LT
686 obsoleted by the first data write
687 */
688 f->metadata = fn;
ced22070 689 mutex_unlock(&f->sem);
1da177e4
LT
690
691 jffs2_complete_reservation(c);
aa98d7cf 692
2a7dba39 693 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
f324e4cb
DW
694 if (ret)
695 goto fail;
696
cfc8dc6f 697 ret = jffs2_init_acl_post(inode);
f324e4cb
DW
698 if (ret)
699 goto fail;
aa98d7cf 700
9fe4854c
DW
701 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
702 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
f324e4cb
DW
703 if (ret)
704 goto fail;
1da177e4
LT
705
706 rd = jffs2_alloc_raw_dirent();
707 if (!rd) {
708 /* Argh. Now we treat it like a normal delete */
709 jffs2_complete_reservation(c);
f324e4cb
DW
710 ret = -ENOMEM;
711 goto fail;
1da177e4
LT
712 }
713
714 dir_f = JFFS2_INODE_INFO(dir_i);
ced22070 715 mutex_lock(&dir_f->sem);
1da177e4
LT
716
717 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
718 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
719 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
720 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
721
722 rd->pino = cpu_to_je32(dir_i->i_ino);
723 rd->version = cpu_to_je32(++dir_f->highest_version);
724 rd->ino = cpu_to_je32(inode->i_ino);
c4592b9c 725 rd->mctime = cpu_to_je32(JFFS2_NOW());
1da177e4
LT
726 rd->nsize = namelen;
727
728 /* XXX: This is ugly. */
729 rd->type = (mode & S_IFMT) >> 12;
730
731 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
732 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
733
9fe4854c 734 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
182ec4ee 735
1da177e4 736 if (IS_ERR(fd)) {
182ec4ee 737 /* dirent failed to write. Delete the inode normally
1da177e4
LT
738 as if it were the final unlink() */
739 jffs2_complete_reservation(c);
740 jffs2_free_raw_dirent(rd);
ced22070 741 mutex_unlock(&dir_f->sem);
f324e4cb
DW
742 ret = PTR_ERR(fd);
743 goto fail;
1da177e4
LT
744 }
745
c4592b9c 746 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
1da177e4
LT
747
748 jffs2_free_raw_dirent(rd);
749
750 /* Link the fd into the inode's list, obsoleting an old
751 one if necessary. */
752 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
753
ced22070 754 mutex_unlock(&dir_f->sem);
1da177e4
LT
755 jffs2_complete_reservation(c);
756
1e2e547a 757 d_instantiate_new(dentry, inode);
1da177e4 758 return 0;
f324e4cb
DW
759
760 fail:
41cce647 761 iget_failed(inode);
f324e4cb 762 return ret;
1da177e4
LT
763}
764
549c7297
CB
765static int jffs2_rename (struct user_namespace *mnt_userns,
766 struct inode *old_dir_i, struct dentry *old_dentry,
f03b8ad8
MS
767 struct inode *new_dir_i, struct dentry *new_dentry,
768 unsigned int flags)
1da177e4
LT
769{
770 int ret;
771 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
772 struct jffs2_inode_info *victim_f = NULL;
773 uint8_t type;
3a69e0cd 774 uint32_t now;
1da177e4 775
f03b8ad8
MS
776 if (flags & ~RENAME_NOREPLACE)
777 return -EINVAL;
778
182ec4ee 779 /* The VFS will check for us and prevent trying to rename a
1da177e4
LT
780 * file over a directory and vice versa, but if it's a directory,
781 * the VFS can't check whether the victim is empty. The filesystem
782 * needs to do that for itself.
783 */
2b0143b5
DH
784 if (d_really_is_positive(new_dentry)) {
785 victim_f = JFFS2_INODE_INFO(d_inode(new_dentry));
e36cb0b8 786 if (d_is_dir(new_dentry)) {
1da177e4
LT
787 struct jffs2_full_dirent *fd;
788
ced22070 789 mutex_lock(&victim_f->sem);
1da177e4
LT
790 for (fd = victim_f->dents; fd; fd = fd->next) {
791 if (fd->ino) {
ced22070 792 mutex_unlock(&victim_f->sem);
1da177e4
LT
793 return -ENOTEMPTY;
794 }
795 }
ced22070 796 mutex_unlock(&victim_f->sem);
1da177e4
LT
797 }
798 }
799
800 /* XXX: We probably ought to alloc enough space for
182ec4ee 801 both nodes at the same time. Writing the new link,
1da177e4
LT
802 then getting -ENOSPC, is quite bad :)
803 */
804
805 /* Make a hard link */
182ec4ee 806
1da177e4 807 /* XXX: This is ugly */
2b0143b5 808 type = (d_inode(old_dentry)->i_mode & S_IFMT) >> 12;
1da177e4
LT
809 if (!type) type = DT_REG;
810
c4592b9c 811 now = JFFS2_NOW();
182ec4ee 812 ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i),
2b0143b5 813 d_inode(old_dentry)->i_ino, type,
3a69e0cd 814 new_dentry->d_name.name, new_dentry->d_name.len, now);
1da177e4
LT
815
816 if (ret)
817 return ret;
818
819 if (victim_f) {
820 /* There was a victim. Kill it off nicely */
e36cb0b8 821 if (d_is_dir(new_dentry))
2b0143b5 822 clear_nlink(d_inode(new_dentry));
22ba747f 823 else
2b0143b5 824 drop_nlink(d_inode(new_dentry));
1da177e4
LT
825 /* Don't oops if the victim was a dirent pointing to an
826 inode which didn't exist. */
827 if (victim_f->inocache) {
ced22070 828 mutex_lock(&victim_f->sem);
e36cb0b8 829 if (d_is_dir(new_dentry))
27c72b04
DW
830 victim_f->inocache->pino_nlink = 0;
831 else
832 victim_f->inocache->pino_nlink--;
ced22070 833 mutex_unlock(&victim_f->sem);
1da177e4
LT
834 }
835 }
836
182ec4ee 837 /* If it was a directory we moved, and there was no victim,
1da177e4 838 increase i_nlink on its new parent */
e36cb0b8 839 if (d_is_dir(old_dentry) && !victim_f)
d8c76e6f 840 inc_nlink(new_dir_i);
1da177e4
LT
841
842 /* Unlink the original */
182ec4ee 843 ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
3a69e0cd 844 old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
1da177e4
LT
845
846 /* We don't touch inode->i_nlink */
847
848 if (ret) {
849 /* Oh shit. We really ought to make a single node which can do both atomically */
2b0143b5 850 struct jffs2_inode_info *f = JFFS2_INODE_INFO(d_inode(old_dentry));
ced22070 851 mutex_lock(&f->sem);
2b0143b5 852 inc_nlink(d_inode(old_dentry));
e36cb0b8 853 if (f->inocache && !d_is_dir(old_dentry))
27c72b04 854 f->inocache->pino_nlink++;
ced22070 855 mutex_unlock(&f->sem);
1da177e4 856
da320f05
JP
857 pr_notice("%s(): Link succeeded, unlink failed (err %d). You now have a hard link\n",
858 __func__, ret);
f9381284
AV
859 /*
860 * We can't keep the target in dcache after that.
861 * For one thing, we can't afford dentry aliases for directories.
862 * For another, if there was a victim, we _can't_ set new inode
863 * for that sucker and we have to trigger mount eviction - the
864 * caller won't do it on its own since we are returning an error.
865 */
866 d_invalidate(new_dentry);
c4592b9c 867 new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now);
1da177e4
LT
868 return ret;
869 }
870
e36cb0b8 871 if (d_is_dir(old_dentry))
9a53c3a7 872 drop_nlink(old_dir_i);
1da177e4 873
c4592b9c 874 new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
3a69e0cd 875
1da177e4
LT
876 return 0;
877}
878