LCOV - code coverage report
Current view: top level - fs/ext4 - xattr.c (source / functions) Hit Total Coverage
Test: fstests of 6.5.0-rc3-acha @ Mon Jul 31 20:08:06 PDT 2023 Lines: 0 1651 0.0 %
Date: 2023-07-31 20:08:07 Functions: 0 59 0.0 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0
       2             : /*
       3             :  * linux/fs/ext4/xattr.c
       4             :  *
       5             :  * Copyright (C) 2001-2003 Andreas Gruenbacher, <agruen@suse.de>
       6             :  *
       7             :  * Fix by Harrison Xing <harrison@mountainviewdata.com>.
       8             :  * Ext4 code with a lot of help from Eric Jarman <ejarman@acm.org>.
       9             :  * Extended attributes for symlinks and special files added per
      10             :  *  suggestion of Luka Renko <luka.renko@hermes.si>.
      11             :  * xattr consolidation Copyright (c) 2004 James Morris <jmorris@redhat.com>,
      12             :  *  Red Hat Inc.
      13             :  * ea-in-inode support by Alex Tomas <alex@clusterfs.com> aka bzzz
      14             :  *  and Andreas Gruenbacher <agruen@suse.de>.
      15             :  */
      16             : 
      17             : /*
      18             :  * Extended attributes are stored directly in inodes (on file systems with
      19             :  * inodes bigger than 128 bytes) and on additional disk blocks. The i_file_acl
      20             :  * field contains the block number if an inode uses an additional block. All
      21             :  * attributes must fit in the inode and one additional block. Blocks that
      22             :  * contain the identical set of attributes may be shared among several inodes.
      23             :  * Identical blocks are detected by keeping a cache of blocks that have
      24             :  * recently been accessed.
      25             :  *
      26             :  * The attributes in inodes and on blocks have a different header; the entries
      27             :  * are stored in the same format:
      28             :  *
      29             :  *   +------------------+
      30             :  *   | header           |
      31             :  *   | entry 1          | |
      32             :  *   | entry 2          | | growing downwards
      33             :  *   | entry 3          | v
      34             :  *   | four null bytes  |
      35             :  *   | . . .            |
      36             :  *   | value 1          | ^
      37             :  *   | value 3          | | growing upwards
      38             :  *   | value 2          | |
      39             :  *   +------------------+
      40             :  *
      41             :  * The header is followed by multiple entry descriptors. In disk blocks, the
      42             :  * entry descriptors are kept sorted. In inodes, they are unsorted. The
      43             :  * attribute values are aligned to the end of the block in no specific order.
      44             :  *
      45             :  * Locking strategy
      46             :  * ----------------
      47             :  * EXT4_I(inode)->i_file_acl is protected by EXT4_I(inode)->xattr_sem.
      48             :  * EA blocks are only changed if they are exclusive to an inode, so
      49             :  * holding xattr_sem also means that nothing but the EA block's reference
      50             :  * count can change. Multiple writers to the same block are synchronized
      51             :  * by the buffer lock.
      52             :  */
      53             : 
      54             : #include <linux/init.h>
      55             : #include <linux/fs.h>
      56             : #include <linux/slab.h>
      57             : #include <linux/mbcache.h>
      58             : #include <linux/quotaops.h>
      59             : #include <linux/iversion.h>
      60             : #include "ext4_jbd2.h"
      61             : #include "ext4.h"
      62             : #include "xattr.h"
      63             : #include "acl.h"
      64             : 
      65             : #ifdef EXT4_XATTR_DEBUG
      66             : # define ea_idebug(inode, fmt, ...)                                     \
      67             :         printk(KERN_DEBUG "inode %s:%lu: " fmt "\n",                        \
      68             :                inode->i_sb->s_id, inode->i_ino, ##__VA_ARGS__)
      69             : # define ea_bdebug(bh, fmt, ...)                                        \
      70             :         printk(KERN_DEBUG "block %pg:%lu: " fmt "\n",                       \
      71             :                bh->b_bdev, (unsigned long)bh->b_blocknr, ##__VA_ARGS__)
      72             : #else
      73             : # define ea_idebug(inode, fmt, ...)     no_printk(fmt, ##__VA_ARGS__)
      74             : # define ea_bdebug(bh, fmt, ...)        no_printk(fmt, ##__VA_ARGS__)
      75             : #endif
      76             : 
      77             : static void ext4_xattr_block_cache_insert(struct mb_cache *,
      78             :                                           struct buffer_head *);
      79             : static struct buffer_head *
      80             : ext4_xattr_block_cache_find(struct inode *, struct ext4_xattr_header *,
      81             :                             struct mb_cache_entry **);
      82             : static __le32 ext4_xattr_hash_entry(char *name, size_t name_len, __le32 *value,
      83             :                                     size_t value_count);
      84             : static __le32 ext4_xattr_hash_entry_signed(char *name, size_t name_len, __le32 *value,
      85             :                                     size_t value_count);
      86             : static void ext4_xattr_rehash(struct ext4_xattr_header *);
      87             : 
      88             : static const struct xattr_handler * const ext4_xattr_handler_map[] = {
      89             :         [EXT4_XATTR_INDEX_USER]              = &ext4_xattr_user_handler,
      90             : #ifdef CONFIG_EXT4_FS_POSIX_ACL
      91             :         [EXT4_XATTR_INDEX_POSIX_ACL_ACCESS]  = &nop_posix_acl_access,
      92             :         [EXT4_XATTR_INDEX_POSIX_ACL_DEFAULT] = &nop_posix_acl_default,
      93             : #endif
      94             :         [EXT4_XATTR_INDEX_TRUSTED]           = &ext4_xattr_trusted_handler,
      95             : #ifdef CONFIG_EXT4_FS_SECURITY
      96             :         [EXT4_XATTR_INDEX_SECURITY]          = &ext4_xattr_security_handler,
      97             : #endif
      98             :         [EXT4_XATTR_INDEX_HURD]              = &ext4_xattr_hurd_handler,
      99             : };
     100             : 
     101             : const struct xattr_handler *ext4_xattr_handlers[] = {
     102             :         &ext4_xattr_user_handler,
     103             :         &ext4_xattr_trusted_handler,
     104             : #ifdef CONFIG_EXT4_FS_SECURITY
     105             :         &ext4_xattr_security_handler,
     106             : #endif
     107             :         &ext4_xattr_hurd_handler,
     108             :         NULL
     109             : };
     110             : 
     111             : #define EA_BLOCK_CACHE(inode)   (((struct ext4_sb_info *) \
     112             :                                 inode->i_sb->s_fs_info)->s_ea_block_cache)
     113             : 
     114             : #define EA_INODE_CACHE(inode)   (((struct ext4_sb_info *) \
     115             :                                 inode->i_sb->s_fs_info)->s_ea_inode_cache)
     116             : 
     117             : static int
     118             : ext4_expand_inode_array(struct ext4_xattr_inode_array **ea_inode_array,
     119             :                         struct inode *inode);
     120             : 
     121             : #ifdef CONFIG_LOCKDEP
     122             : void ext4_xattr_inode_set_class(struct inode *ea_inode)
     123             : {
     124             :         struct ext4_inode_info *ei = EXT4_I(ea_inode);
     125             : 
     126             :         lockdep_set_subclass(&ea_inode->i_rwsem, 1);
     127             :         (void) ei;      /* shut up clang warning if !CONFIG_LOCKDEP */
     128             :         lockdep_set_subclass(&ei->i_data_sem, I_DATA_SEM_EA);
     129             : }
     130             : #endif
     131             : 
     132           0 : static __le32 ext4_xattr_block_csum(struct inode *inode,
     133             :                                     sector_t block_nr,
     134             :                                     struct ext4_xattr_header *hdr)
     135             : {
     136           0 :         struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
     137           0 :         __u32 csum;
     138           0 :         __le64 dsk_block_nr = cpu_to_le64(block_nr);
     139           0 :         __u32 dummy_csum = 0;
     140           0 :         int offset = offsetof(struct ext4_xattr_header, h_checksum);
     141             : 
     142           0 :         csum = ext4_chksum(sbi, sbi->s_csum_seed, (__u8 *)&dsk_block_nr,
     143             :                            sizeof(dsk_block_nr));
     144           0 :         csum = ext4_chksum(sbi, csum, (__u8 *)hdr, offset);
     145           0 :         csum = ext4_chksum(sbi, csum, (__u8 *)&dummy_csum, sizeof(dummy_csum));
     146           0 :         offset += sizeof(dummy_csum);
     147           0 :         csum = ext4_chksum(sbi, csum, (__u8 *)hdr + offset,
     148           0 :                            EXT4_BLOCK_SIZE(inode->i_sb) - offset);
     149             : 
     150           0 :         return cpu_to_le32(csum);
     151             : }
     152             : 
     153           0 : static int ext4_xattr_block_csum_verify(struct inode *inode,
     154             :                                         struct buffer_head *bh)
     155             : {
     156           0 :         struct ext4_xattr_header *hdr = BHDR(bh);
     157           0 :         int ret = 1;
     158             : 
     159           0 :         if (ext4_has_metadata_csum(inode->i_sb)) {
     160           0 :                 lock_buffer(bh);
     161           0 :                 ret = (hdr->h_checksum == ext4_xattr_block_csum(inode,
     162             :                                                         bh->b_blocknr, hdr));
     163           0 :                 unlock_buffer(bh);
     164             :         }
     165           0 :         return ret;
     166             : }
     167             : 
     168           0 : static void ext4_xattr_block_csum_set(struct inode *inode,
     169             :                                       struct buffer_head *bh)
     170             : {
     171           0 :         if (ext4_has_metadata_csum(inode->i_sb))
     172           0 :                 BHDR(bh)->h_checksum = ext4_xattr_block_csum(inode,
     173           0 :                                                 bh->b_blocknr, BHDR(bh));
     174           0 : }
     175             : 
     176           0 : static inline const char *ext4_xattr_prefix(int name_index,
     177             :                                             struct dentry *dentry)
     178             : {
     179           0 :         const struct xattr_handler *handler = NULL;
     180             : 
     181           0 :         if (name_index > 0 && name_index < ARRAY_SIZE(ext4_xattr_handler_map))
     182           0 :                 handler = ext4_xattr_handler_map[name_index];
     183             : 
     184           0 :         if (!xattr_handler_can_list(handler, dentry))
     185             :                 return NULL;
     186             : 
     187           0 :         return xattr_prefix(handler);
     188             : }
     189             : 
     190             : static int
     191           0 : check_xattrs(struct inode *inode, struct buffer_head *bh,
     192             :              struct ext4_xattr_entry *entry, void *end, void *value_start,
     193             :              const char *function, unsigned int line)
     194             : {
     195           0 :         struct ext4_xattr_entry *e = entry;
     196           0 :         int err = -EFSCORRUPTED;
     197           0 :         char *err_str;
     198             : 
     199           0 :         if (bh) {
     200           0 :                 if (BHDR(bh)->h_magic != cpu_to_le32(EXT4_XATTR_MAGIC) ||
     201           0 :                     BHDR(bh)->h_blocks != cpu_to_le32(1)) {
     202           0 :                         err_str = "invalid header";
     203           0 :                         goto errout;
     204             :                 }
     205           0 :                 if (buffer_verified(bh))
     206             :                         return 0;
     207           0 :                 if (!ext4_xattr_block_csum_verify(inode, bh)) {
     208           0 :                         err = -EFSBADCRC;
     209           0 :                         err_str = "invalid checksum";
     210           0 :                         goto errout;
     211             :                 }
     212             :         } else {
     213           0 :                 struct ext4_xattr_ibody_header *header = value_start;
     214             : 
     215           0 :                 header -= 1;
     216           0 :                 if (end - (void *)header < sizeof(*header) + sizeof(u32)) {
     217           0 :                         err_str = "in-inode xattr block too small";
     218           0 :                         goto errout;
     219             :                 }
     220           0 :                 if (header->h_magic != cpu_to_le32(EXT4_XATTR_MAGIC)) {
     221           0 :                         err_str = "bad magic number in in-inode xattr";
     222           0 :                         goto errout;
     223             :                 }
     224             :         }
     225             : 
     226             :         /* Find the end of the names list */
     227           0 :         while (!IS_LAST_ENTRY(e)) {
     228           0 :                 struct ext4_xattr_entry *next = EXT4_XATTR_NEXT(e);
     229           0 :                 if ((void *)next >= end) {
     230           0 :                         err_str = "e_name out of bounds";
     231           0 :                         goto errout;
     232             :                 }
     233           0 :                 if (strnlen(e->e_name, e->e_name_len) != e->e_name_len) {
     234           0 :                         err_str = "bad e_name length";
     235           0 :                         goto errout;
     236             :                 }
     237             :                 e = next;
     238             :         }
     239             : 
     240             :         /* Check the values */
     241           0 :         while (!IS_LAST_ENTRY(entry)) {
     242           0 :                 u32 size = le32_to_cpu(entry->e_value_size);
     243           0 :                 unsigned long ea_ino = le32_to_cpu(entry->e_value_inum);
     244             : 
     245           0 :                 if (!ext4_has_feature_ea_inode(inode->i_sb) && ea_ino) {
     246           0 :                         err_str = "ea_inode specified without ea_inode feature enabled";
     247           0 :                         goto errout;
     248             :                 }
     249           0 :                 if (ea_ino && ((ea_ino == EXT4_ROOT_INO) ||
     250             :                                !ext4_valid_inum(inode->i_sb, ea_ino))) {
     251           0 :                         err_str = "invalid ea_ino";
     252           0 :                         goto errout;
     253             :                 }
     254           0 :                 if (size > EXT4_XATTR_SIZE_MAX) {
     255           0 :                         err_str = "e_value size too large";
     256           0 :                         goto errout;
     257             :                 }
     258             : 
     259           0 :                 if (size != 0 && entry->e_value_inum == 0) {
     260           0 :                         u16 offs = le16_to_cpu(entry->e_value_offs);
     261           0 :                         void *value;
     262             : 
     263             :                         /*
     264             :                          * The value cannot overlap the names, and the value
     265             :                          * with padding cannot extend beyond 'end'.  Check both
     266             :                          * the padded and unpadded sizes, since the size may
     267             :                          * overflow to 0 when adding padding.
     268             :                          */
     269           0 :                         if (offs > end - value_start) {
     270           0 :                                 err_str = "e_value out of bounds";
     271           0 :                                 goto errout;
     272             :                         }
     273           0 :                         value = value_start + offs;
     274           0 :                         if (value < (void *)e + sizeof(u32) ||
     275           0 :                             size > end - value ||
     276           0 :                             EXT4_XATTR_SIZE(size) > end - value) {
     277           0 :                                 err_str = "overlapping e_value ";
     278           0 :                                 goto errout;
     279             :                         }
     280             :                 }
     281           0 :                 entry = EXT4_XATTR_NEXT(entry);
     282             :         }
     283           0 :         if (bh)
     284           0 :                 set_buffer_verified(bh);
     285             :         return 0;
     286             : 
     287           0 : errout:
     288           0 :         if (bh)
     289           0 :                 __ext4_error_inode(inode, function, line, 0, -err,
     290             :                                    "corrupted xattr block %llu: %s",
     291           0 :                                    (unsigned long long) bh->b_blocknr,
     292             :                                    err_str);
     293             :         else
     294           0 :                 __ext4_error_inode(inode, function, line, 0, -err,
     295             :                                    "corrupted in-inode xattr: %s", err_str);
     296             :         return err;
     297             : }
     298             : 
     299             : static inline int
     300           0 : __ext4_xattr_check_block(struct inode *inode, struct buffer_head *bh,
     301             :                          const char *function, unsigned int line)
     302             : {
     303           0 :         return check_xattrs(inode, bh, BFIRST(bh), bh->b_data + bh->b_size,
     304             :                             bh->b_data, function, line);
     305             : }
     306             : 
     307             : #define ext4_xattr_check_block(inode, bh) \
     308             :         __ext4_xattr_check_block((inode), (bh),  __func__, __LINE__)
     309             : 
     310             : 
     311             : static inline int
     312             : __xattr_check_inode(struct inode *inode, struct ext4_xattr_ibody_header *header,
     313             :                          void *end, const char *function, unsigned int line)
     314             : {
     315           0 :         return check_xattrs(inode, NULL, IFIRST(header), end, IFIRST(header),
     316             :                             function, line);
     317             : }
     318             : 
     319             : #define xattr_check_inode(inode, header, end) \
     320             :         __xattr_check_inode((inode), (header), (end), __func__, __LINE__)
     321             : 
     322             : static int
     323           0 : xattr_find_entry(struct inode *inode, struct ext4_xattr_entry **pentry,
     324             :                  void *end, int name_index, const char *name, int sorted)
     325             : {
     326           0 :         struct ext4_xattr_entry *entry, *next;
     327           0 :         size_t name_len;
     328           0 :         int cmp = 1;
     329             : 
     330           0 :         if (name == NULL)
     331             :                 return -EINVAL;
     332           0 :         name_len = strlen(name);
     333           0 :         for (entry = *pentry; !IS_LAST_ENTRY(entry); entry = next) {
     334           0 :                 next = EXT4_XATTR_NEXT(entry);
     335           0 :                 if ((void *) next >= end) {
     336           0 :                         EXT4_ERROR_INODE(inode, "corrupted xattr entries");
     337           0 :                         return -EFSCORRUPTED;
     338             :                 }
     339           0 :                 cmp = name_index - entry->e_name_index;
     340           0 :                 if (!cmp)
     341           0 :                         cmp = name_len - entry->e_name_len;
     342           0 :                 if (!cmp)
     343           0 :                         cmp = memcmp(name, entry->e_name, name_len);
     344           0 :                 if (cmp <= 0 && (sorted || cmp == 0))
     345             :                         break;
     346             :         }
     347           0 :         *pentry = entry;
     348           0 :         return cmp ? -ENODATA : 0;
     349             : }
     350             : 
     351             : static u32
     352             : ext4_xattr_inode_hash(struct ext4_sb_info *sbi, const void *buffer, size_t size)
     353             : {
     354           0 :         return ext4_chksum(sbi, sbi->s_csum_seed, buffer, size);
     355             : }
     356             : 
     357             : static u64 ext4_xattr_inode_get_ref(struct inode *ea_inode)
     358             : {
     359           0 :         return ((u64)ea_inode->i_ctime.tv_sec << 32) |
     360             :                 (u32) inode_peek_iversion_raw(ea_inode);
     361             : }
     362             : 
     363             : static void ext4_xattr_inode_set_ref(struct inode *ea_inode, u64 ref_count)
     364             : {
     365           0 :         ea_inode->i_ctime.tv_sec = (u32)(ref_count >> 32);
     366           0 :         inode_set_iversion_raw(ea_inode, ref_count & 0xffffffff);
     367           0 : }
     368             : 
     369             : static u32 ext4_xattr_inode_get_hash(struct inode *ea_inode)
     370             : {
     371           0 :         return (u32)ea_inode->i_atime.tv_sec;
     372             : }
     373             : 
     374             : static void ext4_xattr_inode_set_hash(struct inode *ea_inode, u32 hash)
     375             : {
     376           0 :         ea_inode->i_atime.tv_sec = hash;
     377             : }
     378             : 
     379             : /*
     380             :  * Read the EA value from an inode.
     381             :  */
     382           0 : static int ext4_xattr_inode_read(struct inode *ea_inode, void *buf, size_t size)
     383             : {
     384           0 :         int blocksize = 1 << ea_inode->i_blkbits;
     385           0 :         int bh_count = (size + blocksize - 1) >> ea_inode->i_blkbits;
     386           0 :         int tail_size = (size % blocksize) ?: blocksize;
     387           0 :         struct buffer_head *bhs_inline[8];
     388           0 :         struct buffer_head **bhs = bhs_inline;
     389           0 :         int i, ret;
     390             : 
     391           0 :         if (bh_count > ARRAY_SIZE(bhs_inline)) {
     392           0 :                 bhs = kmalloc_array(bh_count, sizeof(*bhs), GFP_NOFS);
     393           0 :                 if (!bhs)
     394             :                         return -ENOMEM;
     395             :         }
     396             : 
     397           0 :         ret = ext4_bread_batch(ea_inode, 0 /* block */, bh_count,
     398             :                                true /* wait */, bhs);
     399           0 :         if (ret)
     400           0 :                 goto free_bhs;
     401             : 
     402           0 :         for (i = 0; i < bh_count; i++) {
     403             :                 /* There shouldn't be any holes in ea_inode. */
     404           0 :                 if (!bhs[i]) {
     405           0 :                         ret = -EFSCORRUPTED;
     406           0 :                         goto put_bhs;
     407             :                 }
     408           0 :                 memcpy((char *)buf + blocksize * i, bhs[i]->b_data,
     409             :                        i < bh_count - 1 ? blocksize : tail_size);
     410             :         }
     411             :         ret = 0;
     412           0 : put_bhs:
     413           0 :         for (i = 0; i < bh_count; i++)
     414           0 :                 brelse(bhs[i]);
     415           0 : free_bhs:
     416           0 :         if (bhs != bhs_inline)
     417           0 :                 kfree(bhs);
     418             :         return ret;
     419             : }
     420             : 
     421             : #define EXT4_XATTR_INODE_GET_PARENT(inode) ((__u32)(inode)->i_mtime.tv_sec)
     422             : 
     423           0 : static int ext4_xattr_inode_iget(struct inode *parent, unsigned long ea_ino,
     424             :                                  u32 ea_inode_hash, struct inode **ea_inode)
     425             : {
     426           0 :         struct inode *inode;
     427           0 :         int err;
     428             : 
     429             :         /*
     430             :          * We have to check for this corruption early as otherwise
     431             :          * iget_locked() could wait indefinitely for the state of our
     432             :          * parent inode.
     433             :          */
     434           0 :         if (parent->i_ino == ea_ino) {
     435           0 :                 ext4_error(parent->i_sb,
     436             :                            "Parent and EA inode have the same ino %lu", ea_ino);
     437           0 :                 return -EFSCORRUPTED;
     438             :         }
     439             : 
     440           0 :         inode = ext4_iget(parent->i_sb, ea_ino, EXT4_IGET_EA_INODE);
     441           0 :         if (IS_ERR(inode)) {
     442           0 :                 err = PTR_ERR(inode);
     443           0 :                 ext4_error(parent->i_sb,
     444             :                            "error while reading EA inode %lu err=%d", ea_ino,
     445             :                            err);
     446           0 :                 return err;
     447             :         }
     448           0 :         ext4_xattr_inode_set_class(inode);
     449             : 
     450             :         /*
     451             :          * Check whether this is an old Lustre-style xattr inode. Lustre
     452             :          * implementation does not have hash validation, rather it has a
     453             :          * backpointer from ea_inode to the parent inode.
     454             :          */
     455           0 :         if (ea_inode_hash != ext4_xattr_inode_get_hash(inode) &&
     456           0 :             EXT4_XATTR_INODE_GET_PARENT(inode) == parent->i_ino &&
     457           0 :             inode->i_generation == parent->i_generation) {
     458           0 :                 ext4_set_inode_state(inode, EXT4_STATE_LUSTRE_EA_INODE);
     459           0 :                 ext4_xattr_inode_set_ref(inode, 1);
     460             :         } else {
     461           0 :                 inode_lock(inode);
     462           0 :                 inode->i_flags |= S_NOQUOTA;
     463           0 :                 inode_unlock(inode);
     464             :         }
     465             : 
     466           0 :         *ea_inode = inode;
     467           0 :         return 0;
     468             : }
     469             : 
     470             : /* Remove entry from mbcache when EA inode is getting evicted */
     471           0 : void ext4_evict_ea_inode(struct inode *inode)
     472             : {
     473           0 :         struct mb_cache_entry *oe;
     474             : 
     475           0 :         if (!EA_INODE_CACHE(inode))
     476             :                 return;
     477             :         /* Wait for entry to get unused so that we can remove it */
     478           0 :         while ((oe = mb_cache_entry_delete_or_get(EA_INODE_CACHE(inode),
     479           0 :                         ext4_xattr_inode_get_hash(inode), inode->i_ino))) {
     480           0 :                 mb_cache_entry_wait_unused(oe);
     481           0 :                 mb_cache_entry_put(EA_INODE_CACHE(inode), oe);
     482             :         }
     483             : }
     484             : 
     485             : static int
     486           0 : ext4_xattr_inode_verify_hashes(struct inode *ea_inode,
     487             :                                struct ext4_xattr_entry *entry, void *buffer,
     488             :                                size_t size)
     489             : {
     490           0 :         u32 hash;
     491             : 
     492             :         /* Verify stored hash matches calculated hash. */
     493           0 :         hash = ext4_xattr_inode_hash(EXT4_SB(ea_inode->i_sb), buffer, size);
     494           0 :         if (hash != ext4_xattr_inode_get_hash(ea_inode))
     495             :                 return -EFSCORRUPTED;
     496             : 
     497           0 :         if (entry) {
     498           0 :                 __le32 e_hash, tmp_data;
     499             : 
     500             :                 /* Verify entry hash. */
     501           0 :                 tmp_data = cpu_to_le32(hash);
     502           0 :                 e_hash = ext4_xattr_hash_entry(entry->e_name, entry->e_name_len,
     503             :                                                &tmp_data, 1);
     504             :                 /* All good? */
     505           0 :                 if (e_hash == entry->e_hash)
     506           0 :                         return 0;
     507             : 
     508             :                 /*
     509             :                  * Not good. Maybe the entry hash was calculated
     510             :                  * using the buggy signed char version?
     511             :                  */
     512           0 :                 e_hash = ext4_xattr_hash_entry_signed(entry->e_name, entry->e_name_len,
     513             :                                                         &tmp_data, 1);
     514             :                 /* Still no match - bad */
     515           0 :                 if (e_hash != entry->e_hash)
     516             :                         return -EFSCORRUPTED;
     517             : 
     518             :                 /* Let people know about old hash */
     519           0 :                 pr_warn_once("ext4: filesystem with signed xattr name hash");
     520             :         }
     521             :         return 0;
     522             : }
     523             : 
     524             : /*
     525             :  * Read xattr value from the EA inode.
     526             :  */
     527             : static int
     528           0 : ext4_xattr_inode_get(struct inode *inode, struct ext4_xattr_entry *entry,
     529             :                      void *buffer, size_t size)
     530             : {
     531           0 :         struct mb_cache *ea_inode_cache = EA_INODE_CACHE(inode);
     532           0 :         struct inode *ea_inode;
     533           0 :         int err;
     534             : 
     535           0 :         err = ext4_xattr_inode_iget(inode, le32_to_cpu(entry->e_value_inum),
     536           0 :                                     le32_to_cpu(entry->e_hash), &ea_inode);
     537           0 :         if (err) {
     538           0 :                 ea_inode = NULL;
     539           0 :                 goto out;
     540             :         }
     541             : 
     542           0 :         if (i_size_read(ea_inode) != size) {
     543           0 :                 ext4_warning_inode(ea_inode,
     544             :                                    "ea_inode file size=%llu entry size=%zu",
     545             :                                    i_size_read(ea_inode), size);
     546           0 :                 err = -EFSCORRUPTED;
     547           0 :                 goto out;
     548             :         }
     549             : 
     550           0 :         err = ext4_xattr_inode_read(ea_inode, buffer, size);
     551           0 :         if (err)
     552           0 :                 goto out;
     553             : 
     554           0 :         if (!ext4_test_inode_state(ea_inode, EXT4_STATE_LUSTRE_EA_INODE)) {
     555           0 :                 err = ext4_xattr_inode_verify_hashes(ea_inode, entry, buffer,
     556             :                                                      size);
     557           0 :                 if (err) {
     558           0 :                         ext4_warning_inode(ea_inode,
     559             :                                            "EA inode hash validation failed");
     560           0 :                         goto out;
     561             :                 }
     562             : 
     563           0 :                 if (ea_inode_cache)
     564           0 :                         mb_cache_entry_create(ea_inode_cache, GFP_NOFS,
     565             :                                         ext4_xattr_inode_get_hash(ea_inode),
     566           0 :                                         ea_inode->i_ino, true /* reusable */);
     567             :         }
     568           0 : out:
     569           0 :         iput(ea_inode);
     570           0 :         return err;
     571             : }
     572             : 
     573             : static int
     574           0 : ext4_xattr_block_get(struct inode *inode, int name_index, const char *name,
     575             :                      void *buffer, size_t buffer_size)
     576             : {
     577           0 :         struct buffer_head *bh = NULL;
     578           0 :         struct ext4_xattr_entry *entry;
     579           0 :         size_t size;
     580           0 :         void *end;
     581           0 :         int error;
     582           0 :         struct mb_cache *ea_block_cache = EA_BLOCK_CACHE(inode);
     583             : 
     584           0 :         ea_idebug(inode, "name=%d.%s, buffer=%p, buffer_size=%ld",
     585             :                   name_index, name, buffer, (long)buffer_size);
     586             : 
     587           0 :         if (!EXT4_I(inode)->i_file_acl)
     588             :                 return -ENODATA;
     589           0 :         ea_idebug(inode, "reading block %llu",
     590             :                   (unsigned long long)EXT4_I(inode)->i_file_acl);
     591           0 :         bh = ext4_sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl, REQ_PRIO);
     592           0 :         if (IS_ERR(bh))
     593           0 :                 return PTR_ERR(bh);
     594           0 :         ea_bdebug(bh, "b_count=%d, refcount=%d",
     595             :                 atomic_read(&(bh->b_count)), le32_to_cpu(BHDR(bh)->h_refcount));
     596           0 :         error = ext4_xattr_check_block(inode, bh);
     597           0 :         if (error)
     598           0 :                 goto cleanup;
     599           0 :         ext4_xattr_block_cache_insert(ea_block_cache, bh);
     600           0 :         entry = BFIRST(bh);
     601           0 :         end = bh->b_data + bh->b_size;
     602           0 :         error = xattr_find_entry(inode, &entry, end, name_index, name, 1);
     603           0 :         if (error)
     604           0 :                 goto cleanup;
     605           0 :         size = le32_to_cpu(entry->e_value_size);
     606           0 :         error = -ERANGE;
     607           0 :         if (unlikely(size > EXT4_XATTR_SIZE_MAX))
     608           0 :                 goto cleanup;
     609           0 :         if (buffer) {
     610           0 :                 if (size > buffer_size)
     611           0 :                         goto cleanup;
     612           0 :                 if (entry->e_value_inum) {
     613           0 :                         error = ext4_xattr_inode_get(inode, entry, buffer,
     614             :                                                      size);
     615           0 :                         if (error)
     616           0 :                                 goto cleanup;
     617             :                 } else {
     618           0 :                         u16 offset = le16_to_cpu(entry->e_value_offs);
     619           0 :                         void *p = bh->b_data + offset;
     620             : 
     621           0 :                         if (unlikely(p + size > end))
     622           0 :                                 goto cleanup;
     623           0 :                         memcpy(buffer, p, size);
     624             :                 }
     625             :         }
     626           0 :         error = size;
     627             : 
     628           0 : cleanup:
     629           0 :         brelse(bh);
     630             :         return error;
     631             : }
     632             : 
     633             : int
     634           0 : ext4_xattr_ibody_get(struct inode *inode, int name_index, const char *name,
     635             :                      void *buffer, size_t buffer_size)
     636             : {
     637           0 :         struct ext4_xattr_ibody_header *header;
     638           0 :         struct ext4_xattr_entry *entry;
     639           0 :         struct ext4_inode *raw_inode;
     640           0 :         struct ext4_iloc iloc;
     641           0 :         size_t size;
     642           0 :         void *end;
     643           0 :         int error;
     644             : 
     645           0 :         if (!ext4_test_inode_state(inode, EXT4_STATE_XATTR))
     646             :                 return -ENODATA;
     647           0 :         error = ext4_get_inode_loc(inode, &iloc);
     648           0 :         if (error)
     649             :                 return error;
     650           0 :         raw_inode = ext4_raw_inode(&iloc);
     651           0 :         header = IHDR(inode, raw_inode);
     652           0 :         end = (void *)raw_inode + EXT4_SB(inode->i_sb)->s_inode_size;
     653           0 :         error = xattr_check_inode(inode, header, end);
     654           0 :         if (error)
     655           0 :                 goto cleanup;
     656           0 :         entry = IFIRST(header);
     657           0 :         error = xattr_find_entry(inode, &entry, end, name_index, name, 0);
     658           0 :         if (error)
     659           0 :                 goto cleanup;
     660           0 :         size = le32_to_cpu(entry->e_value_size);
     661           0 :         error = -ERANGE;
     662           0 :         if (unlikely(size > EXT4_XATTR_SIZE_MAX))
     663           0 :                 goto cleanup;
     664           0 :         if (buffer) {
     665           0 :                 if (size > buffer_size)
     666           0 :                         goto cleanup;
     667           0 :                 if (entry->e_value_inum) {
     668           0 :                         error = ext4_xattr_inode_get(inode, entry, buffer,
     669             :                                                      size);
     670           0 :                         if (error)
     671           0 :                                 goto cleanup;
     672             :                 } else {
     673           0 :                         u16 offset = le16_to_cpu(entry->e_value_offs);
     674           0 :                         void *p = (void *)IFIRST(header) + offset;
     675             : 
     676           0 :                         if (unlikely(p + size > end))
     677           0 :                                 goto cleanup;
     678           0 :                         memcpy(buffer, p, size);
     679             :                 }
     680             :         }
     681           0 :         error = size;
     682             : 
     683           0 : cleanup:
     684           0 :         brelse(iloc.bh);
     685             :         return error;
     686             : }
     687             : 
     688             : /*
     689             :  * ext4_xattr_get()
     690             :  *
     691             :  * Copy an extended attribute into the buffer
     692             :  * provided, or compute the buffer size required.
     693             :  * Buffer is NULL to compute the size of the buffer required.
     694             :  *
     695             :  * Returns a negative error number on failure, or the number of bytes
     696             :  * used / required on success.
     697             :  */
     698             : int
     699           0 : ext4_xattr_get(struct inode *inode, int name_index, const char *name,
     700             :                void *buffer, size_t buffer_size)
     701             : {
     702           0 :         int error;
     703             : 
     704           0 :         if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb))))
     705             :                 return -EIO;
     706             : 
     707           0 :         if (strlen(name) > 255)
     708             :                 return -ERANGE;
     709             : 
     710           0 :         down_read(&EXT4_I(inode)->xattr_sem);
     711           0 :         error = ext4_xattr_ibody_get(inode, name_index, name, buffer,
     712             :                                      buffer_size);
     713           0 :         if (error == -ENODATA)
     714           0 :                 error = ext4_xattr_block_get(inode, name_index, name, buffer,
     715             :                                              buffer_size);
     716           0 :         up_read(&EXT4_I(inode)->xattr_sem);
     717           0 :         return error;
     718             : }
     719             : 
     720             : static int
     721           0 : ext4_xattr_list_entries(struct dentry *dentry, struct ext4_xattr_entry *entry,
     722             :                         char *buffer, size_t buffer_size)
     723             : {
     724           0 :         size_t rest = buffer_size;
     725             : 
     726           0 :         for (; !IS_LAST_ENTRY(entry); entry = EXT4_XATTR_NEXT(entry)) {
     727           0 :                 const char *prefix;
     728             : 
     729           0 :                 prefix = ext4_xattr_prefix(entry->e_name_index, dentry);
     730           0 :                 if (prefix) {
     731           0 :                         size_t prefix_len = strlen(prefix);
     732           0 :                         size_t size = prefix_len + entry->e_name_len + 1;
     733             : 
     734           0 :                         if (buffer) {
     735           0 :                                 if (size > rest)
     736             :                                         return -ERANGE;
     737           0 :                                 memcpy(buffer, prefix, prefix_len);
     738           0 :                                 buffer += prefix_len;
     739           0 :                                 memcpy(buffer, entry->e_name, entry->e_name_len);
     740           0 :                                 buffer += entry->e_name_len;
     741           0 :                                 *buffer++ = 0;
     742             :                         }
     743           0 :                         rest -= size;
     744             :                 }
     745             :         }
     746           0 :         return buffer_size - rest;  /* total size */
     747             : }
     748             : 
     749             : static int
     750           0 : ext4_xattr_block_list(struct dentry *dentry, char *buffer, size_t buffer_size)
     751             : {
     752           0 :         struct inode *inode = d_inode(dentry);
     753           0 :         struct buffer_head *bh = NULL;
     754           0 :         int error;
     755             : 
     756           0 :         ea_idebug(inode, "buffer=%p, buffer_size=%ld",
     757             :                   buffer, (long)buffer_size);
     758             : 
     759           0 :         if (!EXT4_I(inode)->i_file_acl)
     760             :                 return 0;
     761           0 :         ea_idebug(inode, "reading block %llu",
     762             :                   (unsigned long long)EXT4_I(inode)->i_file_acl);
     763           0 :         bh = ext4_sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl, REQ_PRIO);
     764           0 :         if (IS_ERR(bh))
     765           0 :                 return PTR_ERR(bh);
     766           0 :         ea_bdebug(bh, "b_count=%d, refcount=%d",
     767             :                 atomic_read(&(bh->b_count)), le32_to_cpu(BHDR(bh)->h_refcount));
     768           0 :         error = ext4_xattr_check_block(inode, bh);
     769           0 :         if (error)
     770           0 :                 goto cleanup;
     771           0 :         ext4_xattr_block_cache_insert(EA_BLOCK_CACHE(inode), bh);
     772           0 :         error = ext4_xattr_list_entries(dentry, BFIRST(bh), buffer,
     773             :                                         buffer_size);
     774           0 : cleanup:
     775           0 :         brelse(bh);
     776             :         return error;
     777             : }
     778             : 
     779             : static int
     780           0 : ext4_xattr_ibody_list(struct dentry *dentry, char *buffer, size_t buffer_size)
     781             : {
     782           0 :         struct inode *inode = d_inode(dentry);
     783           0 :         struct ext4_xattr_ibody_header *header;
     784           0 :         struct ext4_inode *raw_inode;
     785           0 :         struct ext4_iloc iloc;
     786           0 :         void *end;
     787           0 :         int error;
     788             : 
     789           0 :         if (!ext4_test_inode_state(inode, EXT4_STATE_XATTR))
     790             :                 return 0;
     791           0 :         error = ext4_get_inode_loc(inode, &iloc);
     792           0 :         if (error)
     793             :                 return error;
     794           0 :         raw_inode = ext4_raw_inode(&iloc);
     795           0 :         header = IHDR(inode, raw_inode);
     796           0 :         end = (void *)raw_inode + EXT4_SB(inode->i_sb)->s_inode_size;
     797           0 :         error = xattr_check_inode(inode, header, end);
     798           0 :         if (error)
     799           0 :                 goto cleanup;
     800           0 :         error = ext4_xattr_list_entries(dentry, IFIRST(header),
     801             :                                         buffer, buffer_size);
     802             : 
     803           0 : cleanup:
     804           0 :         brelse(iloc.bh);
     805             :         return error;
     806             : }
     807             : 
     808             : /*
     809             :  * Inode operation listxattr()
     810             :  *
     811             :  * d_inode(dentry)->i_rwsem: don't care
     812             :  *
     813             :  * Copy a list of attribute names into the buffer
     814             :  * provided, or compute the buffer size required.
     815             :  * Buffer is NULL to compute the size of the buffer required.
     816             :  *
     817             :  * Returns a negative error number on failure, or the number of bytes
     818             :  * used / required on success.
     819             :  */
     820             : ssize_t
     821           0 : ext4_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size)
     822             : {
     823           0 :         int ret, ret2;
     824             : 
     825           0 :         down_read(&EXT4_I(d_inode(dentry))->xattr_sem);
     826           0 :         ret = ret2 = ext4_xattr_ibody_list(dentry, buffer, buffer_size);
     827           0 :         if (ret < 0)
     828           0 :                 goto errout;
     829           0 :         if (buffer) {
     830           0 :                 buffer += ret;
     831           0 :                 buffer_size -= ret;
     832             :         }
     833           0 :         ret = ext4_xattr_block_list(dentry, buffer, buffer_size);
     834           0 :         if (ret < 0)
     835           0 :                 goto errout;
     836           0 :         ret += ret2;
     837           0 : errout:
     838           0 :         up_read(&EXT4_I(d_inode(dentry))->xattr_sem);
     839           0 :         return ret;
     840             : }
     841             : 
     842             : /*
     843             :  * If the EXT4_FEATURE_COMPAT_EXT_ATTR feature of this file system is
     844             :  * not set, set it.
     845             :  */
     846           0 : static void ext4_xattr_update_super_block(handle_t *handle,
     847             :                                           struct super_block *sb)
     848             : {
     849           0 :         if (ext4_has_feature_xattr(sb))
     850             :                 return;
     851             : 
     852           0 :         BUFFER_TRACE(EXT4_SB(sb)->s_sbh, "get_write_access");
     853           0 :         if (ext4_journal_get_write_access(handle, sb, EXT4_SB(sb)->s_sbh,
     854             :                                           EXT4_JTR_NONE) == 0) {
     855           0 :                 lock_buffer(EXT4_SB(sb)->s_sbh);
     856           0 :                 ext4_set_feature_xattr(sb);
     857           0 :                 ext4_superblock_csum_set(sb);
     858           0 :                 unlock_buffer(EXT4_SB(sb)->s_sbh);
     859           0 :                 ext4_handle_dirty_metadata(handle, NULL, EXT4_SB(sb)->s_sbh);
     860             :         }
     861             : }
     862             : 
     863           0 : int ext4_get_inode_usage(struct inode *inode, qsize_t *usage)
     864             : {
     865           0 :         struct ext4_iloc iloc = { .bh = NULL };
     866           0 :         struct buffer_head *bh = NULL;
     867           0 :         struct ext4_inode *raw_inode;
     868           0 :         struct ext4_xattr_ibody_header *header;
     869           0 :         struct ext4_xattr_entry *entry;
     870           0 :         qsize_t ea_inode_refs = 0;
     871           0 :         void *end;
     872           0 :         int ret;
     873             : 
     874           0 :         lockdep_assert_held_read(&EXT4_I(inode)->xattr_sem);
     875             : 
     876           0 :         if (ext4_test_inode_state(inode, EXT4_STATE_XATTR)) {
     877           0 :                 ret = ext4_get_inode_loc(inode, &iloc);
     878           0 :                 if (ret)
     879           0 :                         goto out;
     880           0 :                 raw_inode = ext4_raw_inode(&iloc);
     881           0 :                 header = IHDR(inode, raw_inode);
     882           0 :                 end = (void *)raw_inode + EXT4_SB(inode->i_sb)->s_inode_size;
     883           0 :                 ret = xattr_check_inode(inode, header, end);
     884           0 :                 if (ret)
     885           0 :                         goto out;
     886             : 
     887           0 :                 for (entry = IFIRST(header); !IS_LAST_ENTRY(entry);
     888           0 :                      entry = EXT4_XATTR_NEXT(entry))
     889           0 :                         if (entry->e_value_inum)
     890           0 :                                 ea_inode_refs++;
     891             :         }
     892             : 
     893           0 :         if (EXT4_I(inode)->i_file_acl) {
     894           0 :                 bh = ext4_sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl, REQ_PRIO);
     895           0 :                 if (IS_ERR(bh)) {
     896           0 :                         ret = PTR_ERR(bh);
     897           0 :                         bh = NULL;
     898           0 :                         goto out;
     899             :                 }
     900             : 
     901           0 :                 ret = ext4_xattr_check_block(inode, bh);
     902           0 :                 if (ret)
     903           0 :                         goto out;
     904             : 
     905           0 :                 for (entry = BFIRST(bh); !IS_LAST_ENTRY(entry);
     906           0 :                      entry = EXT4_XATTR_NEXT(entry))
     907           0 :                         if (entry->e_value_inum)
     908           0 :                                 ea_inode_refs++;
     909             :         }
     910           0 :         *usage = ea_inode_refs + 1;
     911           0 :         ret = 0;
     912           0 : out:
     913           0 :         brelse(iloc.bh);
     914           0 :         brelse(bh);
     915           0 :         return ret;
     916             : }
     917             : 
     918             : static inline size_t round_up_cluster(struct inode *inode, size_t length)
     919             : {
     920           0 :         struct super_block *sb = inode->i_sb;
     921           0 :         size_t cluster_size = 1 << (EXT4_SB(sb)->s_cluster_bits +
     922           0 :                                     inode->i_blkbits);
     923           0 :         size_t mask = ~(cluster_size - 1);
     924             : 
     925           0 :         return (length + cluster_size - 1) & mask;
     926             : }
     927             : 
     928           0 : static int ext4_xattr_inode_alloc_quota(struct inode *inode, size_t len)
     929             : {
     930           0 :         int err;
     931             : 
     932           0 :         err = dquot_alloc_inode(inode);
     933           0 :         if (err)
     934             :                 return err;
     935           0 :         err = dquot_alloc_space_nodirty(inode, round_up_cluster(inode, len));
     936           0 :         if (err)
     937           0 :                 dquot_free_inode(inode);
     938             :         return err;
     939             : }
     940             : 
     941           0 : static void ext4_xattr_inode_free_quota(struct inode *parent,
     942             :                                         struct inode *ea_inode,
     943             :                                         size_t len)
     944             : {
     945           0 :         if (ea_inode &&
     946             :             ext4_test_inode_state(ea_inode, EXT4_STATE_LUSTRE_EA_INODE))
     947             :                 return;
     948           0 :         dquot_free_space_nodirty(parent, round_up_cluster(parent, len));
     949           0 :         dquot_free_inode(parent);
     950             : }
     951             : 
     952           0 : int __ext4_xattr_set_credits(struct super_block *sb, struct inode *inode,
     953             :                              struct buffer_head *block_bh, size_t value_len,
     954             :                              bool is_create)
     955             : {
     956           0 :         int credits;
     957           0 :         int blocks;
     958             : 
     959             :         /*
     960             :          * 1) Owner inode update
     961             :          * 2) Ref count update on old xattr block
     962             :          * 3) new xattr block
     963             :          * 4) block bitmap update for new xattr block
     964             :          * 5) group descriptor for new xattr block
     965             :          * 6) block bitmap update for old xattr block
     966             :          * 7) group descriptor for old block
     967             :          *
     968             :          * 6 & 7 can happen if we have two racing threads T_a and T_b
     969             :          * which are each trying to set an xattr on inodes I_a and I_b
     970             :          * which were both initially sharing an xattr block.
     971             :          */
     972           0 :         credits = 7;
     973             : 
     974             :         /* Quota updates. */
     975           0 :         credits += EXT4_MAXQUOTAS_TRANS_BLOCKS(sb);
     976             : 
     977             :         /*
     978             :          * In case of inline data, we may push out the data to a block,
     979             :          * so we need to reserve credits for this eventuality
     980             :          */
     981           0 :         if (inode && ext4_has_inline_data(inode))
     982           0 :                 credits += ext4_writepage_trans_blocks(inode) + 1;
     983             : 
     984             :         /* We are done if ea_inode feature is not enabled. */
     985           0 :         if (!ext4_has_feature_ea_inode(sb))
     986             :                 return credits;
     987             : 
     988             :         /* New ea_inode, inode map, block bitmap, group descriptor. */
     989           0 :         credits += 4;
     990             : 
     991             :         /* Data blocks. */
     992           0 :         blocks = (value_len + sb->s_blocksize - 1) >> sb->s_blocksize_bits;
     993             : 
     994             :         /* Indirection block or one level of extent tree. */
     995           0 :         blocks += 1;
     996             : 
     997             :         /* Block bitmap and group descriptor updates for each block. */
     998           0 :         credits += blocks * 2;
     999             : 
    1000             :         /* Blocks themselves. */
    1001           0 :         credits += blocks;
    1002             : 
    1003           0 :         if (!is_create) {
    1004             :                 /* Dereference ea_inode holding old xattr value.
    1005             :                  * Old ea_inode, inode map, block bitmap, group descriptor.
    1006             :                  */
    1007           0 :                 credits += 4;
    1008             : 
    1009             :                 /* Data blocks for old ea_inode. */
    1010           0 :                 blocks = XATTR_SIZE_MAX >> sb->s_blocksize_bits;
    1011             : 
    1012             :                 /* Indirection block or one level of extent tree for old
    1013             :                  * ea_inode.
    1014             :                  */
    1015           0 :                 blocks += 1;
    1016             : 
    1017             :                 /* Block bitmap and group descriptor updates for each block. */
    1018           0 :                 credits += blocks * 2;
    1019             :         }
    1020             : 
    1021             :         /* We may need to clone the existing xattr block in which case we need
    1022             :          * to increment ref counts for existing ea_inodes referenced by it.
    1023             :          */
    1024           0 :         if (block_bh) {
    1025           0 :                 struct ext4_xattr_entry *entry = BFIRST(block_bh);
    1026             : 
    1027           0 :                 for (; !IS_LAST_ENTRY(entry); entry = EXT4_XATTR_NEXT(entry))
    1028           0 :                         if (entry->e_value_inum)
    1029             :                                 /* Ref count update on ea_inode. */
    1030           0 :                                 credits += 1;
    1031             :         }
    1032             :         return credits;
    1033             : }
    1034             : 
    1035           0 : static int ext4_xattr_inode_update_ref(handle_t *handle, struct inode *ea_inode,
    1036             :                                        int ref_change)
    1037             : {
    1038           0 :         struct ext4_iloc iloc;
    1039           0 :         s64 ref_count;
    1040           0 :         int ret;
    1041             : 
    1042           0 :         inode_lock(ea_inode);
    1043             : 
    1044           0 :         ret = ext4_reserve_inode_write(handle, ea_inode, &iloc);
    1045           0 :         if (ret)
    1046           0 :                 goto out;
    1047             : 
    1048           0 :         ref_count = ext4_xattr_inode_get_ref(ea_inode);
    1049           0 :         ref_count += ref_change;
    1050           0 :         ext4_xattr_inode_set_ref(ea_inode, ref_count);
    1051             : 
    1052           0 :         if (ref_change > 0) {
    1053           0 :                 WARN_ONCE(ref_count <= 0, "EA inode %lu ref_count=%lld",
    1054             :                           ea_inode->i_ino, ref_count);
    1055             : 
    1056           0 :                 if (ref_count == 1) {
    1057           0 :                         WARN_ONCE(ea_inode->i_nlink, "EA inode %lu i_nlink=%u",
    1058             :                                   ea_inode->i_ino, ea_inode->i_nlink);
    1059             : 
    1060           0 :                         set_nlink(ea_inode, 1);
    1061           0 :                         ext4_orphan_del(handle, ea_inode);
    1062             :                 }
    1063             :         } else {
    1064           0 :                 WARN_ONCE(ref_count < 0, "EA inode %lu ref_count=%lld",
    1065             :                           ea_inode->i_ino, ref_count);
    1066             : 
    1067           0 :                 if (ref_count == 0) {
    1068           0 :                         WARN_ONCE(ea_inode->i_nlink != 1,
    1069             :                                   "EA inode %lu i_nlink=%u",
    1070             :                                   ea_inode->i_ino, ea_inode->i_nlink);
    1071             : 
    1072           0 :                         clear_nlink(ea_inode);
    1073           0 :                         ext4_orphan_add(handle, ea_inode);
    1074             :                 }
    1075             :         }
    1076             : 
    1077           0 :         ret = ext4_mark_iloc_dirty(handle, ea_inode, &iloc);
    1078           0 :         if (ret)
    1079           0 :                 ext4_warning_inode(ea_inode,
    1080             :                                    "ext4_mark_iloc_dirty() failed ret=%d", ret);
    1081           0 : out:
    1082           0 :         inode_unlock(ea_inode);
    1083           0 :         return ret;
    1084             : }
    1085             : 
    1086             : static int ext4_xattr_inode_inc_ref(handle_t *handle, struct inode *ea_inode)
    1087             : {
    1088           0 :         return ext4_xattr_inode_update_ref(handle, ea_inode, 1);
    1089             : }
    1090             : 
    1091             : static int ext4_xattr_inode_dec_ref(handle_t *handle, struct inode *ea_inode)
    1092             : {
    1093           0 :         return ext4_xattr_inode_update_ref(handle, ea_inode, -1);
    1094             : }
    1095             : 
    1096           0 : static int ext4_xattr_inode_inc_ref_all(handle_t *handle, struct inode *parent,
    1097             :                                         struct ext4_xattr_entry *first)
    1098             : {
    1099           0 :         struct inode *ea_inode;
    1100           0 :         struct ext4_xattr_entry *entry;
    1101           0 :         struct ext4_xattr_entry *failed_entry;
    1102           0 :         unsigned int ea_ino;
    1103           0 :         int err, saved_err;
    1104             : 
    1105           0 :         for (entry = first; !IS_LAST_ENTRY(entry);
    1106           0 :              entry = EXT4_XATTR_NEXT(entry)) {
    1107           0 :                 if (!entry->e_value_inum)
    1108           0 :                         continue;
    1109           0 :                 ea_ino = le32_to_cpu(entry->e_value_inum);
    1110           0 :                 err = ext4_xattr_inode_iget(parent, ea_ino,
    1111           0 :                                             le32_to_cpu(entry->e_hash),
    1112             :                                             &ea_inode);
    1113           0 :                 if (err)
    1114           0 :                         goto cleanup;
    1115           0 :                 err = ext4_xattr_inode_inc_ref(handle, ea_inode);
    1116           0 :                 if (err) {
    1117           0 :                         ext4_warning_inode(ea_inode, "inc ref error %d", err);
    1118           0 :                         iput(ea_inode);
    1119           0 :                         goto cleanup;
    1120             :                 }
    1121           0 :                 iput(ea_inode);
    1122             :         }
    1123             :         return 0;
    1124             : 
    1125           0 : cleanup:
    1126           0 :         saved_err = err;
    1127           0 :         failed_entry = entry;
    1128             : 
    1129           0 :         for (entry = first; entry != failed_entry;
    1130           0 :              entry = EXT4_XATTR_NEXT(entry)) {
    1131           0 :                 if (!entry->e_value_inum)
    1132           0 :                         continue;
    1133           0 :                 ea_ino = le32_to_cpu(entry->e_value_inum);
    1134           0 :                 err = ext4_xattr_inode_iget(parent, ea_ino,
    1135           0 :                                             le32_to_cpu(entry->e_hash),
    1136             :                                             &ea_inode);
    1137           0 :                 if (err) {
    1138           0 :                         ext4_warning(parent->i_sb,
    1139             :                                      "cleanup ea_ino %u iget error %d", ea_ino,
    1140             :                                      err);
    1141           0 :                         continue;
    1142             :                 }
    1143           0 :                 err = ext4_xattr_inode_dec_ref(handle, ea_inode);
    1144           0 :                 if (err)
    1145           0 :                         ext4_warning_inode(ea_inode, "cleanup dec ref error %d",
    1146             :                                            err);
    1147           0 :                 iput(ea_inode);
    1148             :         }
    1149             :         return saved_err;
    1150             : }
    1151             : 
    1152           0 : static int ext4_xattr_restart_fn(handle_t *handle, struct inode *inode,
    1153             :                         struct buffer_head *bh, bool block_csum, bool dirty)
    1154             : {
    1155           0 :         int error;
    1156             : 
    1157           0 :         if (bh && dirty) {
    1158           0 :                 if (block_csum)
    1159           0 :                         ext4_xattr_block_csum_set(inode, bh);
    1160           0 :                 error = ext4_handle_dirty_metadata(handle, NULL, bh);
    1161           0 :                 if (error) {
    1162           0 :                         ext4_warning(inode->i_sb, "Handle metadata (error %d)",
    1163             :                                      error);
    1164           0 :                         return error;
    1165             :                 }
    1166             :         }
    1167             :         return 0;
    1168             : }
    1169             : 
    1170             : static void
    1171           0 : ext4_xattr_inode_dec_ref_all(handle_t *handle, struct inode *parent,
    1172             :                              struct buffer_head *bh,
    1173             :                              struct ext4_xattr_entry *first, bool block_csum,
    1174             :                              struct ext4_xattr_inode_array **ea_inode_array,
    1175             :                              int extra_credits, bool skip_quota)
    1176             : {
    1177           0 :         struct inode *ea_inode;
    1178           0 :         struct ext4_xattr_entry *entry;
    1179           0 :         bool dirty = false;
    1180           0 :         unsigned int ea_ino;
    1181           0 :         int err;
    1182           0 :         int credits;
    1183             : 
    1184             :         /* One credit for dec ref on ea_inode, one for orphan list addition, */
    1185           0 :         credits = 2 + extra_credits;
    1186             : 
    1187           0 :         for (entry = first; !IS_LAST_ENTRY(entry);
    1188           0 :              entry = EXT4_XATTR_NEXT(entry)) {
    1189           0 :                 if (!entry->e_value_inum)
    1190           0 :                         continue;
    1191           0 :                 ea_ino = le32_to_cpu(entry->e_value_inum);
    1192           0 :                 err = ext4_xattr_inode_iget(parent, ea_ino,
    1193           0 :                                             le32_to_cpu(entry->e_hash),
    1194             :                                             &ea_inode);
    1195           0 :                 if (err)
    1196           0 :                         continue;
    1197             : 
    1198           0 :                 err = ext4_expand_inode_array(ea_inode_array, ea_inode);
    1199           0 :                 if (err) {
    1200           0 :                         ext4_warning_inode(ea_inode,
    1201             :                                            "Expand inode array err=%d", err);
    1202           0 :                         iput(ea_inode);
    1203           0 :                         continue;
    1204             :                 }
    1205             : 
    1206           0 :                 err = ext4_journal_ensure_credits_fn(handle, credits, credits,
    1207             :                         ext4_free_metadata_revoke_credits(parent->i_sb, 1),
    1208             :                         ext4_xattr_restart_fn(handle, parent, bh, block_csum,
    1209             :                                               dirty));
    1210           0 :                 if (err < 0) {
    1211           0 :                         ext4_warning_inode(ea_inode, "Ensure credits err=%d",
    1212             :                                            err);
    1213           0 :                         continue;
    1214             :                 }
    1215           0 :                 if (err > 0) {
    1216           0 :                         err = ext4_journal_get_write_access(handle,
    1217             :                                         parent->i_sb, bh, EXT4_JTR_NONE);
    1218           0 :                         if (err) {
    1219           0 :                                 ext4_warning_inode(ea_inode,
    1220             :                                                 "Re-get write access err=%d",
    1221             :                                                 err);
    1222           0 :                                 continue;
    1223             :                         }
    1224             :                 }
    1225             : 
    1226           0 :                 err = ext4_xattr_inode_dec_ref(handle, ea_inode);
    1227           0 :                 if (err) {
    1228           0 :                         ext4_warning_inode(ea_inode, "ea_inode dec ref err=%d",
    1229             :                                            err);
    1230           0 :                         continue;
    1231             :                 }
    1232             : 
    1233           0 :                 if (!skip_quota)
    1234           0 :                         ext4_xattr_inode_free_quota(parent, ea_inode,
    1235           0 :                                               le32_to_cpu(entry->e_value_size));
    1236             : 
    1237             :                 /*
    1238             :                  * Forget about ea_inode within the same transaction that
    1239             :                  * decrements the ref count. This avoids duplicate decrements in
    1240             :                  * case the rest of the work spills over to subsequent
    1241             :                  * transactions.
    1242             :                  */
    1243           0 :                 entry->e_value_inum = 0;
    1244           0 :                 entry->e_value_size = 0;
    1245             : 
    1246           0 :                 dirty = true;
    1247             :         }
    1248             : 
    1249           0 :         if (dirty) {
    1250             :                 /*
    1251             :                  * Note that we are deliberately skipping csum calculation for
    1252             :                  * the final update because we do not expect any journal
    1253             :                  * restarts until xattr block is freed.
    1254             :                  */
    1255             : 
    1256           0 :                 err = ext4_handle_dirty_metadata(handle, NULL, bh);
    1257           0 :                 if (err)
    1258           0 :                         ext4_warning_inode(parent,
    1259             :                                            "handle dirty metadata err=%d", err);
    1260             :         }
    1261           0 : }
    1262             : 
    1263             : /*
    1264             :  * Release the xattr block BH: If the reference count is > 1, decrement it;
    1265             :  * otherwise free the block.
    1266             :  */
    1267             : static void
    1268           0 : ext4_xattr_release_block(handle_t *handle, struct inode *inode,
    1269             :                          struct buffer_head *bh,
    1270             :                          struct ext4_xattr_inode_array **ea_inode_array,
    1271             :                          int extra_credits)
    1272             : {
    1273           0 :         struct mb_cache *ea_block_cache = EA_BLOCK_CACHE(inode);
    1274           0 :         u32 hash, ref;
    1275           0 :         int error = 0;
    1276             : 
    1277           0 :         BUFFER_TRACE(bh, "get_write_access");
    1278           0 :         error = ext4_journal_get_write_access(handle, inode->i_sb, bh,
    1279             :                                               EXT4_JTR_NONE);
    1280           0 :         if (error)
    1281           0 :                 goto out;
    1282             : 
    1283           0 : retry_ref:
    1284           0 :         lock_buffer(bh);
    1285           0 :         hash = le32_to_cpu(BHDR(bh)->h_hash);
    1286           0 :         ref = le32_to_cpu(BHDR(bh)->h_refcount);
    1287           0 :         if (ref == 1) {
    1288           0 :                 ea_bdebug(bh, "refcount now=0; freeing");
    1289             :                 /*
    1290             :                  * This must happen under buffer lock for
    1291             :                  * ext4_xattr_block_set() to reliably detect freed block
    1292             :                  */
    1293           0 :                 if (ea_block_cache) {
    1294           0 :                         struct mb_cache_entry *oe;
    1295             : 
    1296           0 :                         oe = mb_cache_entry_delete_or_get(ea_block_cache, hash,
    1297             :                                                           bh->b_blocknr);
    1298           0 :                         if (oe) {
    1299           0 :                                 unlock_buffer(bh);
    1300           0 :                                 mb_cache_entry_wait_unused(oe);
    1301           0 :                                 mb_cache_entry_put(ea_block_cache, oe);
    1302           0 :                                 goto retry_ref;
    1303             :                         }
    1304             :                 }
    1305           0 :                 get_bh(bh);
    1306           0 :                 unlock_buffer(bh);
    1307             : 
    1308           0 :                 if (ext4_has_feature_ea_inode(inode->i_sb))
    1309           0 :                         ext4_xattr_inode_dec_ref_all(handle, inode, bh,
    1310           0 :                                                      BFIRST(bh),
    1311             :                                                      true /* block_csum */,
    1312             :                                                      ea_inode_array,
    1313             :                                                      extra_credits,
    1314             :                                                      true /* skip_quota */);
    1315           0 :                 ext4_free_blocks(handle, inode, bh, 0, 1,
    1316             :                                  EXT4_FREE_BLOCKS_METADATA |
    1317             :                                  EXT4_FREE_BLOCKS_FORGET);
    1318             :         } else {
    1319           0 :                 ref--;
    1320           0 :                 BHDR(bh)->h_refcount = cpu_to_le32(ref);
    1321           0 :                 if (ref == EXT4_XATTR_REFCOUNT_MAX - 1) {
    1322           0 :                         struct mb_cache_entry *ce;
    1323             : 
    1324           0 :                         if (ea_block_cache) {
    1325           0 :                                 ce = mb_cache_entry_get(ea_block_cache, hash,
    1326             :                                                         bh->b_blocknr);
    1327           0 :                                 if (ce) {
    1328           0 :                                         set_bit(MBE_REUSABLE_B, &ce->e_flags);
    1329           0 :                                         mb_cache_entry_put(ea_block_cache, ce);
    1330             :                                 }
    1331             :                         }
    1332             :                 }
    1333             : 
    1334           0 :                 ext4_xattr_block_csum_set(inode, bh);
    1335             :                 /*
    1336             :                  * Beware of this ugliness: Releasing of xattr block references
    1337             :                  * from different inodes can race and so we have to protect
    1338             :                  * from a race where someone else frees the block (and releases
    1339             :                  * its journal_head) before we are done dirtying the buffer. In
    1340             :                  * nojournal mode this race is harmless and we actually cannot
    1341             :                  * call ext4_handle_dirty_metadata() with locked buffer as
    1342             :                  * that function can call sync_dirty_buffer() so for that case
    1343             :                  * we handle the dirtying after unlocking the buffer.
    1344             :                  */
    1345           0 :                 if (ext4_handle_valid(handle))
    1346           0 :                         error = ext4_handle_dirty_metadata(handle, inode, bh);
    1347           0 :                 unlock_buffer(bh);
    1348           0 :                 if (!ext4_handle_valid(handle))
    1349           0 :                         error = ext4_handle_dirty_metadata(handle, inode, bh);
    1350           0 :                 if (IS_SYNC(inode))
    1351           0 :                         ext4_handle_sync(handle);
    1352           0 :                 dquot_free_block(inode, EXT4_C2B(EXT4_SB(inode->i_sb), 1));
    1353           0 :                 ea_bdebug(bh, "refcount now=%d; releasing",
    1354             :                           le32_to_cpu(BHDR(bh)->h_refcount));
    1355             :         }
    1356           0 : out:
    1357           0 :         ext4_std_error(inode->i_sb, error);
    1358           0 :         return;
    1359             : }
    1360             : 
    1361             : /*
    1362             :  * Find the available free space for EAs. This also returns the total number of
    1363             :  * bytes used by EA entries.
    1364             :  */
    1365           0 : static size_t ext4_xattr_free_space(struct ext4_xattr_entry *last,
    1366             :                                     size_t *min_offs, void *base, int *total)
    1367             : {
    1368           0 :         for (; !IS_LAST_ENTRY(last); last = EXT4_XATTR_NEXT(last)) {
    1369           0 :                 if (!last->e_value_inum && last->e_value_size) {
    1370           0 :                         size_t offs = le16_to_cpu(last->e_value_offs);
    1371           0 :                         if (offs < *min_offs)
    1372           0 :                                 *min_offs = offs;
    1373             :                 }
    1374           0 :                 if (total)
    1375           0 :                         *total += EXT4_XATTR_LEN(last->e_name_len);
    1376             :         }
    1377           0 :         return (*min_offs - ((void *)last - base) - sizeof(__u32));
    1378             : }
    1379             : 
    1380             : /*
    1381             :  * Write the value of the EA in an inode.
    1382             :  */
    1383           0 : static int ext4_xattr_inode_write(handle_t *handle, struct inode *ea_inode,
    1384             :                                   const void *buf, int bufsize)
    1385             : {
    1386           0 :         struct buffer_head *bh = NULL;
    1387           0 :         unsigned long block = 0;
    1388           0 :         int blocksize = ea_inode->i_sb->s_blocksize;
    1389           0 :         int max_blocks = (bufsize + blocksize - 1) >> ea_inode->i_blkbits;
    1390           0 :         int csize, wsize = 0;
    1391           0 :         int ret = 0, ret2 = 0;
    1392           0 :         int retries = 0;
    1393             : 
    1394             : retry:
    1395           0 :         while (ret >= 0 && ret < max_blocks) {
    1396           0 :                 struct ext4_map_blocks map;
    1397           0 :                 map.m_lblk = block += ret;
    1398           0 :                 map.m_len = max_blocks -= ret;
    1399             : 
    1400           0 :                 ret = ext4_map_blocks(handle, ea_inode, &map,
    1401             :                                       EXT4_GET_BLOCKS_CREATE);
    1402           0 :                 if (ret <= 0) {
    1403           0 :                         ext4_mark_inode_dirty(handle, ea_inode);
    1404           0 :                         if (ret == -ENOSPC &&
    1405           0 :                             ext4_should_retry_alloc(ea_inode->i_sb, &retries)) {
    1406           0 :                                 ret = 0;
    1407           0 :                                 goto retry;
    1408             :                         }
    1409           0 :                         break;
    1410             :                 }
    1411             :         }
    1412             : 
    1413           0 :         if (ret < 0)
    1414             :                 return ret;
    1415             : 
    1416             :         block = 0;
    1417           0 :         while (wsize < bufsize) {
    1418           0 :                 brelse(bh);
    1419           0 :                 csize = (bufsize - wsize) > blocksize ? blocksize :
    1420             :                                                                 bufsize - wsize;
    1421           0 :                 bh = ext4_getblk(handle, ea_inode, block, 0);
    1422           0 :                 if (IS_ERR(bh))
    1423           0 :                         return PTR_ERR(bh);
    1424           0 :                 if (!bh) {
    1425           0 :                         WARN_ON_ONCE(1);
    1426           0 :                         EXT4_ERROR_INODE(ea_inode,
    1427             :                                          "ext4_getblk() return bh = NULL");
    1428           0 :                         return -EFSCORRUPTED;
    1429             :                 }
    1430           0 :                 ret = ext4_journal_get_write_access(handle, ea_inode->i_sb, bh,
    1431             :                                                    EXT4_JTR_NONE);
    1432           0 :                 if (ret)
    1433           0 :                         goto out;
    1434             : 
    1435           0 :                 memcpy(bh->b_data, buf, csize);
    1436           0 :                 set_buffer_uptodate(bh);
    1437           0 :                 ext4_handle_dirty_metadata(handle, ea_inode, bh);
    1438             : 
    1439           0 :                 buf += csize;
    1440           0 :                 wsize += csize;
    1441           0 :                 block += 1;
    1442             :         }
    1443             : 
    1444           0 :         inode_lock(ea_inode);
    1445           0 :         i_size_write(ea_inode, wsize);
    1446           0 :         ext4_update_i_disksize(ea_inode, wsize);
    1447           0 :         inode_unlock(ea_inode);
    1448             : 
    1449           0 :         ret2 = ext4_mark_inode_dirty(handle, ea_inode);
    1450           0 :         if (unlikely(ret2 && !ret))
    1451           0 :                 ret = ret2;
    1452             : 
    1453           0 : out:
    1454           0 :         brelse(bh);
    1455             : 
    1456             :         return ret;
    1457             : }
    1458             : 
    1459             : /*
    1460             :  * Create an inode to store the value of a large EA.
    1461             :  */
    1462           0 : static struct inode *ext4_xattr_inode_create(handle_t *handle,
    1463             :                                              struct inode *inode, u32 hash)
    1464             : {
    1465           0 :         struct inode *ea_inode = NULL;
    1466           0 :         uid_t owner[2] = { i_uid_read(inode), i_gid_read(inode) };
    1467           0 :         int err;
    1468             : 
    1469           0 :         if (inode->i_sb->s_root == NULL) {
    1470           0 :                 ext4_warning(inode->i_sb,
    1471             :                              "refuse to create EA inode when umounting");
    1472           0 :                 WARN_ON(1);
    1473           0 :                 return ERR_PTR(-EINVAL);
    1474             :         }
    1475             : 
    1476             :         /*
    1477             :          * Let the next inode be the goal, so we try and allocate the EA inode
    1478             :          * in the same group, or nearby one.
    1479             :          */
    1480           0 :         ea_inode = ext4_new_inode(handle, inode->i_sb->s_root->d_inode,
    1481             :                                   S_IFREG | 0600, NULL, inode->i_ino + 1, owner,
    1482             :                                   EXT4_EA_INODE_FL);
    1483           0 :         if (!IS_ERR(ea_inode)) {
    1484           0 :                 ea_inode->i_op = &ext4_file_inode_operations;
    1485           0 :                 ea_inode->i_fop = &ext4_file_operations;
    1486           0 :                 ext4_set_aops(ea_inode);
    1487           0 :                 ext4_xattr_inode_set_class(ea_inode);
    1488           0 :                 unlock_new_inode(ea_inode);
    1489           0 :                 ext4_xattr_inode_set_ref(ea_inode, 1);
    1490           0 :                 ext4_xattr_inode_set_hash(ea_inode, hash);
    1491           0 :                 err = ext4_mark_inode_dirty(handle, ea_inode);
    1492           0 :                 if (!err)
    1493           0 :                         err = ext4_inode_attach_jinode(ea_inode);
    1494           0 :                 if (err) {
    1495           0 :                         if (ext4_xattr_inode_dec_ref(handle, ea_inode))
    1496           0 :                                 ext4_warning_inode(ea_inode,
    1497             :                                         "cleanup dec ref error %d", err);
    1498           0 :                         iput(ea_inode);
    1499           0 :                         return ERR_PTR(err);
    1500             :                 }
    1501             : 
    1502             :                 /*
    1503             :                  * Xattr inodes are shared therefore quota charging is performed
    1504             :                  * at a higher level.
    1505             :                  */
    1506           0 :                 dquot_free_inode(ea_inode);
    1507           0 :                 dquot_drop(ea_inode);
    1508           0 :                 inode_lock(ea_inode);
    1509           0 :                 ea_inode->i_flags |= S_NOQUOTA;
    1510           0 :                 inode_unlock(ea_inode);
    1511             :         }
    1512             : 
    1513             :         return ea_inode;
    1514             : }
    1515             : 
    1516             : static struct inode *
    1517           0 : ext4_xattr_inode_cache_find(struct inode *inode, const void *value,
    1518             :                             size_t value_len, u32 hash)
    1519             : {
    1520           0 :         struct inode *ea_inode;
    1521           0 :         struct mb_cache_entry *ce;
    1522           0 :         struct mb_cache *ea_inode_cache = EA_INODE_CACHE(inode);
    1523           0 :         void *ea_data;
    1524             : 
    1525           0 :         if (!ea_inode_cache)
    1526             :                 return NULL;
    1527             : 
    1528           0 :         ce = mb_cache_entry_find_first(ea_inode_cache, hash);
    1529           0 :         if (!ce)
    1530             :                 return NULL;
    1531             : 
    1532           0 :         WARN_ON_ONCE(ext4_handle_valid(journal_current_handle()) &&
    1533             :                      !(current->flags & PF_MEMALLOC_NOFS));
    1534             : 
    1535           0 :         ea_data = kvmalloc(value_len, GFP_KERNEL);
    1536           0 :         if (!ea_data) {
    1537           0 :                 mb_cache_entry_put(ea_inode_cache, ce);
    1538           0 :                 return NULL;
    1539             :         }
    1540             : 
    1541           0 :         while (ce) {
    1542           0 :                 ea_inode = ext4_iget(inode->i_sb, ce->e_value,
    1543             :                                      EXT4_IGET_EA_INODE);
    1544           0 :                 if (IS_ERR(ea_inode))
    1545           0 :                         goto next_entry;
    1546           0 :                 ext4_xattr_inode_set_class(ea_inode);
    1547           0 :                 if (i_size_read(ea_inode) == value_len &&
    1548           0 :                     !ext4_xattr_inode_read(ea_inode, ea_data, value_len) &&
    1549           0 :                     !ext4_xattr_inode_verify_hashes(ea_inode, NULL, ea_data,
    1550           0 :                                                     value_len) &&
    1551             :                     !memcmp(value, ea_data, value_len)) {
    1552           0 :                         mb_cache_entry_touch(ea_inode_cache, ce);
    1553           0 :                         mb_cache_entry_put(ea_inode_cache, ce);
    1554           0 :                         kvfree(ea_data);
    1555           0 :                         return ea_inode;
    1556             :                 }
    1557           0 :                 iput(ea_inode);
    1558           0 :         next_entry:
    1559           0 :                 ce = mb_cache_entry_find_next(ea_inode_cache, ce);
    1560             :         }
    1561           0 :         kvfree(ea_data);
    1562           0 :         return NULL;
    1563             : }
    1564             : 
    1565             : /*
    1566             :  * Add value of the EA in an inode.
    1567             :  */
    1568           0 : static int ext4_xattr_inode_lookup_create(handle_t *handle, struct inode *inode,
    1569             :                                           const void *value, size_t value_len,
    1570             :                                           struct inode **ret_inode)
    1571             : {
    1572           0 :         struct inode *ea_inode;
    1573           0 :         u32 hash;
    1574           0 :         int err;
    1575             : 
    1576           0 :         hash = ext4_xattr_inode_hash(EXT4_SB(inode->i_sb), value, value_len);
    1577           0 :         ea_inode = ext4_xattr_inode_cache_find(inode, value, value_len, hash);
    1578           0 :         if (ea_inode) {
    1579           0 :                 err = ext4_xattr_inode_inc_ref(handle, ea_inode);
    1580           0 :                 if (err) {
    1581           0 :                         iput(ea_inode);
    1582           0 :                         return err;
    1583             :                 }
    1584             : 
    1585           0 :                 *ret_inode = ea_inode;
    1586           0 :                 return 0;
    1587             :         }
    1588             : 
    1589             :         /* Create an inode for the EA value */
    1590           0 :         ea_inode = ext4_xattr_inode_create(handle, inode, hash);
    1591           0 :         if (IS_ERR(ea_inode))
    1592           0 :                 return PTR_ERR(ea_inode);
    1593             : 
    1594           0 :         err = ext4_xattr_inode_write(handle, ea_inode, value, value_len);
    1595           0 :         if (err) {
    1596           0 :                 if (ext4_xattr_inode_dec_ref(handle, ea_inode))
    1597           0 :                         ext4_warning_inode(ea_inode, "cleanup dec ref error %d", err);
    1598           0 :                 iput(ea_inode);
    1599           0 :                 return err;
    1600             :         }
    1601             : 
    1602           0 :         if (EA_INODE_CACHE(inode))
    1603           0 :                 mb_cache_entry_create(EA_INODE_CACHE(inode), GFP_NOFS, hash,
    1604           0 :                                       ea_inode->i_ino, true /* reusable */);
    1605             : 
    1606           0 :         *ret_inode = ea_inode;
    1607           0 :         return 0;
    1608             : }
    1609             : 
    1610             : /*
    1611             :  * Reserve min(block_size/8, 1024) bytes for xattr entries/names if ea_inode
    1612             :  * feature is enabled.
    1613             :  */
    1614             : #define EXT4_XATTR_BLOCK_RESERVE(inode) min(i_blocksize(inode)/8, 1024U)
    1615             : 
    1616           0 : static int ext4_xattr_set_entry(struct ext4_xattr_info *i,
    1617             :                                 struct ext4_xattr_search *s,
    1618             :                                 handle_t *handle, struct inode *inode,
    1619             :                                 bool is_block)
    1620             : {
    1621           0 :         struct ext4_xattr_entry *last, *next;
    1622           0 :         struct ext4_xattr_entry *here = s->here;
    1623           0 :         size_t min_offs = s->end - s->base, name_len = strlen(i->name);
    1624           0 :         int in_inode = i->in_inode;
    1625           0 :         struct inode *old_ea_inode = NULL;
    1626           0 :         struct inode *new_ea_inode = NULL;
    1627           0 :         size_t old_size, new_size;
    1628           0 :         int ret;
    1629             : 
    1630             :         /* Space used by old and new values. */
    1631           0 :         old_size = (!s->not_found && !here->e_value_inum) ?
    1632           0 :                         EXT4_XATTR_SIZE(le32_to_cpu(here->e_value_size)) : 0;
    1633           0 :         new_size = (i->value && !in_inode) ? EXT4_XATTR_SIZE(i->value_len) : 0;
    1634             : 
    1635             :         /*
    1636             :          * Optimization for the simple case when old and new values have the
    1637             :          * same padded sizes. Not applicable if external inodes are involved.
    1638             :          */
    1639           0 :         if (new_size && new_size == old_size) {
    1640           0 :                 size_t offs = le16_to_cpu(here->e_value_offs);
    1641           0 :                 void *val = s->base + offs;
    1642             : 
    1643           0 :                 here->e_value_size = cpu_to_le32(i->value_len);
    1644           0 :                 if (i->value == EXT4_ZERO_XATTR_VALUE) {
    1645           0 :                         memset(val, 0, new_size);
    1646             :                 } else {
    1647           0 :                         memcpy(val, i->value, i->value_len);
    1648             :                         /* Clear padding bytes. */
    1649           0 :                         memset(val + i->value_len, 0, new_size - i->value_len);
    1650             :                 }
    1651           0 :                 goto update_hash;
    1652             :         }
    1653             : 
    1654             :         /* Compute min_offs and last. */
    1655           0 :         last = s->first;
    1656           0 :         for (; !IS_LAST_ENTRY(last); last = next) {
    1657           0 :                 next = EXT4_XATTR_NEXT(last);
    1658           0 :                 if ((void *)next >= s->end) {
    1659           0 :                         EXT4_ERROR_INODE(inode, "corrupted xattr entries");
    1660           0 :                         ret = -EFSCORRUPTED;
    1661           0 :                         goto out;
    1662             :                 }
    1663           0 :                 if (!last->e_value_inum && last->e_value_size) {
    1664           0 :                         size_t offs = le16_to_cpu(last->e_value_offs);
    1665           0 :                         if (offs < min_offs)
    1666             :                                 min_offs = offs;
    1667             :                 }
    1668             :         }
    1669             : 
    1670             :         /* Check whether we have enough space. */
    1671           0 :         if (i->value) {
    1672           0 :                 size_t free;
    1673             : 
    1674           0 :                 free = min_offs - ((void *)last - s->base) - sizeof(__u32);
    1675           0 :                 if (!s->not_found)
    1676           0 :                         free += EXT4_XATTR_LEN(name_len) + old_size;
    1677             : 
    1678           0 :                 if (free < EXT4_XATTR_LEN(name_len) + new_size) {
    1679           0 :                         ret = -ENOSPC;
    1680           0 :                         goto out;
    1681             :                 }
    1682             : 
    1683             :                 /*
    1684             :                  * If storing the value in an external inode is an option,
    1685             :                  * reserve space for xattr entries/names in the external
    1686             :                  * attribute block so that a long value does not occupy the
    1687             :                  * whole space and prevent further entries being added.
    1688             :                  */
    1689           0 :                 if (ext4_has_feature_ea_inode(inode->i_sb) &&
    1690           0 :                     new_size && is_block &&
    1691           0 :                     (min_offs + old_size - new_size) <
    1692           0 :                                         EXT4_XATTR_BLOCK_RESERVE(inode)) {
    1693           0 :                         ret = -ENOSPC;
    1694           0 :                         goto out;
    1695             :                 }
    1696             :         }
    1697             : 
    1698             :         /*
    1699             :          * Getting access to old and new ea inodes is subject to failures.
    1700             :          * Finish that work before doing any modifications to the xattr data.
    1701             :          */
    1702           0 :         if (!s->not_found && here->e_value_inum) {
    1703           0 :                 ret = ext4_xattr_inode_iget(inode,
    1704             :                                             le32_to_cpu(here->e_value_inum),
    1705           0 :                                             le32_to_cpu(here->e_hash),
    1706             :                                             &old_ea_inode);
    1707           0 :                 if (ret) {
    1708           0 :                         old_ea_inode = NULL;
    1709           0 :                         goto out;
    1710             :                 }
    1711             :         }
    1712           0 :         if (i->value && in_inode) {
    1713           0 :                 WARN_ON_ONCE(!i->value_len);
    1714             : 
    1715           0 :                 ret = ext4_xattr_inode_alloc_quota(inode, i->value_len);
    1716           0 :                 if (ret)
    1717           0 :                         goto out;
    1718             : 
    1719           0 :                 ret = ext4_xattr_inode_lookup_create(handle, inode, i->value,
    1720             :                                                      i->value_len,
    1721             :                                                      &new_ea_inode);
    1722           0 :                 if (ret) {
    1723           0 :                         new_ea_inode = NULL;
    1724           0 :                         ext4_xattr_inode_free_quota(inode, NULL, i->value_len);
    1725           0 :                         goto out;
    1726             :                 }
    1727             :         }
    1728             : 
    1729           0 :         if (old_ea_inode) {
    1730             :                 /* We are ready to release ref count on the old_ea_inode. */
    1731           0 :                 ret = ext4_xattr_inode_dec_ref(handle, old_ea_inode);
    1732           0 :                 if (ret) {
    1733             :                         /* Release newly required ref count on new_ea_inode. */
    1734           0 :                         if (new_ea_inode) {
    1735           0 :                                 int err;
    1736             : 
    1737           0 :                                 err = ext4_xattr_inode_dec_ref(handle,
    1738             :                                                                new_ea_inode);
    1739           0 :                                 if (err)
    1740           0 :                                         ext4_warning_inode(new_ea_inode,
    1741             :                                                   "dec ref new_ea_inode err=%d",
    1742             :                                                   err);
    1743           0 :                                 ext4_xattr_inode_free_quota(inode, new_ea_inode,
    1744             :                                                             i->value_len);
    1745             :                         }
    1746           0 :                         goto out;
    1747             :                 }
    1748             : 
    1749           0 :                 ext4_xattr_inode_free_quota(inode, old_ea_inode,
    1750           0 :                                             le32_to_cpu(here->e_value_size));
    1751             :         }
    1752             : 
    1753             :         /* No failures allowed past this point. */
    1754             : 
    1755           0 :         if (!s->not_found && here->e_value_size && !here->e_value_inum) {
    1756             :                 /* Remove the old value. */
    1757           0 :                 void *first_val = s->base + min_offs;
    1758           0 :                 size_t offs = le16_to_cpu(here->e_value_offs);
    1759           0 :                 void *val = s->base + offs;
    1760             : 
    1761           0 :                 memmove(first_val + old_size, first_val, val - first_val);
    1762           0 :                 memset(first_val, 0, old_size);
    1763           0 :                 min_offs += old_size;
    1764             : 
    1765             :                 /* Adjust all value offsets. */
    1766           0 :                 last = s->first;
    1767           0 :                 while (!IS_LAST_ENTRY(last)) {
    1768           0 :                         size_t o = le16_to_cpu(last->e_value_offs);
    1769             : 
    1770           0 :                         if (!last->e_value_inum &&
    1771           0 :                             last->e_value_size && o < offs)
    1772           0 :                                 last->e_value_offs = cpu_to_le16(o + old_size);
    1773           0 :                         last = EXT4_XATTR_NEXT(last);
    1774             :                 }
    1775             :         }
    1776             : 
    1777           0 :         if (!i->value) {
    1778             :                 /* Remove old name. */
    1779           0 :                 size_t size = EXT4_XATTR_LEN(name_len);
    1780             : 
    1781           0 :                 last = ENTRY((void *)last - size);
    1782           0 :                 memmove(here, (void *)here + size,
    1783             :                         (void *)last - (void *)here + sizeof(__u32));
    1784           0 :                 memset(last, 0, size);
    1785             : 
    1786             :                 /*
    1787             :                  * Update i_inline_off - moved ibody region might contain
    1788             :                  * system.data attribute.  Handling a failure here won't
    1789             :                  * cause other complications for setting an xattr.
    1790             :                  */
    1791           0 :                 if (!is_block && ext4_has_inline_data(inode)) {
    1792           0 :                         ret = ext4_find_inline_data_nolock(inode);
    1793           0 :                         if (ret) {
    1794           0 :                                 ext4_warning_inode(inode,
    1795             :                                         "unable to update i_inline_off");
    1796           0 :                                 goto out;
    1797             :                         }
    1798             :                 }
    1799           0 :         } else if (s->not_found) {
    1800             :                 /* Insert new name. */
    1801           0 :                 size_t size = EXT4_XATTR_LEN(name_len);
    1802           0 :                 size_t rest = (void *)last - (void *)here + sizeof(__u32);
    1803             : 
    1804           0 :                 memmove((void *)here + size, here, rest);
    1805           0 :                 memset(here, 0, size);
    1806           0 :                 here->e_name_index = i->name_index;
    1807           0 :                 here->e_name_len = name_len;
    1808           0 :                 memcpy(here->e_name, i->name, name_len);
    1809             :         } else {
    1810             :                 /* This is an update, reset value info. */
    1811           0 :                 here->e_value_inum = 0;
    1812           0 :                 here->e_value_offs = 0;
    1813           0 :                 here->e_value_size = 0;
    1814             :         }
    1815             : 
    1816           0 :         if (i->value) {
    1817             :                 /* Insert new value. */
    1818           0 :                 if (in_inode) {
    1819           0 :                         here->e_value_inum = cpu_to_le32(new_ea_inode->i_ino);
    1820           0 :                 } else if (i->value_len) {
    1821           0 :                         void *val = s->base + min_offs - new_size;
    1822             : 
    1823           0 :                         here->e_value_offs = cpu_to_le16(min_offs - new_size);
    1824           0 :                         if (i->value == EXT4_ZERO_XATTR_VALUE) {
    1825           0 :                                 memset(val, 0, new_size);
    1826             :                         } else {
    1827           0 :                                 memcpy(val, i->value, i->value_len);
    1828             :                                 /* Clear padding bytes. */
    1829           0 :                                 memset(val + i->value_len, 0,
    1830             :                                        new_size - i->value_len);
    1831             :                         }
    1832             :                 }
    1833           0 :                 here->e_value_size = cpu_to_le32(i->value_len);
    1834             :         }
    1835             : 
    1836           0 : update_hash:
    1837           0 :         if (i->value) {
    1838           0 :                 __le32 hash = 0;
    1839             : 
    1840             :                 /* Entry hash calculation. */
    1841           0 :                 if (in_inode) {
    1842           0 :                         __le32 crc32c_hash;
    1843             : 
    1844             :                         /*
    1845             :                          * Feed crc32c hash instead of the raw value for entry
    1846             :                          * hash calculation. This is to avoid walking
    1847             :                          * potentially long value buffer again.
    1848             :                          */
    1849           0 :                         crc32c_hash = cpu_to_le32(
    1850             :                                        ext4_xattr_inode_get_hash(new_ea_inode));
    1851           0 :                         hash = ext4_xattr_hash_entry(here->e_name,
    1852           0 :                                                      here->e_name_len,
    1853             :                                                      &crc32c_hash, 1);
    1854           0 :                 } else if (is_block) {
    1855           0 :                         __le32 *value = s->base + le16_to_cpu(
    1856             :                                                         here->e_value_offs);
    1857             : 
    1858           0 :                         hash = ext4_xattr_hash_entry(here->e_name,
    1859           0 :                                                      here->e_name_len, value,
    1860             :                                                      new_size >> 2);
    1861             :                 }
    1862           0 :                 here->e_hash = hash;
    1863             :         }
    1864             : 
    1865           0 :         if (is_block)
    1866           0 :                 ext4_xattr_rehash((struct ext4_xattr_header *)s->base);
    1867             : 
    1868             :         ret = 0;
    1869           0 : out:
    1870           0 :         iput(old_ea_inode);
    1871           0 :         iput(new_ea_inode);
    1872           0 :         return ret;
    1873             : }
    1874             : 
    1875             : struct ext4_xattr_block_find {
    1876             :         struct ext4_xattr_search s;
    1877             :         struct buffer_head *bh;
    1878             : };
    1879             : 
    1880             : static int
    1881           0 : ext4_xattr_block_find(struct inode *inode, struct ext4_xattr_info *i,
    1882             :                       struct ext4_xattr_block_find *bs)
    1883             : {
    1884           0 :         struct super_block *sb = inode->i_sb;
    1885           0 :         int error;
    1886             : 
    1887           0 :         ea_idebug(inode, "name=%d.%s, value=%p, value_len=%ld",
    1888             :                   i->name_index, i->name, i->value, (long)i->value_len);
    1889             : 
    1890           0 :         if (EXT4_I(inode)->i_file_acl) {
    1891             :                 /* The inode already has an extended attribute block. */
    1892           0 :                 bs->bh = ext4_sb_bread(sb, EXT4_I(inode)->i_file_acl, REQ_PRIO);
    1893           0 :                 if (IS_ERR(bs->bh)) {
    1894           0 :                         error = PTR_ERR(bs->bh);
    1895           0 :                         bs->bh = NULL;
    1896           0 :                         return error;
    1897             :                 }
    1898           0 :                 ea_bdebug(bs->bh, "b_count=%d, refcount=%d",
    1899             :                         atomic_read(&(bs->bh->b_count)),
    1900             :                         le32_to_cpu(BHDR(bs->bh)->h_refcount));
    1901           0 :                 error = ext4_xattr_check_block(inode, bs->bh);
    1902           0 :                 if (error)
    1903             :                         return error;
    1904             :                 /* Find the named attribute. */
    1905           0 :                 bs->s.base = BHDR(bs->bh);
    1906           0 :                 bs->s.first = BFIRST(bs->bh);
    1907           0 :                 bs->s.end = bs->bh->b_data + bs->bh->b_size;
    1908           0 :                 bs->s.here = bs->s.first;
    1909           0 :                 error = xattr_find_entry(inode, &bs->s.here, bs->s.end,
    1910             :                                          i->name_index, i->name, 1);
    1911           0 :                 if (error && error != -ENODATA)
    1912             :                         return error;
    1913           0 :                 bs->s.not_found = error;
    1914             :         }
    1915             :         return 0;
    1916             : }
    1917             : 
    1918             : static int
    1919           0 : ext4_xattr_block_set(handle_t *handle, struct inode *inode,
    1920             :                      struct ext4_xattr_info *i,
    1921             :                      struct ext4_xattr_block_find *bs)
    1922             : {
    1923           0 :         struct super_block *sb = inode->i_sb;
    1924           0 :         struct buffer_head *new_bh = NULL;
    1925           0 :         struct ext4_xattr_search s_copy = bs->s;
    1926           0 :         struct ext4_xattr_search *s = &s_copy;
    1927           0 :         struct mb_cache_entry *ce = NULL;
    1928           0 :         int error = 0;
    1929           0 :         struct mb_cache *ea_block_cache = EA_BLOCK_CACHE(inode);
    1930           0 :         struct inode *ea_inode = NULL, *tmp_inode;
    1931           0 :         size_t old_ea_inode_quota = 0;
    1932           0 :         unsigned int ea_ino;
    1933             : 
    1934             : 
    1935             : #define header(x) ((struct ext4_xattr_header *)(x))
    1936             : 
    1937           0 :         if (s->base) {
    1938           0 :                 int offset = (char *)s->here - bs->bh->b_data;
    1939             : 
    1940           0 :                 BUFFER_TRACE(bs->bh, "get_write_access");
    1941           0 :                 error = ext4_journal_get_write_access(handle, sb, bs->bh,
    1942             :                                                       EXT4_JTR_NONE);
    1943           0 :                 if (error)
    1944           0 :                         goto cleanup;
    1945           0 :                 lock_buffer(bs->bh);
    1946             : 
    1947           0 :                 if (header(s->base)->h_refcount == cpu_to_le32(1)) {
    1948           0 :                         __u32 hash = le32_to_cpu(BHDR(bs->bh)->h_hash);
    1949             : 
    1950             :                         /*
    1951             :                          * This must happen under buffer lock for
    1952             :                          * ext4_xattr_block_set() to reliably detect modified
    1953             :                          * block
    1954             :                          */
    1955           0 :                         if (ea_block_cache) {
    1956           0 :                                 struct mb_cache_entry *oe;
    1957             : 
    1958           0 :                                 oe = mb_cache_entry_delete_or_get(ea_block_cache,
    1959             :                                         hash, bs->bh->b_blocknr);
    1960           0 :                                 if (oe) {
    1961             :                                         /*
    1962             :                                          * Xattr block is getting reused. Leave
    1963             :                                          * it alone.
    1964             :                                          */
    1965           0 :                                         mb_cache_entry_put(ea_block_cache, oe);
    1966           0 :                                         goto clone_block;
    1967             :                                 }
    1968             :                         }
    1969           0 :                         ea_bdebug(bs->bh, "modifying in-place");
    1970           0 :                         error = ext4_xattr_set_entry(i, s, handle, inode,
    1971             :                                                      true /* is_block */);
    1972           0 :                         ext4_xattr_block_csum_set(inode, bs->bh);
    1973           0 :                         unlock_buffer(bs->bh);
    1974           0 :                         if (error == -EFSCORRUPTED)
    1975           0 :                                 goto bad_block;
    1976           0 :                         if (!error)
    1977           0 :                                 error = ext4_handle_dirty_metadata(handle,
    1978             :                                                                    inode,
    1979             :                                                                    bs->bh);
    1980           0 :                         if (error)
    1981           0 :                                 goto cleanup;
    1982           0 :                         goto inserted;
    1983             :                 }
    1984           0 : clone_block:
    1985           0 :                 unlock_buffer(bs->bh);
    1986           0 :                 ea_bdebug(bs->bh, "cloning");
    1987           0 :                 s->base = kmemdup(BHDR(bs->bh), bs->bh->b_size, GFP_NOFS);
    1988           0 :                 error = -ENOMEM;
    1989           0 :                 if (s->base == NULL)
    1990           0 :                         goto cleanup;
    1991           0 :                 s->first = ENTRY(header(s->base)+1);
    1992           0 :                 header(s->base)->h_refcount = cpu_to_le32(1);
    1993           0 :                 s->here = ENTRY(s->base + offset);
    1994           0 :                 s->end = s->base + bs->bh->b_size;
    1995             : 
    1996             :                 /*
    1997             :                  * If existing entry points to an xattr inode, we need
    1998             :                  * to prevent ext4_xattr_set_entry() from decrementing
    1999             :                  * ref count on it because the reference belongs to the
    2000             :                  * original block. In this case, make the entry look
    2001             :                  * like it has an empty value.
    2002             :                  */
    2003           0 :                 if (!s->not_found && s->here->e_value_inum) {
    2004           0 :                         ea_ino = le32_to_cpu(s->here->e_value_inum);
    2005           0 :                         error = ext4_xattr_inode_iget(inode, ea_ino,
    2006           0 :                                       le32_to_cpu(s->here->e_hash),
    2007             :                                       &tmp_inode);
    2008           0 :                         if (error)
    2009           0 :                                 goto cleanup;
    2010             : 
    2011           0 :                         if (!ext4_test_inode_state(tmp_inode,
    2012             :                                         EXT4_STATE_LUSTRE_EA_INODE)) {
    2013             :                                 /*
    2014             :                                  * Defer quota free call for previous
    2015             :                                  * inode until success is guaranteed.
    2016             :                                  */
    2017           0 :                                 old_ea_inode_quota = le32_to_cpu(
    2018             :                                                 s->here->e_value_size);
    2019             :                         }
    2020           0 :                         iput(tmp_inode);
    2021             : 
    2022           0 :                         s->here->e_value_inum = 0;
    2023           0 :                         s->here->e_value_size = 0;
    2024             :                 }
    2025             :         } else {
    2026             :                 /* Allocate a buffer where we construct the new block. */
    2027           0 :                 s->base = kzalloc(sb->s_blocksize, GFP_NOFS);
    2028           0 :                 error = -ENOMEM;
    2029           0 :                 if (s->base == NULL)
    2030           0 :                         goto cleanup;
    2031           0 :                 header(s->base)->h_magic = cpu_to_le32(EXT4_XATTR_MAGIC);
    2032           0 :                 header(s->base)->h_blocks = cpu_to_le32(1);
    2033           0 :                 header(s->base)->h_refcount = cpu_to_le32(1);
    2034           0 :                 s->first = ENTRY(header(s->base)+1);
    2035           0 :                 s->here = ENTRY(header(s->base)+1);
    2036           0 :                 s->end = s->base + sb->s_blocksize;
    2037             :         }
    2038             : 
    2039           0 :         error = ext4_xattr_set_entry(i, s, handle, inode, true /* is_block */);
    2040           0 :         if (error == -EFSCORRUPTED)
    2041           0 :                 goto bad_block;
    2042           0 :         if (error)
    2043           0 :                 goto cleanup;
    2044             : 
    2045           0 :         if (i->value && s->here->e_value_inum) {
    2046             :                 /*
    2047             :                  * A ref count on ea_inode has been taken as part of the call to
    2048             :                  * ext4_xattr_set_entry() above. We would like to drop this
    2049             :                  * extra ref but we have to wait until the xattr block is
    2050             :                  * initialized and has its own ref count on the ea_inode.
    2051             :                  */
    2052           0 :                 ea_ino = le32_to_cpu(s->here->e_value_inum);
    2053           0 :                 error = ext4_xattr_inode_iget(inode, ea_ino,
    2054           0 :                                               le32_to_cpu(s->here->e_hash),
    2055             :                                               &ea_inode);
    2056           0 :                 if (error) {
    2057           0 :                         ea_inode = NULL;
    2058           0 :                         goto cleanup;
    2059             :                 }
    2060             :         }
    2061             : 
    2062           0 : inserted:
    2063           0 :         if (!IS_LAST_ENTRY(s->first)) {
    2064           0 :                 new_bh = ext4_xattr_block_cache_find(inode, header(s->base),
    2065             :                                                      &ce);
    2066           0 :                 if (new_bh) {
    2067             :                         /* We found an identical block in the cache. */
    2068           0 :                         if (new_bh == bs->bh)
    2069             :                                 ea_bdebug(new_bh, "keeping");
    2070             :                         else {
    2071           0 :                                 u32 ref;
    2072             : 
    2073             : #ifdef EXT4_XATTR_DEBUG
    2074             :                                 WARN_ON_ONCE(dquot_initialize_needed(inode));
    2075             : #endif
    2076             :                                 /* The old block is released after updating
    2077             :                                    the inode. */
    2078           0 :                                 error = dquot_alloc_block(inode,
    2079           0 :                                                 EXT4_C2B(EXT4_SB(sb), 1));
    2080           0 :                                 if (error)
    2081           0 :                                         goto cleanup;
    2082           0 :                                 BUFFER_TRACE(new_bh, "get_write_access");
    2083           0 :                                 error = ext4_journal_get_write_access(
    2084             :                                                 handle, sb, new_bh,
    2085             :                                                 EXT4_JTR_NONE);
    2086           0 :                                 if (error)
    2087           0 :                                         goto cleanup_dquot;
    2088           0 :                                 lock_buffer(new_bh);
    2089             :                                 /*
    2090             :                                  * We have to be careful about races with
    2091             :                                  * adding references to xattr block. Once we
    2092             :                                  * hold buffer lock xattr block's state is
    2093             :                                  * stable so we can check the additional
    2094             :                                  * reference fits.
    2095             :                                  */
    2096           0 :                                 ref = le32_to_cpu(BHDR(new_bh)->h_refcount) + 1;
    2097           0 :                                 if (ref > EXT4_XATTR_REFCOUNT_MAX) {
    2098             :                                         /*
    2099             :                                          * Undo everything and check mbcache
    2100             :                                          * again.
    2101             :                                          */
    2102           0 :                                         unlock_buffer(new_bh);
    2103           0 :                                         dquot_free_block(inode,
    2104           0 :                                                          EXT4_C2B(EXT4_SB(sb),
    2105             :                                                                   1));
    2106           0 :                                         brelse(new_bh);
    2107           0 :                                         mb_cache_entry_put(ea_block_cache, ce);
    2108           0 :                                         ce = NULL;
    2109           0 :                                         new_bh = NULL;
    2110           0 :                                         goto inserted;
    2111             :                                 }
    2112           0 :                                 BHDR(new_bh)->h_refcount = cpu_to_le32(ref);
    2113           0 :                                 if (ref == EXT4_XATTR_REFCOUNT_MAX)
    2114           0 :                                         clear_bit(MBE_REUSABLE_B, &ce->e_flags);
    2115           0 :                                 ea_bdebug(new_bh, "reusing; refcount now=%d",
    2116             :                                           ref);
    2117           0 :                                 ext4_xattr_block_csum_set(inode, new_bh);
    2118           0 :                                 unlock_buffer(new_bh);
    2119           0 :                                 error = ext4_handle_dirty_metadata(handle,
    2120             :                                                                    inode,
    2121             :                                                                    new_bh);
    2122           0 :                                 if (error)
    2123           0 :                                         goto cleanup_dquot;
    2124             :                         }
    2125           0 :                         mb_cache_entry_touch(ea_block_cache, ce);
    2126           0 :                         mb_cache_entry_put(ea_block_cache, ce);
    2127           0 :                         ce = NULL;
    2128           0 :                 } else if (bs->bh && s->base == bs->bh->b_data) {
    2129             :                         /* We were modifying this block in-place. */
    2130           0 :                         ea_bdebug(bs->bh, "keeping this block");
    2131           0 :                         ext4_xattr_block_cache_insert(ea_block_cache, bs->bh);
    2132           0 :                         new_bh = bs->bh;
    2133           0 :                         get_bh(new_bh);
    2134             :                 } else {
    2135             :                         /* We need to allocate a new block */
    2136           0 :                         ext4_fsblk_t goal, block;
    2137             : 
    2138             : #ifdef EXT4_XATTR_DEBUG
    2139             :                         WARN_ON_ONCE(dquot_initialize_needed(inode));
    2140             : #endif
    2141           0 :                         goal = ext4_group_first_block_no(sb,
    2142             :                                                 EXT4_I(inode)->i_block_group);
    2143           0 :                         block = ext4_new_meta_blocks(handle, inode, goal, 0,
    2144             :                                                      NULL, &error);
    2145           0 :                         if (error)
    2146           0 :                                 goto cleanup;
    2147             : 
    2148           0 :                         ea_idebug(inode, "creating block %llu",
    2149             :                                   (unsigned long long)block);
    2150             : 
    2151           0 :                         new_bh = sb_getblk(sb, block);
    2152           0 :                         if (unlikely(!new_bh)) {
    2153           0 :                                 error = -ENOMEM;
    2154           0 : getblk_failed:
    2155           0 :                                 ext4_free_blocks(handle, inode, NULL, block, 1,
    2156             :                                                  EXT4_FREE_BLOCKS_METADATA);
    2157           0 :                                 goto cleanup;
    2158             :                         }
    2159           0 :                         error = ext4_xattr_inode_inc_ref_all(handle, inode,
    2160           0 :                                                       ENTRY(header(s->base)+1));
    2161           0 :                         if (error)
    2162           0 :                                 goto getblk_failed;
    2163           0 :                         if (ea_inode) {
    2164             :                                 /* Drop the extra ref on ea_inode. */
    2165           0 :                                 error = ext4_xattr_inode_dec_ref(handle,
    2166             :                                                                  ea_inode);
    2167           0 :                                 if (error)
    2168           0 :                                         ext4_warning_inode(ea_inode,
    2169             :                                                            "dec ref error=%d",
    2170             :                                                            error);
    2171           0 :                                 iput(ea_inode);
    2172           0 :                                 ea_inode = NULL;
    2173             :                         }
    2174             : 
    2175           0 :                         lock_buffer(new_bh);
    2176           0 :                         error = ext4_journal_get_create_access(handle, sb,
    2177             :                                                         new_bh, EXT4_JTR_NONE);
    2178           0 :                         if (error) {
    2179           0 :                                 unlock_buffer(new_bh);
    2180           0 :                                 error = -EIO;
    2181           0 :                                 goto getblk_failed;
    2182             :                         }
    2183           0 :                         memcpy(new_bh->b_data, s->base, new_bh->b_size);
    2184           0 :                         ext4_xattr_block_csum_set(inode, new_bh);
    2185           0 :                         set_buffer_uptodate(new_bh);
    2186           0 :                         unlock_buffer(new_bh);
    2187           0 :                         ext4_xattr_block_cache_insert(ea_block_cache, new_bh);
    2188           0 :                         error = ext4_handle_dirty_metadata(handle, inode,
    2189             :                                                            new_bh);
    2190           0 :                         if (error)
    2191           0 :                                 goto cleanup;
    2192             :                 }
    2193             :         }
    2194             : 
    2195           0 :         if (old_ea_inode_quota)
    2196           0 :                 ext4_xattr_inode_free_quota(inode, NULL, old_ea_inode_quota);
    2197             : 
    2198             :         /* Update the inode. */
    2199           0 :         EXT4_I(inode)->i_file_acl = new_bh ? new_bh->b_blocknr : 0;
    2200             : 
    2201             :         /* Drop the previous xattr block. */
    2202           0 :         if (bs->bh && bs->bh != new_bh) {
    2203           0 :                 struct ext4_xattr_inode_array *ea_inode_array = NULL;
    2204             : 
    2205           0 :                 ext4_xattr_release_block(handle, inode, bs->bh,
    2206             :                                          &ea_inode_array,
    2207             :                                          0 /* extra_credits */);
    2208           0 :                 ext4_xattr_inode_array_free(ea_inode_array);
    2209             :         }
    2210           0 :         error = 0;
    2211             : 
    2212           0 : cleanup:
    2213           0 :         if (ea_inode) {
    2214           0 :                 int error2;
    2215             : 
    2216           0 :                 error2 = ext4_xattr_inode_dec_ref(handle, ea_inode);
    2217           0 :                 if (error2)
    2218           0 :                         ext4_warning_inode(ea_inode, "dec ref error=%d",
    2219             :                                            error2);
    2220             : 
    2221             :                 /* If there was an error, revert the quota charge. */
    2222           0 :                 if (error)
    2223           0 :                         ext4_xattr_inode_free_quota(inode, ea_inode,
    2224             :                                                     i_size_read(ea_inode));
    2225           0 :                 iput(ea_inode);
    2226             :         }
    2227           0 :         if (ce)
    2228           0 :                 mb_cache_entry_put(ea_block_cache, ce);
    2229           0 :         brelse(new_bh);
    2230           0 :         if (!(bs->bh && s->base == bs->bh->b_data))
    2231           0 :                 kfree(s->base);
    2232             : 
    2233           0 :         return error;
    2234             : 
    2235           0 : cleanup_dquot:
    2236           0 :         dquot_free_block(inode, EXT4_C2B(EXT4_SB(sb), 1));
    2237           0 :         goto cleanup;
    2238             : 
    2239           0 : bad_block:
    2240           0 :         EXT4_ERROR_INODE(inode, "bad block %llu",
    2241             :                          EXT4_I(inode)->i_file_acl);
    2242           0 :         goto cleanup;
    2243             : 
    2244             : #undef header
    2245             : }
    2246             : 
    2247           0 : int ext4_xattr_ibody_find(struct inode *inode, struct ext4_xattr_info *i,
    2248             :                           struct ext4_xattr_ibody_find *is)
    2249             : {
    2250           0 :         struct ext4_xattr_ibody_header *header;
    2251           0 :         struct ext4_inode *raw_inode;
    2252           0 :         int error;
    2253             : 
    2254           0 :         if (!EXT4_INODE_HAS_XATTR_SPACE(inode))
    2255             :                 return 0;
    2256             : 
    2257           0 :         raw_inode = ext4_raw_inode(&is->iloc);
    2258           0 :         header = IHDR(inode, raw_inode);
    2259           0 :         is->s.base = is->s.first = IFIRST(header);
    2260           0 :         is->s.here = is->s.first;
    2261           0 :         is->s.end = (void *)raw_inode + EXT4_SB(inode->i_sb)->s_inode_size;
    2262           0 :         if (ext4_test_inode_state(inode, EXT4_STATE_XATTR)) {
    2263           0 :                 error = xattr_check_inode(inode, header, is->s.end);
    2264           0 :                 if (error)
    2265             :                         return error;
    2266             :                 /* Find the named attribute. */
    2267           0 :                 error = xattr_find_entry(inode, &is->s.here, is->s.end,
    2268             :                                          i->name_index, i->name, 0);
    2269           0 :                 if (error && error != -ENODATA)
    2270             :                         return error;
    2271           0 :                 is->s.not_found = error;
    2272             :         }
    2273             :         return 0;
    2274             : }
    2275             : 
    2276           0 : int ext4_xattr_ibody_set(handle_t *handle, struct inode *inode,
    2277             :                                 struct ext4_xattr_info *i,
    2278             :                                 struct ext4_xattr_ibody_find *is)
    2279             : {
    2280           0 :         struct ext4_xattr_ibody_header *header;
    2281           0 :         struct ext4_xattr_search *s = &is->s;
    2282           0 :         int error;
    2283             : 
    2284           0 :         if (!EXT4_INODE_HAS_XATTR_SPACE(inode))
    2285             :                 return -ENOSPC;
    2286             : 
    2287           0 :         error = ext4_xattr_set_entry(i, s, handle, inode, false /* is_block */);
    2288           0 :         if (error)
    2289             :                 return error;
    2290           0 :         header = IHDR(inode, ext4_raw_inode(&is->iloc));
    2291           0 :         if (!IS_LAST_ENTRY(s->first)) {
    2292           0 :                 header->h_magic = cpu_to_le32(EXT4_XATTR_MAGIC);
    2293           0 :                 ext4_set_inode_state(inode, EXT4_STATE_XATTR);
    2294             :         } else {
    2295           0 :                 header->h_magic = cpu_to_le32(0);
    2296           0 :                 ext4_clear_inode_state(inode, EXT4_STATE_XATTR);
    2297             :         }
    2298             :         return 0;
    2299             : }
    2300             : 
    2301           0 : static int ext4_xattr_value_same(struct ext4_xattr_search *s,
    2302             :                                  struct ext4_xattr_info *i)
    2303             : {
    2304           0 :         void *value;
    2305             : 
    2306             :         /* When e_value_inum is set the value is stored externally. */
    2307           0 :         if (s->here->e_value_inum)
    2308             :                 return 0;
    2309           0 :         if (le32_to_cpu(s->here->e_value_size) != i->value_len)
    2310             :                 return 0;
    2311           0 :         value = ((void *)s->base) + le16_to_cpu(s->here->e_value_offs);
    2312           0 :         return !memcmp(value, i->value, i->value_len);
    2313             : }
    2314             : 
    2315           0 : static struct buffer_head *ext4_xattr_get_block(struct inode *inode)
    2316             : {
    2317           0 :         struct buffer_head *bh;
    2318           0 :         int error;
    2319             : 
    2320           0 :         if (!EXT4_I(inode)->i_file_acl)
    2321             :                 return NULL;
    2322           0 :         bh = ext4_sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl, REQ_PRIO);
    2323           0 :         if (IS_ERR(bh))
    2324             :                 return bh;
    2325           0 :         error = ext4_xattr_check_block(inode, bh);
    2326           0 :         if (error) {
    2327           0 :                 brelse(bh);
    2328           0 :                 return ERR_PTR(error);
    2329             :         }
    2330             :         return bh;
    2331             : }
    2332             : 
    2333             : /*
    2334             :  * ext4_xattr_set_handle()
    2335             :  *
    2336             :  * Create, replace or remove an extended attribute for this inode.  Value
    2337             :  * is NULL to remove an existing extended attribute, and non-NULL to
    2338             :  * either replace an existing extended attribute, or create a new extended
    2339             :  * attribute. The flags XATTR_REPLACE and XATTR_CREATE
    2340             :  * specify that an extended attribute must exist and must not exist
    2341             :  * previous to the call, respectively.
    2342             :  *
    2343             :  * Returns 0, or a negative error number on failure.
    2344             :  */
    2345             : int
    2346           0 : ext4_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index,
    2347             :                       const char *name, const void *value, size_t value_len,
    2348             :                       int flags)
    2349             : {
    2350           0 :         struct ext4_xattr_info i = {
    2351             :                 .name_index = name_index,
    2352             :                 .name = name,
    2353             :                 .value = value,
    2354             :                 .value_len = value_len,
    2355             :                 .in_inode = 0,
    2356             :         };
    2357           0 :         struct ext4_xattr_ibody_find is = {
    2358             :                 .s = { .not_found = -ENODATA, },
    2359             :         };
    2360           0 :         struct ext4_xattr_block_find bs = {
    2361             :                 .s = { .not_found = -ENODATA, },
    2362             :         };
    2363           0 :         int no_expand;
    2364           0 :         int error;
    2365             : 
    2366           0 :         if (!name)
    2367             :                 return -EINVAL;
    2368           0 :         if (strlen(name) > 255)
    2369             :                 return -ERANGE;
    2370             : 
    2371           0 :         ext4_write_lock_xattr(inode, &no_expand);
    2372             : 
    2373             :         /* Check journal credits under write lock. */
    2374           0 :         if (ext4_handle_valid(handle)) {
    2375           0 :                 struct buffer_head *bh;
    2376           0 :                 int credits;
    2377             : 
    2378           0 :                 bh = ext4_xattr_get_block(inode);
    2379           0 :                 if (IS_ERR(bh)) {
    2380           0 :                         error = PTR_ERR(bh);
    2381           0 :                         goto cleanup;
    2382             :                 }
    2383             : 
    2384           0 :                 credits = __ext4_xattr_set_credits(inode->i_sb, inode, bh,
    2385             :                                                    value_len,
    2386             :                                                    flags & XATTR_CREATE);
    2387           0 :                 brelse(bh);
    2388             : 
    2389           0 :                 if (jbd2_handle_buffer_credits(handle) < credits) {
    2390           0 :                         error = -ENOSPC;
    2391           0 :                         goto cleanup;
    2392             :                 }
    2393           0 :                 WARN_ON_ONCE(!(current->flags & PF_MEMALLOC_NOFS));
    2394             :         }
    2395             : 
    2396           0 :         error = ext4_reserve_inode_write(handle, inode, &is.iloc);
    2397           0 :         if (error)
    2398           0 :                 goto cleanup;
    2399             : 
    2400           0 :         if (ext4_test_inode_state(inode, EXT4_STATE_NEW)) {
    2401           0 :                 struct ext4_inode *raw_inode = ext4_raw_inode(&is.iloc);
    2402           0 :                 memset(raw_inode, 0, EXT4_SB(inode->i_sb)->s_inode_size);
    2403           0 :                 ext4_clear_inode_state(inode, EXT4_STATE_NEW);
    2404             :         }
    2405             : 
    2406           0 :         error = ext4_xattr_ibody_find(inode, &i, &is);
    2407           0 :         if (error)
    2408           0 :                 goto cleanup;
    2409           0 :         if (is.s.not_found)
    2410           0 :                 error = ext4_xattr_block_find(inode, &i, &bs);
    2411           0 :         if (error)
    2412           0 :                 goto cleanup;
    2413           0 :         if (is.s.not_found && bs.s.not_found) {
    2414           0 :                 error = -ENODATA;
    2415           0 :                 if (flags & XATTR_REPLACE)
    2416           0 :                         goto cleanup;
    2417           0 :                 error = 0;
    2418           0 :                 if (!value)
    2419           0 :                         goto cleanup;
    2420             :         } else {
    2421           0 :                 error = -EEXIST;
    2422           0 :                 if (flags & XATTR_CREATE)
    2423           0 :                         goto cleanup;
    2424             :         }
    2425             : 
    2426           0 :         if (!value) {
    2427           0 :                 if (!is.s.not_found)
    2428           0 :                         error = ext4_xattr_ibody_set(handle, inode, &i, &is);
    2429           0 :                 else if (!bs.s.not_found)
    2430           0 :                         error = ext4_xattr_block_set(handle, inode, &i, &bs);
    2431             :         } else {
    2432           0 :                 error = 0;
    2433             :                 /* Xattr value did not change? Save us some work and bail out */
    2434           0 :                 if (!is.s.not_found && ext4_xattr_value_same(&is.s, &i))
    2435           0 :                         goto cleanup;
    2436           0 :                 if (!bs.s.not_found && ext4_xattr_value_same(&bs.s, &i))
    2437           0 :                         goto cleanup;
    2438             : 
    2439           0 :                 if (ext4_has_feature_ea_inode(inode->i_sb) &&
    2440           0 :                     (EXT4_XATTR_SIZE(i.value_len) >
    2441           0 :                         EXT4_XATTR_MIN_LARGE_EA_SIZE(inode->i_sb->s_blocksize)))
    2442           0 :                         i.in_inode = 1;
    2443           0 : retry_inode:
    2444           0 :                 error = ext4_xattr_ibody_set(handle, inode, &i, &is);
    2445           0 :                 if (!error && !bs.s.not_found) {
    2446           0 :                         i.value = NULL;
    2447           0 :                         error = ext4_xattr_block_set(handle, inode, &i, &bs);
    2448           0 :                 } else if (error == -ENOSPC) {
    2449           0 :                         if (EXT4_I(inode)->i_file_acl && !bs.s.base) {
    2450           0 :                                 brelse(bs.bh);
    2451           0 :                                 bs.bh = NULL;
    2452           0 :                                 error = ext4_xattr_block_find(inode, &i, &bs);
    2453           0 :                                 if (error)
    2454           0 :                                         goto cleanup;
    2455             :                         }
    2456           0 :                         error = ext4_xattr_block_set(handle, inode, &i, &bs);
    2457           0 :                         if (!error && !is.s.not_found) {
    2458           0 :                                 i.value = NULL;
    2459           0 :                                 error = ext4_xattr_ibody_set(handle, inode, &i,
    2460             :                                                              &is);
    2461           0 :                         } else if (error == -ENOSPC) {
    2462             :                                 /*
    2463             :                                  * Xattr does not fit in the block, store at
    2464             :                                  * external inode if possible.
    2465             :                                  */
    2466           0 :                                 if (ext4_has_feature_ea_inode(inode->i_sb) &&
    2467           0 :                                     i.value_len && !i.in_inode) {
    2468           0 :                                         i.in_inode = 1;
    2469           0 :                                         goto retry_inode;
    2470             :                                 }
    2471             :                         }
    2472             :                 }
    2473             :         }
    2474           0 :         if (!error) {
    2475           0 :                 ext4_xattr_update_super_block(handle, inode->i_sb);
    2476           0 :                 inode->i_ctime = current_time(inode);
    2477           0 :                 inode_inc_iversion(inode);
    2478           0 :                 if (!value)
    2479           0 :                         no_expand = 0;
    2480           0 :                 error = ext4_mark_iloc_dirty(handle, inode, &is.iloc);
    2481             :                 /*
    2482             :                  * The bh is consumed by ext4_mark_iloc_dirty, even with
    2483             :                  * error != 0.
    2484             :                  */
    2485           0 :                 is.iloc.bh = NULL;
    2486           0 :                 if (IS_SYNC(inode))
    2487           0 :                         ext4_handle_sync(handle);
    2488             :         }
    2489           0 :         ext4_fc_mark_ineligible(inode->i_sb, EXT4_FC_REASON_XATTR, handle);
    2490             : 
    2491           0 : cleanup:
    2492           0 :         brelse(is.iloc.bh);
    2493           0 :         brelse(bs.bh);
    2494           0 :         ext4_write_unlock_xattr(inode, &no_expand);
    2495           0 :         return error;
    2496             : }
    2497             : 
    2498           0 : int ext4_xattr_set_credits(struct inode *inode, size_t value_len,
    2499             :                            bool is_create, int *credits)
    2500             : {
    2501           0 :         struct buffer_head *bh;
    2502           0 :         int err;
    2503             : 
    2504           0 :         *credits = 0;
    2505             : 
    2506           0 :         if (!EXT4_SB(inode->i_sb)->s_journal)
    2507             :                 return 0;
    2508             : 
    2509           0 :         down_read(&EXT4_I(inode)->xattr_sem);
    2510             : 
    2511           0 :         bh = ext4_xattr_get_block(inode);
    2512           0 :         if (IS_ERR(bh)) {
    2513           0 :                 err = PTR_ERR(bh);
    2514             :         } else {
    2515           0 :                 *credits = __ext4_xattr_set_credits(inode->i_sb, inode, bh,
    2516             :                                                     value_len, is_create);
    2517           0 :                 brelse(bh);
    2518             :                 err = 0;
    2519             :         }
    2520             : 
    2521           0 :         up_read(&EXT4_I(inode)->xattr_sem);
    2522           0 :         return err;
    2523             : }
    2524             : 
    2525             : /*
    2526             :  * ext4_xattr_set()
    2527             :  *
    2528             :  * Like ext4_xattr_set_handle, but start from an inode. This extended
    2529             :  * attribute modification is a filesystem transaction by itself.
    2530             :  *
    2531             :  * Returns 0, or a negative error number on failure.
    2532             :  */
    2533             : int
    2534           0 : ext4_xattr_set(struct inode *inode, int name_index, const char *name,
    2535             :                const void *value, size_t value_len, int flags)
    2536             : {
    2537           0 :         handle_t *handle;
    2538           0 :         struct super_block *sb = inode->i_sb;
    2539           0 :         int error, retries = 0;
    2540           0 :         int credits;
    2541             : 
    2542           0 :         error = dquot_initialize(inode);
    2543           0 :         if (error)
    2544             :                 return error;
    2545             : 
    2546           0 : retry:
    2547           0 :         error = ext4_xattr_set_credits(inode, value_len, flags & XATTR_CREATE,
    2548             :                                        &credits);
    2549           0 :         if (error)
    2550           0 :                 return error;
    2551             : 
    2552           0 :         handle = ext4_journal_start(inode, EXT4_HT_XATTR, credits);
    2553           0 :         if (IS_ERR(handle)) {
    2554           0 :                 error = PTR_ERR(handle);
    2555             :         } else {
    2556           0 :                 int error2;
    2557             : 
    2558           0 :                 error = ext4_xattr_set_handle(handle, inode, name_index, name,
    2559             :                                               value, value_len, flags);
    2560           0 :                 error2 = ext4_journal_stop(handle);
    2561           0 :                 if (error == -ENOSPC &&
    2562           0 :                     ext4_should_retry_alloc(sb, &retries))
    2563           0 :                         goto retry;
    2564           0 :                 if (error == 0)
    2565           0 :                         error = error2;
    2566             :         }
    2567           0 :         ext4_fc_mark_ineligible(inode->i_sb, EXT4_FC_REASON_XATTR, NULL);
    2568             : 
    2569           0 :         return error;
    2570             : }
    2571             : 
    2572             : /*
    2573             :  * Shift the EA entries in the inode to create space for the increased
    2574             :  * i_extra_isize.
    2575             :  */
    2576           0 : static void ext4_xattr_shift_entries(struct ext4_xattr_entry *entry,
    2577             :                                      int value_offs_shift, void *to,
    2578             :                                      void *from, size_t n)
    2579             : {
    2580           0 :         struct ext4_xattr_entry *last = entry;
    2581           0 :         int new_offs;
    2582             : 
    2583             :         /* We always shift xattr headers further thus offsets get lower */
    2584           0 :         BUG_ON(value_offs_shift > 0);
    2585             : 
    2586             :         /* Adjust the value offsets of the entries */
    2587           0 :         for (; !IS_LAST_ENTRY(last); last = EXT4_XATTR_NEXT(last)) {
    2588           0 :                 if (!last->e_value_inum && last->e_value_size) {
    2589           0 :                         new_offs = le16_to_cpu(last->e_value_offs) +
    2590             :                                                         value_offs_shift;
    2591           0 :                         last->e_value_offs = cpu_to_le16(new_offs);
    2592             :                 }
    2593             :         }
    2594             :         /* Shift the entries by n bytes */
    2595           0 :         memmove(to, from, n);
    2596           0 : }
    2597             : 
    2598             : /*
    2599             :  * Move xattr pointed to by 'entry' from inode into external xattr block
    2600             :  */
    2601           0 : static int ext4_xattr_move_to_block(handle_t *handle, struct inode *inode,
    2602             :                                     struct ext4_inode *raw_inode,
    2603             :                                     struct ext4_xattr_entry *entry)
    2604             : {
    2605           0 :         struct ext4_xattr_ibody_find *is = NULL;
    2606           0 :         struct ext4_xattr_block_find *bs = NULL;
    2607           0 :         char *buffer = NULL, *b_entry_name = NULL;
    2608           0 :         size_t value_size = le32_to_cpu(entry->e_value_size);
    2609           0 :         struct ext4_xattr_info i = {
    2610             :                 .value = NULL,
    2611             :                 .value_len = 0,
    2612           0 :                 .name_index = entry->e_name_index,
    2613           0 :                 .in_inode = !!entry->e_value_inum,
    2614             :         };
    2615           0 :         struct ext4_xattr_ibody_header *header = IHDR(inode, raw_inode);
    2616           0 :         int needs_kvfree = 0;
    2617           0 :         int error;
    2618             : 
    2619           0 :         is = kzalloc(sizeof(struct ext4_xattr_ibody_find), GFP_NOFS);
    2620           0 :         bs = kzalloc(sizeof(struct ext4_xattr_block_find), GFP_NOFS);
    2621           0 :         b_entry_name = kmalloc(entry->e_name_len + 1, GFP_NOFS);
    2622           0 :         if (!is || !bs || !b_entry_name) {
    2623           0 :                 error = -ENOMEM;
    2624           0 :                 goto out;
    2625             :         }
    2626             : 
    2627           0 :         is->s.not_found = -ENODATA;
    2628           0 :         bs->s.not_found = -ENODATA;
    2629           0 :         is->iloc.bh = NULL;
    2630           0 :         bs->bh = NULL;
    2631             : 
    2632             :         /* Save the entry name and the entry value */
    2633           0 :         if (entry->e_value_inum) {
    2634           0 :                 buffer = kvmalloc(value_size, GFP_NOFS);
    2635           0 :                 if (!buffer) {
    2636           0 :                         error = -ENOMEM;
    2637           0 :                         goto out;
    2638             :                 }
    2639           0 :                 needs_kvfree = 1;
    2640           0 :                 error = ext4_xattr_inode_get(inode, entry, buffer, value_size);
    2641           0 :                 if (error)
    2642           0 :                         goto out;
    2643             :         } else {
    2644           0 :                 size_t value_offs = le16_to_cpu(entry->e_value_offs);
    2645           0 :                 buffer = (void *)IFIRST(header) + value_offs;
    2646             :         }
    2647             : 
    2648           0 :         memcpy(b_entry_name, entry->e_name, entry->e_name_len);
    2649           0 :         b_entry_name[entry->e_name_len] = '\0';
    2650           0 :         i.name = b_entry_name;
    2651             : 
    2652           0 :         error = ext4_get_inode_loc(inode, &is->iloc);
    2653           0 :         if (error)
    2654           0 :                 goto out;
    2655             : 
    2656           0 :         error = ext4_xattr_ibody_find(inode, &i, is);
    2657           0 :         if (error)
    2658           0 :                 goto out;
    2659             : 
    2660           0 :         i.value = buffer;
    2661           0 :         i.value_len = value_size;
    2662           0 :         error = ext4_xattr_block_find(inode, &i, bs);
    2663           0 :         if (error)
    2664           0 :                 goto out;
    2665             : 
    2666             :         /* Move ea entry from the inode into the block */
    2667           0 :         error = ext4_xattr_block_set(handle, inode, &i, bs);
    2668           0 :         if (error)
    2669           0 :                 goto out;
    2670             : 
    2671             :         /* Remove the chosen entry from the inode */
    2672           0 :         i.value = NULL;
    2673           0 :         i.value_len = 0;
    2674           0 :         error = ext4_xattr_ibody_set(handle, inode, &i, is);
    2675             : 
    2676           0 : out:
    2677           0 :         kfree(b_entry_name);
    2678           0 :         if (needs_kvfree && buffer)
    2679           0 :                 kvfree(buffer);
    2680           0 :         if (is)
    2681           0 :                 brelse(is->iloc.bh);
    2682           0 :         if (bs)
    2683           0 :                 brelse(bs->bh);
    2684           0 :         kfree(is);
    2685           0 :         kfree(bs);
    2686             : 
    2687           0 :         return error;
    2688             : }
    2689             : 
    2690           0 : static int ext4_xattr_make_inode_space(handle_t *handle, struct inode *inode,
    2691             :                                        struct ext4_inode *raw_inode,
    2692             :                                        int isize_diff, size_t ifree,
    2693             :                                        size_t bfree, int *total_ino)
    2694             : {
    2695           0 :         struct ext4_xattr_ibody_header *header = IHDR(inode, raw_inode);
    2696           0 :         struct ext4_xattr_entry *small_entry;
    2697           0 :         struct ext4_xattr_entry *entry;
    2698           0 :         struct ext4_xattr_entry *last;
    2699           0 :         unsigned int entry_size;        /* EA entry size */
    2700           0 :         unsigned int total_size;        /* EA entry size + value size */
    2701           0 :         unsigned int min_total_size;
    2702           0 :         int error;
    2703             : 
    2704           0 :         while (isize_diff > ifree) {
    2705           0 :                 entry = NULL;
    2706           0 :                 small_entry = NULL;
    2707           0 :                 min_total_size = ~0U;
    2708           0 :                 last = IFIRST(header);
    2709             :                 /* Find the entry best suited to be pushed into EA block */
    2710           0 :                 for (; !IS_LAST_ENTRY(last); last = EXT4_XATTR_NEXT(last)) {
    2711             :                         /* never move system.data out of the inode */
    2712           0 :                         if ((last->e_name_len == 4) &&
    2713           0 :                             (last->e_name_index == EXT4_XATTR_INDEX_SYSTEM) &&
    2714           0 :                             !memcmp(last->e_name, "data", 4))
    2715           0 :                                 continue;
    2716           0 :                         total_size = EXT4_XATTR_LEN(last->e_name_len);
    2717           0 :                         if (!last->e_value_inum)
    2718           0 :                                 total_size += EXT4_XATTR_SIZE(
    2719             :                                                le32_to_cpu(last->e_value_size));
    2720           0 :                         if (total_size <= bfree &&
    2721             :                             total_size < min_total_size) {
    2722           0 :                                 if (total_size + ifree < isize_diff) {
    2723             :                                         small_entry = last;
    2724             :                                 } else {
    2725           0 :                                         entry = last;
    2726           0 :                                         min_total_size = total_size;
    2727             :                                 }
    2728             :                         }
    2729             :                 }
    2730             : 
    2731           0 :                 if (entry == NULL) {
    2732           0 :                         if (small_entry == NULL)
    2733             :                                 return -ENOSPC;
    2734             :                         entry = small_entry;
    2735             :                 }
    2736             : 
    2737           0 :                 entry_size = EXT4_XATTR_LEN(entry->e_name_len);
    2738           0 :                 total_size = entry_size;
    2739           0 :                 if (!entry->e_value_inum)
    2740           0 :                         total_size += EXT4_XATTR_SIZE(
    2741             :                                               le32_to_cpu(entry->e_value_size));
    2742           0 :                 error = ext4_xattr_move_to_block(handle, inode, raw_inode,
    2743             :                                                  entry);
    2744           0 :                 if (error)
    2745           0 :                         return error;
    2746             : 
    2747           0 :                 *total_ino -= entry_size;
    2748           0 :                 ifree += total_size;
    2749           0 :                 bfree -= total_size;
    2750             :         }
    2751             : 
    2752             :         return 0;
    2753             : }
    2754             : 
    2755             : /*
    2756             :  * Expand an inode by new_extra_isize bytes when EAs are present.
    2757             :  * Returns 0 on success or negative error number on failure.
    2758             :  */
    2759           0 : int ext4_expand_extra_isize_ea(struct inode *inode, int new_extra_isize,
    2760             :                                struct ext4_inode *raw_inode, handle_t *handle)
    2761             : {
    2762           0 :         struct ext4_xattr_ibody_header *header;
    2763           0 :         struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
    2764           0 :         static unsigned int mnt_count;
    2765           0 :         size_t min_offs;
    2766           0 :         size_t ifree, bfree;
    2767           0 :         int total_ino;
    2768           0 :         void *base, *end;
    2769           0 :         int error = 0, tried_min_extra_isize = 0;
    2770           0 :         int s_min_extra_isize = le16_to_cpu(sbi->s_es->s_min_extra_isize);
    2771           0 :         int isize_diff; /* How much do we need to grow i_extra_isize */
    2772             : 
    2773             : retry:
    2774           0 :         isize_diff = new_extra_isize - EXT4_I(inode)->i_extra_isize;
    2775           0 :         if (EXT4_I(inode)->i_extra_isize >= new_extra_isize)
    2776             :                 return 0;
    2777             : 
    2778           0 :         header = IHDR(inode, raw_inode);
    2779             : 
    2780             :         /*
    2781             :          * Check if enough free space is available in the inode to shift the
    2782             :          * entries ahead by new_extra_isize.
    2783             :          */
    2784             : 
    2785           0 :         base = IFIRST(header);
    2786           0 :         end = (void *)raw_inode + EXT4_SB(inode->i_sb)->s_inode_size;
    2787           0 :         min_offs = end - base;
    2788           0 :         total_ino = sizeof(struct ext4_xattr_ibody_header) + sizeof(u32);
    2789             : 
    2790           0 :         error = xattr_check_inode(inode, header, end);
    2791           0 :         if (error)
    2792           0 :                 goto cleanup;
    2793             : 
    2794           0 :         ifree = ext4_xattr_free_space(base, &min_offs, base, &total_ino);
    2795           0 :         if (ifree >= isize_diff)
    2796           0 :                 goto shift;
    2797             : 
    2798             :         /*
    2799             :          * Enough free space isn't available in the inode, check if
    2800             :          * EA block can hold new_extra_isize bytes.
    2801             :          */
    2802           0 :         if (EXT4_I(inode)->i_file_acl) {
    2803           0 :                 struct buffer_head *bh;
    2804             : 
    2805           0 :                 bh = ext4_sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl, REQ_PRIO);
    2806           0 :                 if (IS_ERR(bh)) {
    2807           0 :                         error = PTR_ERR(bh);
    2808           0 :                         goto cleanup;
    2809             :                 }
    2810           0 :                 error = ext4_xattr_check_block(inode, bh);
    2811           0 :                 if (error) {
    2812           0 :                         brelse(bh);
    2813           0 :                         goto cleanup;
    2814             :                 }
    2815           0 :                 base = BHDR(bh);
    2816           0 :                 end = bh->b_data + bh->b_size;
    2817           0 :                 min_offs = end - base;
    2818           0 :                 bfree = ext4_xattr_free_space(BFIRST(bh), &min_offs, base,
    2819             :                                               NULL);
    2820           0 :                 brelse(bh);
    2821           0 :                 if (bfree + ifree < isize_diff) {
    2822           0 :                         if (!tried_min_extra_isize && s_min_extra_isize) {
    2823           0 :                                 tried_min_extra_isize++;
    2824           0 :                                 new_extra_isize = s_min_extra_isize;
    2825           0 :                                 goto retry;
    2826             :                         }
    2827           0 :                         error = -ENOSPC;
    2828           0 :                         goto cleanup;
    2829             :                 }
    2830             :         } else {
    2831           0 :                 bfree = inode->i_sb->s_blocksize;
    2832             :         }
    2833             : 
    2834           0 :         error = ext4_xattr_make_inode_space(handle, inode, raw_inode,
    2835             :                                             isize_diff, ifree, bfree,
    2836             :                                             &total_ino);
    2837           0 :         if (error) {
    2838           0 :                 if (error == -ENOSPC && !tried_min_extra_isize &&
    2839             :                     s_min_extra_isize) {
    2840           0 :                         tried_min_extra_isize++;
    2841           0 :                         new_extra_isize = s_min_extra_isize;
    2842           0 :                         goto retry;
    2843             :                 }
    2844           0 :                 goto cleanup;
    2845             :         }
    2846           0 : shift:
    2847             :         /* Adjust the offsets and shift the remaining entries ahead */
    2848           0 :         ext4_xattr_shift_entries(IFIRST(header), EXT4_I(inode)->i_extra_isize
    2849             :                         - new_extra_isize, (void *)raw_inode +
    2850           0 :                         EXT4_GOOD_OLD_INODE_SIZE + new_extra_isize,
    2851             :                         (void *)header, total_ino);
    2852           0 :         EXT4_I(inode)->i_extra_isize = new_extra_isize;
    2853             : 
    2854           0 :         if (ext4_has_inline_data(inode))
    2855           0 :                 error = ext4_find_inline_data_nolock(inode);
    2856             : 
    2857           0 : cleanup:
    2858           0 :         if (error && (mnt_count != le16_to_cpu(sbi->s_es->s_mnt_count))) {
    2859           0 :                 ext4_warning(inode->i_sb, "Unable to expand inode %lu. Delete some EAs or run e2fsck.",
    2860             :                              inode->i_ino);
    2861           0 :                 mnt_count = le16_to_cpu(sbi->s_es->s_mnt_count);
    2862             :         }
    2863             :         return error;
    2864             : }
    2865             : 
    2866             : #define EIA_INCR 16 /* must be 2^n */
    2867             : #define EIA_MASK (EIA_INCR - 1)
    2868             : 
    2869             : /* Add the large xattr @inode into @ea_inode_array for deferred iput().
    2870             :  * If @ea_inode_array is new or full it will be grown and the old
    2871             :  * contents copied over.
    2872             :  */
    2873             : static int
    2874           0 : ext4_expand_inode_array(struct ext4_xattr_inode_array **ea_inode_array,
    2875             :                         struct inode *inode)
    2876             : {
    2877           0 :         if (*ea_inode_array == NULL) {
    2878             :                 /*
    2879             :                  * Start with 15 inodes, so it fits into a power-of-two size.
    2880             :                  * If *ea_inode_array is NULL, this is essentially offsetof()
    2881             :                  */
    2882           0 :                 (*ea_inode_array) =
    2883             :                         kmalloc(offsetof(struct ext4_xattr_inode_array,
    2884             :                                          inodes[EIA_MASK]),
    2885             :                                 GFP_NOFS);
    2886           0 :                 if (*ea_inode_array == NULL)
    2887             :                         return -ENOMEM;
    2888           0 :                 (*ea_inode_array)->count = 0;
    2889           0 :         } else if (((*ea_inode_array)->count & EIA_MASK) == EIA_MASK) {
    2890             :                 /* expand the array once all 15 + n * 16 slots are full */
    2891           0 :                 struct ext4_xattr_inode_array *new_array = NULL;
    2892           0 :                 int count = (*ea_inode_array)->count;
    2893             : 
    2894             :                 /* if new_array is NULL, this is essentially offsetof() */
    2895           0 :                 new_array = kmalloc(
    2896           0 :                                 offsetof(struct ext4_xattr_inode_array,
    2897             :                                          inodes[count + EIA_INCR]),
    2898             :                                 GFP_NOFS);
    2899           0 :                 if (new_array == NULL)
    2900             :                         return -ENOMEM;
    2901           0 :                 memcpy(new_array, *ea_inode_array,
    2902             :                        offsetof(struct ext4_xattr_inode_array, inodes[count]));
    2903           0 :                 kfree(*ea_inode_array);
    2904           0 :                 *ea_inode_array = new_array;
    2905             :         }
    2906           0 :         (*ea_inode_array)->inodes[(*ea_inode_array)->count++] = inode;
    2907           0 :         return 0;
    2908             : }
    2909             : 
    2910             : /*
    2911             :  * ext4_xattr_delete_inode()
    2912             :  *
    2913             :  * Free extended attribute resources associated with this inode. Traverse
    2914             :  * all entries and decrement reference on any xattr inodes associated with this
    2915             :  * inode. This is called immediately before an inode is freed. We have exclusive
    2916             :  * access to the inode. If an orphan inode is deleted it will also release its
    2917             :  * references on xattr block and xattr inodes.
    2918             :  */
    2919           0 : int ext4_xattr_delete_inode(handle_t *handle, struct inode *inode,
    2920             :                             struct ext4_xattr_inode_array **ea_inode_array,
    2921             :                             int extra_credits)
    2922             : {
    2923           0 :         struct buffer_head *bh = NULL;
    2924           0 :         struct ext4_xattr_ibody_header *header;
    2925           0 :         struct ext4_iloc iloc = { .bh = NULL };
    2926           0 :         struct ext4_xattr_entry *entry;
    2927           0 :         struct inode *ea_inode;
    2928           0 :         int error;
    2929             : 
    2930           0 :         error = ext4_journal_ensure_credits(handle, extra_credits,
    2931             :                         ext4_free_metadata_revoke_credits(inode->i_sb, 1));
    2932           0 :         if (error < 0) {
    2933           0 :                 EXT4_ERROR_INODE(inode, "ensure credits (error %d)", error);
    2934           0 :                 goto cleanup;
    2935             :         }
    2936             : 
    2937           0 :         if (ext4_has_feature_ea_inode(inode->i_sb) &&
    2938             :             ext4_test_inode_state(inode, EXT4_STATE_XATTR)) {
    2939             : 
    2940           0 :                 error = ext4_get_inode_loc(inode, &iloc);
    2941           0 :                 if (error) {
    2942           0 :                         EXT4_ERROR_INODE(inode, "inode loc (error %d)", error);
    2943           0 :                         goto cleanup;
    2944             :                 }
    2945             : 
    2946           0 :                 error = ext4_journal_get_write_access(handle, inode->i_sb,
    2947             :                                                 iloc.bh, EXT4_JTR_NONE);
    2948           0 :                 if (error) {
    2949           0 :                         EXT4_ERROR_INODE(inode, "write access (error %d)",
    2950             :                                          error);
    2951           0 :                         goto cleanup;
    2952             :                 }
    2953             : 
    2954           0 :                 header = IHDR(inode, ext4_raw_inode(&iloc));
    2955           0 :                 if (header->h_magic == cpu_to_le32(EXT4_XATTR_MAGIC))
    2956           0 :                         ext4_xattr_inode_dec_ref_all(handle, inode, iloc.bh,
    2957           0 :                                                      IFIRST(header),
    2958             :                                                      false /* block_csum */,
    2959             :                                                      ea_inode_array,
    2960             :                                                      extra_credits,
    2961             :                                                      false /* skip_quota */);
    2962             :         }
    2963             : 
    2964           0 :         if (EXT4_I(inode)->i_file_acl) {
    2965           0 :                 bh = ext4_sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl, REQ_PRIO);
    2966           0 :                 if (IS_ERR(bh)) {
    2967           0 :                         error = PTR_ERR(bh);
    2968           0 :                         if (error == -EIO) {
    2969           0 :                                 EXT4_ERROR_INODE_ERR(inode, EIO,
    2970             :                                                      "block %llu read error",
    2971             :                                                      EXT4_I(inode)->i_file_acl);
    2972             :                         }
    2973           0 :                         bh = NULL;
    2974           0 :                         goto cleanup;
    2975             :                 }
    2976           0 :                 error = ext4_xattr_check_block(inode, bh);
    2977           0 :                 if (error)
    2978           0 :                         goto cleanup;
    2979             : 
    2980           0 :                 if (ext4_has_feature_ea_inode(inode->i_sb)) {
    2981           0 :                         for (entry = BFIRST(bh); !IS_LAST_ENTRY(entry);
    2982           0 :                              entry = EXT4_XATTR_NEXT(entry)) {
    2983           0 :                                 if (!entry->e_value_inum)
    2984           0 :                                         continue;
    2985           0 :                                 error = ext4_xattr_inode_iget(inode,
    2986             :                                               le32_to_cpu(entry->e_value_inum),
    2987           0 :                                               le32_to_cpu(entry->e_hash),
    2988             :                                               &ea_inode);
    2989           0 :                                 if (error)
    2990           0 :                                         continue;
    2991           0 :                                 ext4_xattr_inode_free_quota(inode, ea_inode,
    2992           0 :                                               le32_to_cpu(entry->e_value_size));
    2993           0 :                                 iput(ea_inode);
    2994             :                         }
    2995             : 
    2996             :                 }
    2997             : 
    2998           0 :                 ext4_xattr_release_block(handle, inode, bh, ea_inode_array,
    2999             :                                          extra_credits);
    3000             :                 /*
    3001             :                  * Update i_file_acl value in the same transaction that releases
    3002             :                  * block.
    3003             :                  */
    3004           0 :                 EXT4_I(inode)->i_file_acl = 0;
    3005           0 :                 error = ext4_mark_inode_dirty(handle, inode);
    3006           0 :                 if (error) {
    3007           0 :                         EXT4_ERROR_INODE(inode, "mark inode dirty (error %d)",
    3008             :                                          error);
    3009           0 :                         goto cleanup;
    3010             :                 }
    3011           0 :                 ext4_fc_mark_ineligible(inode->i_sb, EXT4_FC_REASON_XATTR, handle);
    3012             :         }
    3013             :         error = 0;
    3014           0 : cleanup:
    3015           0 :         brelse(iloc.bh);
    3016           0 :         brelse(bh);
    3017           0 :         return error;
    3018             : }
    3019             : 
    3020           0 : void ext4_xattr_inode_array_free(struct ext4_xattr_inode_array *ea_inode_array)
    3021             : {
    3022           0 :         int idx;
    3023             : 
    3024           0 :         if (ea_inode_array == NULL)
    3025             :                 return;
    3026             : 
    3027           0 :         for (idx = 0; idx < ea_inode_array->count; ++idx)
    3028           0 :                 iput(ea_inode_array->inodes[idx]);
    3029           0 :         kfree(ea_inode_array);
    3030             : }
    3031             : 
    3032             : /*
    3033             :  * ext4_xattr_block_cache_insert()
    3034             :  *
    3035             :  * Create a new entry in the extended attribute block cache, and insert
    3036             :  * it unless such an entry is already in the cache.
    3037             :  *
    3038             :  * Returns 0, or a negative error number on failure.
    3039             :  */
    3040             : static void
    3041           0 : ext4_xattr_block_cache_insert(struct mb_cache *ea_block_cache,
    3042             :                               struct buffer_head *bh)
    3043             : {
    3044           0 :         struct ext4_xattr_header *header = BHDR(bh);
    3045           0 :         __u32 hash = le32_to_cpu(header->h_hash);
    3046           0 :         int reusable = le32_to_cpu(header->h_refcount) <
    3047             :                        EXT4_XATTR_REFCOUNT_MAX;
    3048           0 :         int error;
    3049             : 
    3050           0 :         if (!ea_block_cache)
    3051             :                 return;
    3052           0 :         error = mb_cache_entry_create(ea_block_cache, GFP_NOFS, hash,
    3053             :                                       bh->b_blocknr, reusable);
    3054           0 :         if (error) {
    3055             :                 if (error == -EBUSY)
    3056             :                         ea_bdebug(bh, "already in cache");
    3057             :         } else
    3058             :                 ea_bdebug(bh, "inserting [%x]", (int)hash);
    3059             : }
    3060             : 
    3061             : /*
    3062             :  * ext4_xattr_cmp()
    3063             :  *
    3064             :  * Compare two extended attribute blocks for equality.
    3065             :  *
    3066             :  * Returns 0 if the blocks are equal, 1 if they differ, and
    3067             :  * a negative error number on errors.
    3068             :  */
    3069             : static int
    3070           0 : ext4_xattr_cmp(struct ext4_xattr_header *header1,
    3071             :                struct ext4_xattr_header *header2)
    3072             : {
    3073           0 :         struct ext4_xattr_entry *entry1, *entry2;
    3074             : 
    3075           0 :         entry1 = ENTRY(header1+1);
    3076           0 :         entry2 = ENTRY(header2+1);
    3077           0 :         while (!IS_LAST_ENTRY(entry1)) {
    3078           0 :                 if (IS_LAST_ENTRY(entry2))
    3079             :                         return 1;
    3080           0 :                 if (entry1->e_hash != entry2->e_hash ||
    3081           0 :                     entry1->e_name_index != entry2->e_name_index ||
    3082           0 :                     entry1->e_name_len != entry2->e_name_len ||
    3083           0 :                     entry1->e_value_size != entry2->e_value_size ||
    3084           0 :                     entry1->e_value_inum != entry2->e_value_inum ||
    3085           0 :                     memcmp(entry1->e_name, entry2->e_name, entry1->e_name_len))
    3086           0 :                         return 1;
    3087           0 :                 if (!entry1->e_value_inum &&
    3088           0 :                     memcmp((char *)header1 + le16_to_cpu(entry1->e_value_offs),
    3089           0 :                            (char *)header2 + le16_to_cpu(entry2->e_value_offs),
    3090           0 :                            le32_to_cpu(entry1->e_value_size)))
    3091             :                         return 1;
    3092             : 
    3093           0 :                 entry1 = EXT4_XATTR_NEXT(entry1);
    3094           0 :                 entry2 = EXT4_XATTR_NEXT(entry2);
    3095             :         }
    3096           0 :         if (!IS_LAST_ENTRY(entry2))
    3097           0 :                 return 1;
    3098             :         return 0;
    3099             : }
    3100             : 
    3101             : /*
    3102             :  * ext4_xattr_block_cache_find()
    3103             :  *
    3104             :  * Find an identical extended attribute block.
    3105             :  *
    3106             :  * Returns a pointer to the block found, or NULL if such a block was
    3107             :  * not found or an error occurred.
    3108             :  */
    3109             : static struct buffer_head *
    3110           0 : ext4_xattr_block_cache_find(struct inode *inode,
    3111             :                             struct ext4_xattr_header *header,
    3112             :                             struct mb_cache_entry **pce)
    3113             : {
    3114           0 :         __u32 hash = le32_to_cpu(header->h_hash);
    3115           0 :         struct mb_cache_entry *ce;
    3116           0 :         struct mb_cache *ea_block_cache = EA_BLOCK_CACHE(inode);
    3117             : 
    3118           0 :         if (!ea_block_cache)
    3119             :                 return NULL;
    3120           0 :         if (!header->h_hash)
    3121             :                 return NULL;  /* never share */
    3122           0 :         ea_idebug(inode, "looking for cached blocks [%x]", (int)hash);
    3123           0 :         ce = mb_cache_entry_find_first(ea_block_cache, hash);
    3124           0 :         while (ce) {
    3125           0 :                 struct buffer_head *bh;
    3126             : 
    3127           0 :                 bh = ext4_sb_bread(inode->i_sb, ce->e_value, REQ_PRIO);
    3128           0 :                 if (IS_ERR(bh)) {
    3129           0 :                         if (PTR_ERR(bh) == -ENOMEM)
    3130             :                                 return NULL;
    3131           0 :                         bh = NULL;
    3132           0 :                         EXT4_ERROR_INODE(inode, "block %lu read error",
    3133             :                                          (unsigned long)ce->e_value);
    3134           0 :                 } else if (ext4_xattr_cmp(header, BHDR(bh)) == 0) {
    3135           0 :                         *pce = ce;
    3136           0 :                         return bh;
    3137             :                 }
    3138           0 :                 brelse(bh);
    3139           0 :                 ce = mb_cache_entry_find_next(ea_block_cache, ce);
    3140             :         }
    3141             :         return NULL;
    3142             : }
    3143             : 
    3144             : #define NAME_HASH_SHIFT 5
    3145             : #define VALUE_HASH_SHIFT 16
    3146             : 
    3147             : /*
    3148             :  * ext4_xattr_hash_entry()
    3149             :  *
    3150             :  * Compute the hash of an extended attribute.
    3151             :  */
    3152           0 : static __le32 ext4_xattr_hash_entry(char *name, size_t name_len, __le32 *value,
    3153             :                                     size_t value_count)
    3154             : {
    3155           0 :         __u32 hash = 0;
    3156             : 
    3157           0 :         while (name_len--) {
    3158           0 :                 hash = (hash << NAME_HASH_SHIFT) ^
    3159             :                        (hash >> (8*sizeof(hash) - NAME_HASH_SHIFT)) ^
    3160           0 :                        (unsigned char)*name++;
    3161             :         }
    3162           0 :         while (value_count--) {
    3163           0 :                 hash = (hash << VALUE_HASH_SHIFT) ^
    3164             :                        (hash >> (8*sizeof(hash) - VALUE_HASH_SHIFT)) ^
    3165           0 :                        le32_to_cpu(*value++);
    3166             :         }
    3167           0 :         return cpu_to_le32(hash);
    3168             : }
    3169             : 
    3170             : /*
    3171             :  * ext4_xattr_hash_entry_signed()
    3172             :  *
    3173             :  * Compute the hash of an extended attribute incorrectly.
    3174             :  */
    3175           0 : static __le32 ext4_xattr_hash_entry_signed(char *name, size_t name_len, __le32 *value, size_t value_count)
    3176             : {
    3177           0 :         __u32 hash = 0;
    3178             : 
    3179           0 :         while (name_len--) {
    3180           0 :                 hash = (hash << NAME_HASH_SHIFT) ^
    3181             :                        (hash >> (8*sizeof(hash) - NAME_HASH_SHIFT)) ^
    3182           0 :                        (signed char)*name++;
    3183             :         }
    3184           0 :         while (value_count--) {
    3185           0 :                 hash = (hash << VALUE_HASH_SHIFT) ^
    3186             :                        (hash >> (8*sizeof(hash) - VALUE_HASH_SHIFT)) ^
    3187           0 :                        le32_to_cpu(*value++);
    3188             :         }
    3189           0 :         return cpu_to_le32(hash);
    3190             : }
    3191             : 
    3192             : #undef NAME_HASH_SHIFT
    3193             : #undef VALUE_HASH_SHIFT
    3194             : 
    3195             : #define BLOCK_HASH_SHIFT 16
    3196             : 
    3197             : /*
    3198             :  * ext4_xattr_rehash()
    3199             :  *
    3200             :  * Re-compute the extended attribute hash value after an entry has changed.
    3201             :  */
    3202           0 : static void ext4_xattr_rehash(struct ext4_xattr_header *header)
    3203             : {
    3204           0 :         struct ext4_xattr_entry *here;
    3205           0 :         __u32 hash = 0;
    3206             : 
    3207           0 :         here = ENTRY(header+1);
    3208           0 :         while (!IS_LAST_ENTRY(here)) {
    3209           0 :                 if (!here->e_hash) {
    3210             :                         /* Block is not shared if an entry's hash value == 0 */
    3211             :                         hash = 0;
    3212             :                         break;
    3213             :                 }
    3214           0 :                 hash = (hash << BLOCK_HASH_SHIFT) ^
    3215             :                        (hash >> (8*sizeof(hash) - BLOCK_HASH_SHIFT)) ^
    3216             :                        le32_to_cpu(here->e_hash);
    3217           0 :                 here = EXT4_XATTR_NEXT(here);
    3218             :         }
    3219           0 :         header->h_hash = cpu_to_le32(hash);
    3220           0 : }
    3221             : 
    3222             : #undef BLOCK_HASH_SHIFT
    3223             : 
    3224             : #define HASH_BUCKET_BITS        10
    3225             : 
    3226             : struct mb_cache *
    3227           0 : ext4_xattr_create_cache(void)
    3228             : {
    3229           0 :         return mb_cache_create(HASH_BUCKET_BITS);
    3230             : }
    3231             : 
    3232           0 : void ext4_xattr_destroy_cache(struct mb_cache *cache)
    3233             : {
    3234           0 :         if (cache)
    3235           0 :                 mb_cache_destroy(cache);
    3236           0 : }
    3237             : 

Generated by: LCOV version 1.14