b24413180f560 (Greg Kroah-Hartman 2017-11-01 15:07:57 +0100 1) // SPDX-License-Identifier: GPL-2.0
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 2) /*
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 3) * linux/fs/ext2/namei.c
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 4) *
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 5) * Rewrite to pagecache. Almost all code had been changed, so blame me
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 6) * if the things go wrong. Please, send bug reports to
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 7) * viro@parcelfarce.linux.theplanet.co.uk
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 8) *
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 9) * Stuff here is basically a glue between the VFS and generic UNIXish
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 10) * filesystem that keeps everything in pagecache. All knowledge of the
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 11) * directory layout is in fs/ext2/dir.c - it turned out to be easily separatable
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 12) * and it's easier to debug that way. In principle we might want to
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 13) * generalize that a bit and turn it into a library. Or not.
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 14) *
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 15) * The only non-static object here is ext2_dir_inode_operations.
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 16) *
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 17) * TODO: get rid of kmap() use, add readahead.
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 18) *
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 19) * Copyright (C) 1992, 1993, 1994, 1995
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 20) * Remy Card (card@masi.ibp.fr)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 21) * Laboratoire MASI - Institut Blaise Pascal
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 22) * Universite Pierre et Marie Curie (Paris VI)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 23) *
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 24) * from
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 25) *
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 26) * linux/fs/minix/namei.c
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 27) *
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 28) * Copyright (C) 1991, 1992 Linus Torvalds
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 29) *
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 30) * Big-endian to little-endian byte-swapping/bitmaps by
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 31) * David S. Miller (davem@caip.rutgers.edu), 1995
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 32) */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 33)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 34) #include <linux/pagemap.h>
907f4554e2521 (Christoph Hellwig 2010-03-03 09:05:06 -0500 35) #include <linux/quotaops.h>
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 36) #include "ext2.h"
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 37) #include "xattr.h"
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 38) #include "acl.h"
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 39)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 40) static inline int ext2_add_nondir(struct dentry *dentry, struct inode *inode)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 41) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 42) int err = ext2_add_link(dentry, inode);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 43) if (!err) {
1e2e547a93a00 (Al Viro 2018-05-04 08:23:01 -0400 44) d_instantiate_new(dentry, inode);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 45) return 0;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 46) }
a513b035eadf8 (Alexey Dobriyan 2006-03-23 03:00:53 -0800 47) inode_dec_link_count(inode);
2e5afe54e0cd6 (Al Viro 2018-05-16 18:29:56 -0400 48) discard_new_inode(inode);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 49) return err;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 50) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 51)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 52) /*
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 53) * Methods themselves.
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 54) */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 55)
00cd8dd3bf95f (Al Viro 2012-06-10 17:13:09 -0400 56) static struct dentry *ext2_lookup(struct inode * dir, struct dentry *dentry, unsigned int flags)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 57) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 58) struct inode * inode;
a43850a380ef5 (zhangyi (F) 2020-06-08 11:40:43 +0800 59) ino_t ino;
b4962091a54c8 (zhangyi (F) 2020-06-08 11:40:42 +0800 60) int res;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 61)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 62) if (dentry->d_name.len > EXT2_NAME_LEN)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 63) return ERR_PTR(-ENAMETOOLONG);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 64)
b4962091a54c8 (zhangyi (F) 2020-06-08 11:40:42 +0800 65) res = ext2_inode_by_name(dir, &dentry->d_name, &ino);
a43850a380ef5 (zhangyi (F) 2020-06-08 11:40:43 +0800 66) if (res) {
a43850a380ef5 (zhangyi (F) 2020-06-08 11:40:43 +0800 67) if (res != -ENOENT)
a43850a380ef5 (zhangyi (F) 2020-06-08 11:40:43 +0800 68) return ERR_PTR(res);
a43850a380ef5 (zhangyi (F) 2020-06-08 11:40:43 +0800 69) inode = NULL;
a43850a380ef5 (zhangyi (F) 2020-06-08 11:40:43 +0800 70) } else {
52fcf7032935b (David Howells 2008-02-07 00:15:35 -0800 71) inode = ext2_iget(dir->i_sb, ino);
a9049376ee05b (Al Viro 2011-07-08 21:20:11 -0400 72) if (inode == ERR_PTR(-ESTALE)) {
a9049376ee05b (Al Viro 2011-07-08 21:20:11 -0400 73) ext2_error(dir->i_sb, __func__,
a9049376ee05b (Al Viro 2011-07-08 21:20:11 -0400 74) "deleted inode referenced: %lu",
a9049376ee05b (Al Viro 2011-07-08 21:20:11 -0400 75) (unsigned long) ino);
a9049376ee05b (Al Viro 2011-07-08 21:20:11 -0400 76) return ERR_PTR(-EIO);
4d6c13f87db12 (Bryan Donlan 2009-06-30 11:41:24 -0700 77) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 78) }
082a05c6f02e0 (Pekka Enberg 2006-01-14 13:21:07 -0800 79) return d_splice_alias(inode, dentry);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 80) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 81)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 82) struct dentry *ext2_get_parent(struct dentry *child)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 83) {
a43850a380ef5 (zhangyi (F) 2020-06-08 11:40:43 +0800 84) ino_t ino;
b4962091a54c8 (zhangyi (F) 2020-06-08 11:40:42 +0800 85) int res;
b4962091a54c8 (zhangyi (F) 2020-06-08 11:40:42 +0800 86)
80e5d1ff5d5f1 (Al Viro 2021-04-15 19:46:50 -0400 87) res = ext2_inode_by_name(d_inode(child), &dotdot_name, &ino);
b4962091a54c8 (zhangyi (F) 2020-06-08 11:40:42 +0800 88) if (res)
b4962091a54c8 (zhangyi (F) 2020-06-08 11:40:42 +0800 89) return ERR_PTR(res);
a43850a380ef5 (zhangyi (F) 2020-06-08 11:40:43 +0800 90)
fc64005c93090 (Al Viro 2016-04-10 01:33:30 -0400 91) return d_obtain_alias(ext2_iget(child->d_sb, ino));
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 92) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 93)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 94) /*
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 95) * By the time this is called, we already have created
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 96) * the directory cache entry for the new file, but it
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 97) * is so far negative - it has no inode.
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 98) *
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 99) * If the create succeeds, we fill in the inode information
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 100) * with d_instantiate().
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 101) */
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 102) static int ext2_create (struct user_namespace * mnt_userns,
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 103) struct inode * dir, struct dentry * dentry,
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 104) umode_t mode, bool excl)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 105) {
907f4554e2521 (Christoph Hellwig 2010-03-03 09:05:06 -0500 106) struct inode *inode;
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 107) int err;
907f4554e2521 (Christoph Hellwig 2010-03-03 09:05:06 -0500 108)
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 109) err = dquot_initialize(dir);
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 110) if (err)
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 111) return err;
907f4554e2521 (Christoph Hellwig 2010-03-03 09:05:06 -0500 112)
2a7dba391e562 (Eric Paris 2011-02-01 11:05:39 -0500 113) inode = ext2_new_inode(dir, mode, &dentry->d_name);
907f4554e2521 (Christoph Hellwig 2010-03-03 09:05:06 -0500 114) if (IS_ERR(inode))
907f4554e2521 (Christoph Hellwig 2010-03-03 09:05:06 -0500 115) return PTR_ERR(inode);
907f4554e2521 (Christoph Hellwig 2010-03-03 09:05:06 -0500 116)
fb094c90748fb (Dan Williams 2017-12-21 12:25:11 -0800 117) ext2_set_file_ops(inode);
907f4554e2521 (Christoph Hellwig 2010-03-03 09:05:06 -0500 118) mark_inode_dirty(inode);
907f4554e2521 (Christoph Hellwig 2010-03-03 09:05:06 -0500 119) return ext2_add_nondir(dentry, inode);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 120) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 121)
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 122) static int ext2_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 123) struct dentry *dentry, umode_t mode)
60545d0d4610b (Al Viro 2013-06-07 01:20:27 -0400 124) {
60545d0d4610b (Al Viro 2013-06-07 01:20:27 -0400 125) struct inode *inode = ext2_new_inode(dir, mode, NULL);
60545d0d4610b (Al Viro 2013-06-07 01:20:27 -0400 126) if (IS_ERR(inode))
60545d0d4610b (Al Viro 2013-06-07 01:20:27 -0400 127) return PTR_ERR(inode);
60545d0d4610b (Al Viro 2013-06-07 01:20:27 -0400 128)
fb094c90748fb (Dan Williams 2017-12-21 12:25:11 -0800 129) ext2_set_file_ops(inode);
60545d0d4610b (Al Viro 2013-06-07 01:20:27 -0400 130) mark_inode_dirty(inode);
60545d0d4610b (Al Viro 2013-06-07 01:20:27 -0400 131) d_tmpfile(dentry, inode);
60545d0d4610b (Al Viro 2013-06-07 01:20:27 -0400 132) unlock_new_inode(inode);
60545d0d4610b (Al Viro 2013-06-07 01:20:27 -0400 133) return 0;
60545d0d4610b (Al Viro 2013-06-07 01:20:27 -0400 134) }
60545d0d4610b (Al Viro 2013-06-07 01:20:27 -0400 135)
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 136) static int ext2_mknod (struct user_namespace * mnt_userns, struct inode * dir,
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 137) struct dentry *dentry, umode_t mode, dev_t rdev)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 138) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 139) struct inode * inode;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 140) int err;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 141)
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 142) err = dquot_initialize(dir);
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 143) if (err)
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 144) return err;
907f4554e2521 (Christoph Hellwig 2010-03-03 09:05:06 -0500 145)
2a7dba391e562 (Eric Paris 2011-02-01 11:05:39 -0500 146) inode = ext2_new_inode (dir, mode, &dentry->d_name);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 147) err = PTR_ERR(inode);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 148) if (!IS_ERR(inode)) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 149) init_special_inode(inode, inode->i_mode, rdev);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 150) inode->i_op = &ext2_special_inode_operations;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 151) mark_inode_dirty(inode);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 152) err = ext2_add_nondir(dentry, inode);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 153) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 154) return err;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 155) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 156)
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 157) static int ext2_symlink (struct user_namespace * mnt_userns, struct inode * dir,
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 158) struct dentry * dentry, const char * symname)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 159) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 160) struct super_block * sb = dir->i_sb;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 161) int err = -ENAMETOOLONG;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 162) unsigned l = strlen(symname)+1;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 163) struct inode * inode;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 164)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 165) if (l > sb->s_blocksize)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 166) goto out;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 167)
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 168) err = dquot_initialize(dir);
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 169) if (err)
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 170) goto out;
907f4554e2521 (Christoph Hellwig 2010-03-03 09:05:06 -0500 171)
2a7dba391e562 (Eric Paris 2011-02-01 11:05:39 -0500 172) inode = ext2_new_inode (dir, S_IFLNK | S_IRWXUGO, &dentry->d_name);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 173) err = PTR_ERR(inode);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 174) if (IS_ERR(inode))
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 175) goto out;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 176)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 177) if (l > sizeof (EXT2_I(inode)->i_data)) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 178) /* slow symlink */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 179) inode->i_op = &ext2_symlink_inode_operations;
21fc61c73c390 (Al Viro 2015-11-17 01:07:57 -0500 180) inode_nohighmem(inode);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 181) if (test_opt(inode->i_sb, NOBH))
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 182) inode->i_mapping->a_ops = &ext2_nobh_aops;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 183) else
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 184) inode->i_mapping->a_ops = &ext2_aops;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 185) err = page_symlink(inode, symname, l);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 186) if (err)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 187) goto out_fail;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 188) } else {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 189) /* fast symlink */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 190) inode->i_op = &ext2_fast_symlink_inode_operations;
cbe0fa3858cd6 (Al Viro 2015-05-02 10:02:46 -0400 191) inode->i_link = (char*)EXT2_I(inode)->i_data;
cbe0fa3858cd6 (Al Viro 2015-05-02 10:02:46 -0400 192) memcpy(inode->i_link, symname, l);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 193) inode->i_size = l-1;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 194) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 195) mark_inode_dirty(inode);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 196)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 197) err = ext2_add_nondir(dentry, inode);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 198) out:
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 199) return err;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 200)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 201) out_fail:
a513b035eadf8 (Alexey Dobriyan 2006-03-23 03:00:53 -0800 202) inode_dec_link_count(inode);
2e5afe54e0cd6 (Al Viro 2018-05-16 18:29:56 -0400 203) discard_new_inode(inode);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 204) goto out;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 205) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 206)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 207) static int ext2_link (struct dentry * old_dentry, struct inode * dir,
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 208) struct dentry *dentry)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 209) {
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 210) struct inode *inode = d_inode(old_dentry);
41080b5a24011 (Al Viro 2008-12-30 01:52:35 -0500 211) int err;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 212)
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 213) err = dquot_initialize(dir);
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 214) if (err)
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 215) return err;
907f4554e2521 (Christoph Hellwig 2010-03-03 09:05:06 -0500 216)
02027d42c3f74 (Deepa Dinamani 2016-09-14 07:48:05 -0700 217) inode->i_ctime = current_time(inode);
a513b035eadf8 (Alexey Dobriyan 2006-03-23 03:00:53 -0800 218) inode_inc_link_count(inode);
7de9c6ee3ecff (Al Viro 2010-10-23 11:11:40 -0400 219) ihold(inode);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 220)
41080b5a24011 (Al Viro 2008-12-30 01:52:35 -0500 221) err = ext2_add_link(dentry, inode);
41080b5a24011 (Al Viro 2008-12-30 01:52:35 -0500 222) if (!err) {
41080b5a24011 (Al Viro 2008-12-30 01:52:35 -0500 223) d_instantiate(dentry, inode);
41080b5a24011 (Al Viro 2008-12-30 01:52:35 -0500 224) return 0;
41080b5a24011 (Al Viro 2008-12-30 01:52:35 -0500 225) }
41080b5a24011 (Al Viro 2008-12-30 01:52:35 -0500 226) inode_dec_link_count(inode);
41080b5a24011 (Al Viro 2008-12-30 01:52:35 -0500 227) iput(inode);
41080b5a24011 (Al Viro 2008-12-30 01:52:35 -0500 228) return err;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 229) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 230)
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 231) static int ext2_mkdir(struct user_namespace * mnt_userns,
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 232) struct inode * dir, struct dentry * dentry, umode_t mode)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 233) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 234) struct inode * inode;
8de52778798fe (Al Viro 2012-02-06 12:45:27 -0500 235) int err;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 236)
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 237) err = dquot_initialize(dir);
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 238) if (err)
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 239) return err;
907f4554e2521 (Christoph Hellwig 2010-03-03 09:05:06 -0500 240)
a513b035eadf8 (Alexey Dobriyan 2006-03-23 03:00:53 -0800 241) inode_inc_link_count(dir);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 242)
2a7dba391e562 (Eric Paris 2011-02-01 11:05:39 -0500 243) inode = ext2_new_inode(dir, S_IFDIR | mode, &dentry->d_name);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 244) err = PTR_ERR(inode);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 245) if (IS_ERR(inode))
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 246) goto out_dir;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 247)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 248) inode->i_op = &ext2_dir_inode_operations;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 249) inode->i_fop = &ext2_dir_operations;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 250) if (test_opt(inode->i_sb, NOBH))
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 251) inode->i_mapping->a_ops = &ext2_nobh_aops;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 252) else
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 253) inode->i_mapping->a_ops = &ext2_aops;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 254)
a513b035eadf8 (Alexey Dobriyan 2006-03-23 03:00:53 -0800 255) inode_inc_link_count(inode);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 256)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 257) err = ext2_make_empty(inode, dir);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 258) if (err)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 259) goto out_fail;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 260)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 261) err = ext2_add_link(dentry, inode);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 262) if (err)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 263) goto out_fail;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 264)
1e2e547a93a00 (Al Viro 2018-05-04 08:23:01 -0400 265) d_instantiate_new(dentry, inode);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 266) out:
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 267) return err;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 268)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 269) out_fail:
a513b035eadf8 (Alexey Dobriyan 2006-03-23 03:00:53 -0800 270) inode_dec_link_count(inode);
a513b035eadf8 (Alexey Dobriyan 2006-03-23 03:00:53 -0800 271) inode_dec_link_count(inode);
2e5afe54e0cd6 (Al Viro 2018-05-16 18:29:56 -0400 272) discard_new_inode(inode);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 273) out_dir:
a513b035eadf8 (Alexey Dobriyan 2006-03-23 03:00:53 -0800 274) inode_dec_link_count(dir);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 275) goto out;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 276) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 277)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 278) static int ext2_unlink(struct inode * dir, struct dentry *dentry)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 279) {
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 280) struct inode * inode = d_inode(dentry);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 281) struct ext2_dir_entry_2 * de;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 282) struct page * page;
782b76d7abdf0 (Ira Weiny 2021-03-28 23:54:02 -0700 283) void *page_addr;
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 284) int err;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 285)
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 286) err = dquot_initialize(dir);
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 287) if (err)
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 288) goto out;
907f4554e2521 (Christoph Hellwig 2010-03-03 09:05:06 -0500 289)
782b76d7abdf0 (Ira Weiny 2021-03-28 23:54:02 -0700 290) de = ext2_find_entry(dir, &dentry->d_name, &page, &page_addr);
b4962091a54c8 (zhangyi (F) 2020-06-08 11:40:42 +0800 291) if (IS_ERR(de)) {
b4962091a54c8 (zhangyi (F) 2020-06-08 11:40:42 +0800 292) err = PTR_ERR(de);
b4962091a54c8 (zhangyi (F) 2020-06-08 11:40:42 +0800 293) goto out;
b4962091a54c8 (zhangyi (F) 2020-06-08 11:40:42 +0800 294) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 295)
89e34995bdd78 (Javier Pello 2021-07-14 18:54:48 +0200 296) err = ext2_delete_entry (de, page, page_addr);
782b76d7abdf0 (Ira Weiny 2021-03-28 23:54:02 -0700 297) ext2_put_page(page, page_addr);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 298) if (err)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 299) goto out;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 300)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 301) inode->i_ctime = dir->i_ctime;
a513b035eadf8 (Alexey Dobriyan 2006-03-23 03:00:53 -0800 302) inode_dec_link_count(inode);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 303) err = 0;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 304) out:
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 305) return err;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 306) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 307)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 308) static int ext2_rmdir (struct inode * dir, struct dentry *dentry)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 309) {
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 310) struct inode * inode = d_inode(dentry);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 311) int err = -ENOTEMPTY;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 312)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 313) if (ext2_empty_dir(inode)) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 314) err = ext2_unlink(dir, dentry);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 315) if (!err) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 316) inode->i_size = 0;
a513b035eadf8 (Alexey Dobriyan 2006-03-23 03:00:53 -0800 317) inode_dec_link_count(inode);
a513b035eadf8 (Alexey Dobriyan 2006-03-23 03:00:53 -0800 318) inode_dec_link_count(dir);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 319) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 320) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 321) return err;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 322) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 323)
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 324) static int ext2_rename (struct user_namespace * mnt_userns,
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 325) struct inode * old_dir, struct dentry * old_dentry,
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 326) struct inode * new_dir, struct dentry * new_dentry,
f03b8ad8d3863 (Miklos Szeredi 2016-09-27 11:03:57 +0200 327) unsigned int flags)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 328) {
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 329) struct inode * old_inode = d_inode(old_dentry);
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 330) struct inode * new_inode = d_inode(new_dentry);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 331) struct page * dir_page = NULL;
782b76d7abdf0 (Ira Weiny 2021-03-28 23:54:02 -0700 332) void *dir_page_addr;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 333) struct ext2_dir_entry_2 * dir_de = NULL;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 334) struct page * old_page;
782b76d7abdf0 (Ira Weiny 2021-03-28 23:54:02 -0700 335) void *old_page_addr;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 336) struct ext2_dir_entry_2 * old_de;
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 337) int err;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 338)
f03b8ad8d3863 (Miklos Szeredi 2016-09-27 11:03:57 +0200 339) if (flags & ~RENAME_NOREPLACE)
f03b8ad8d3863 (Miklos Szeredi 2016-09-27 11:03:57 +0200 340) return -EINVAL;
f03b8ad8d3863 (Miklos Szeredi 2016-09-27 11:03:57 +0200 341)
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 342) err = dquot_initialize(old_dir);
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 343) if (err)
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 344) goto out;
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 345)
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 346) err = dquot_initialize(new_dir);
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 347) if (err)
c2edb305d6846 (Jan Kara 2015-06-29 16:08:45 +0200 348) goto out;
907f4554e2521 (Christoph Hellwig 2010-03-03 09:05:06 -0500 349)
782b76d7abdf0 (Ira Weiny 2021-03-28 23:54:02 -0700 350) old_de = ext2_find_entry(old_dir, &old_dentry->d_name, &old_page,
782b76d7abdf0 (Ira Weiny 2021-03-28 23:54:02 -0700 351) &old_page_addr);
b4962091a54c8 (zhangyi (F) 2020-06-08 11:40:42 +0800 352) if (IS_ERR(old_de)) {
b4962091a54c8 (zhangyi (F) 2020-06-08 11:40:42 +0800 353) err = PTR_ERR(old_de);
b4962091a54c8 (zhangyi (F) 2020-06-08 11:40:42 +0800 354) goto out;
b4962091a54c8 (zhangyi (F) 2020-06-08 11:40:42 +0800 355) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 356)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 357) if (S_ISDIR(old_inode->i_mode)) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 358) err = -EIO;
782b76d7abdf0 (Ira Weiny 2021-03-28 23:54:02 -0700 359) dir_de = ext2_dotdot(old_inode, &dir_page, &dir_page_addr);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 360) if (!dir_de)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 361) goto out_old;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 362) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 363)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 364) if (new_inode) {
782b76d7abdf0 (Ira Weiny 2021-03-28 23:54:02 -0700 365) void *page_addr;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 366) struct page *new_page;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 367) struct ext2_dir_entry_2 *new_de;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 368)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 369) err = -ENOTEMPTY;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 370) if (dir_de && !ext2_empty_dir (new_inode))
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 371) goto out_dir;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 372)
782b76d7abdf0 (Ira Weiny 2021-03-28 23:54:02 -0700 373) new_de = ext2_find_entry(new_dir, &new_dentry->d_name,
782b76d7abdf0 (Ira Weiny 2021-03-28 23:54:02 -0700 374) &new_page, &page_addr);
b4962091a54c8 (zhangyi (F) 2020-06-08 11:40:42 +0800 375) if (IS_ERR(new_de)) {
b4962091a54c8 (zhangyi (F) 2020-06-08 11:40:42 +0800 376) err = PTR_ERR(new_de);
b4962091a54c8 (zhangyi (F) 2020-06-08 11:40:42 +0800 377) goto out_dir;
b4962091a54c8 (zhangyi (F) 2020-06-08 11:40:42 +0800 378) }
782b76d7abdf0 (Ira Weiny 2021-03-28 23:54:02 -0700 379) ext2_set_link(new_dir, new_de, new_page, page_addr, old_inode, 1);
782b76d7abdf0 (Ira Weiny 2021-03-28 23:54:02 -0700 380) ext2_put_page(new_page, page_addr);
02027d42c3f74 (Deepa Dinamani 2016-09-14 07:48:05 -0700 381) new_inode->i_ctime = current_time(new_inode);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 382) if (dir_de)
9a53c3a783c2f (Dave Hansen 2006-09-30 23:29:03 -0700 383) drop_nlink(new_inode);
a513b035eadf8 (Alexey Dobriyan 2006-03-23 03:00:53 -0800 384) inode_dec_link_count(new_inode);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 385) } else {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 386) err = ext2_add_link(new_dentry, old_inode);
e8a80c6f769dd (Josh Hunt 2011-02-24 11:48:22 +0100 387) if (err)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 388) goto out_dir;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 389) if (dir_de)
a513b035eadf8 (Alexey Dobriyan 2006-03-23 03:00:53 -0800 390) inode_inc_link_count(new_dir);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 391) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 392)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 393) /*
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 394) * Like most other Unix systems, set the ctime for inodes on a
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 395) * rename.
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 396) */
02027d42c3f74 (Deepa Dinamani 2016-09-14 07:48:05 -0700 397) old_inode->i_ctime = current_time(old_inode);
e8a80c6f769dd (Josh Hunt 2011-02-24 11:48:22 +0100 398) mark_inode_dirty(old_inode);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 399)
89e34995bdd78 (Javier Pello 2021-07-14 18:54:48 +0200 400) ext2_delete_entry(old_de, old_page, old_page_addr);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 401)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 402) if (dir_de) {
39fe7557b4d6a (Jan Kara 2009-06-17 16:26:20 -0700 403) if (old_dir != new_dir)
782b76d7abdf0 (Ira Weiny 2021-03-28 23:54:02 -0700 404) ext2_set_link(old_inode, dir_de, dir_page,
782b76d7abdf0 (Ira Weiny 2021-03-28 23:54:02 -0700 405) dir_page_addr, new_dir, 0);
e2ebb12304559 (Ira Weiny 2021-03-28 23:54:01 -0700 406)
782b76d7abdf0 (Ira Weiny 2021-03-28 23:54:02 -0700 407) ext2_put_page(dir_page, dir_page_addr);
a513b035eadf8 (Alexey Dobriyan 2006-03-23 03:00:53 -0800 408) inode_dec_link_count(old_dir);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 409) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 410)
782b76d7abdf0 (Ira Weiny 2021-03-28 23:54:02 -0700 411) ext2_put_page(old_page, old_page_addr);
782b76d7abdf0 (Ira Weiny 2021-03-28 23:54:02 -0700 412) return 0;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 413)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 414) out_dir:
a6fbd0ab3d7a1 (Ira Weiny 2020-11-12 09:42:44 -0800 415) if (dir_de)
782b76d7abdf0 (Ira Weiny 2021-03-28 23:54:02 -0700 416) ext2_put_page(dir_page, dir_page_addr);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 417) out_old:
782b76d7abdf0 (Ira Weiny 2021-03-28 23:54:02 -0700 418) ext2_put_page(old_page, old_page_addr);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 419) out:
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 420) return err;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 421) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 422)
754661f143e70 (Arjan van de Ven 2007-02-12 00:55:38 -0800 423) const struct inode_operations ext2_dir_inode_operations = {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 424) .create = ext2_create,
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 425) .lookup = ext2_lookup,
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 426) .link = ext2_link,
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 427) .unlink = ext2_unlink,
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 428) .symlink = ext2_symlink,
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 429) .mkdir = ext2_mkdir,
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 430) .rmdir = ext2_rmdir,
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 431) .mknod = ext2_mknod,
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 432) .rename = ext2_rename,
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 433) .listxattr = ext2_listxattr,
93bc420ed41df (yangerkun 2019-02-18 09:07:02 +0800 434) .getattr = ext2_getattr,
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 435) .setattr = ext2_setattr,
4e34e719e457f (Christoph Hellwig 2011-07-23 17:37:31 +0200 436) .get_acl = ext2_get_acl,
64e178a7118b1 (Christoph Hellwig 2013-12-20 05:16:44 -0800 437) .set_acl = ext2_set_acl,
60545d0d4610b (Al Viro 2013-06-07 01:20:27 -0400 438) .tmpfile = ext2_tmpfile,
aba405e33e150 (Miklos Szeredi 2021-04-07 14:36:43 +0200 439) .fileattr_get = ext2_fileattr_get,
aba405e33e150 (Miklos Szeredi 2021-04-07 14:36:43 +0200 440) .fileattr_set = ext2_fileattr_set,
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 441) };
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 442)
754661f143e70 (Arjan van de Ven 2007-02-12 00:55:38 -0800 443) const struct inode_operations ext2_special_inode_operations = {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 444) .listxattr = ext2_listxattr,
93bc420ed41df (yangerkun 2019-02-18 09:07:02 +0800 445) .getattr = ext2_getattr,
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 446) .setattr = ext2_setattr,
4e34e719e457f (Christoph Hellwig 2011-07-23 17:37:31 +0200 447) .get_acl = ext2_get_acl,
64e178a7118b1 (Christoph Hellwig 2013-12-20 05:16:44 -0800 448) .set_acl = ext2_set_acl,
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 449) };