Merge tag 'tty-4.21-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty
[linux-2.6-block.git] / fs / ext4 / xattr.c
index 7643d52c776c61188ca6ac4a7ddd18d303c96e47..86ed9c6862493eb676515ce61cf8d13c94ca4be3 100644 (file)
@@ -384,7 +384,7 @@ static int ext4_xattr_inode_iget(struct inode *parent, unsigned long ea_ino,
        struct inode *inode;
        int err;
 
-       inode = ext4_iget(parent->i_sb, ea_ino);
+       inode = ext4_iget(parent->i_sb, ea_ino, EXT4_IGET_NORMAL);
        if (IS_ERR(inode)) {
                err = PTR_ERR(inode);
                ext4_error(parent->i_sb,
@@ -522,14 +522,13 @@ ext4_xattr_block_get(struct inode *inode, int name_index, const char *name,
        ea_idebug(inode, "name=%d.%s, buffer=%p, buffer_size=%ld",
                  name_index, name, buffer, (long)buffer_size);
 
-       error = -ENODATA;
        if (!EXT4_I(inode)->i_file_acl)
-               goto cleanup;
+               return -ENODATA;
        ea_idebug(inode, "reading block %llu",
                  (unsigned long long)EXT4_I(inode)->i_file_acl);
-       bh = sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl);
-       if (!bh)
-               goto cleanup;
+       bh = ext4_sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl, REQ_PRIO);
+       if (IS_ERR(bh))
+               return PTR_ERR(bh);
        ea_bdebug(bh, "b_count=%d, refcount=%d",
                atomic_read(&(bh->b_count)), le32_to_cpu(BHDR(bh)->h_refcount));
        error = ext4_xattr_check_block(inode, bh);
@@ -696,26 +695,23 @@ ext4_xattr_block_list(struct dentry *dentry, char *buffer, size_t buffer_size)
        ea_idebug(inode, "buffer=%p, buffer_size=%ld",
                  buffer, (long)buffer_size);
 
-       error = 0;
        if (!EXT4_I(inode)->i_file_acl)
-               goto cleanup;
+               return 0;
        ea_idebug(inode, "reading block %llu",
                  (unsigned long long)EXT4_I(inode)->i_file_acl);
-       bh = sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl);
-       error = -EIO;
-       if (!bh)
-               goto cleanup;
+       bh = ext4_sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl, REQ_PRIO);
+       if (IS_ERR(bh))
+               return PTR_ERR(bh);
        ea_bdebug(bh, "b_count=%d, refcount=%d",
                atomic_read(&(bh->b_count)), le32_to_cpu(BHDR(bh)->h_refcount));
        error = ext4_xattr_check_block(inode, bh);
        if (error)
                goto cleanup;
        ext4_xattr_block_cache_insert(EA_BLOCK_CACHE(inode), bh);
-       error = ext4_xattr_list_entries(dentry, BFIRST(bh), buffer, buffer_size);
-
+       error = ext4_xattr_list_entries(dentry, BFIRST(bh), buffer,
+                                       buffer_size);
 cleanup:
        brelse(bh);
-
        return error;
 }
 
@@ -830,9 +826,9 @@ int ext4_get_inode_usage(struct inode *inode, qsize_t *usage)
        }
 
        if (EXT4_I(inode)->i_file_acl) {
-               bh = sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl);
-               if (!bh) {
-                       ret = -EIO;
+               bh = ext4_sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl, REQ_PRIO);
+               if (IS_ERR(bh)) {
+                       ret = PTR_ERR(bh);
                        goto out;
                }
 
@@ -1486,7 +1482,8 @@ ext4_xattr_inode_cache_find(struct inode *inode, const void *value,
        }
 
        while (ce) {
-               ea_inode = ext4_iget(inode->i_sb, ce->e_value);
+               ea_inode = ext4_iget(inode->i_sb, ce->e_value,
+                                    EXT4_IGET_NORMAL);
                if (!IS_ERR(ea_inode) &&
                    !is_bad_inode(ea_inode) &&
                    (EXT4_I(ea_inode)->i_flags & EXT4_EA_INODE_FL) &&
@@ -1821,16 +1818,15 @@ ext4_xattr_block_find(struct inode *inode, struct ext4_xattr_info *i,
 
        if (EXT4_I(inode)->i_file_acl) {
                /* The inode already has an extended attribute block. */
-               bs->bh = sb_bread(sb, EXT4_I(inode)->i_file_acl);
-               error = -EIO;
-               if (!bs->bh)
-                       goto cleanup;
+               bs->bh = ext4_sb_bread(sb, EXT4_I(inode)->i_file_acl, REQ_PRIO);
+               if (IS_ERR(bs->bh))
+                       return PTR_ERR(bs->bh);
                ea_bdebug(bs->bh, "b_count=%d, refcount=%d",
                        atomic_read(&(bs->bh->b_count)),
                        le32_to_cpu(BHDR(bs->bh)->h_refcount));
                error = ext4_xattr_check_block(inode, bs->bh);
                if (error)
-                       goto cleanup;
+                       return error;
                /* Find the named attribute. */
                bs->s.base = BHDR(bs->bh);
                bs->s.first = BFIRST(bs->bh);
@@ -1839,13 +1835,10 @@ ext4_xattr_block_find(struct inode *inode, struct ext4_xattr_info *i,
                error = xattr_find_entry(inode, &bs->s.here, bs->s.end,
                                         i->name_index, i->name, 1);
                if (error && error != -ENODATA)
-                       goto cleanup;
+                       return error;
                bs->s.not_found = error;
        }
-       error = 0;
-
-cleanup:
-       return error;
+       return 0;
 }
 
 static int
@@ -2274,9 +2267,9 @@ static struct buffer_head *ext4_xattr_get_block(struct inode *inode)
 
        if (!EXT4_I(inode)->i_file_acl)
                return NULL;
-       bh = sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl);
-       if (!bh)
-               return ERR_PTR(-EIO);
+       bh = ext4_sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl, REQ_PRIO);
+       if (IS_ERR(bh))
+               return bh;
        error = ext4_xattr_check_block(inode, bh);
        if (error) {
                brelse(bh);
@@ -2729,7 +2722,7 @@ retry:
        base = IFIRST(header);
        end = (void *)raw_inode + EXT4_SB(inode->i_sb)->s_inode_size;
        min_offs = end - base;
-       total_ino = sizeof(struct ext4_xattr_ibody_header);
+       total_ino = sizeof(struct ext4_xattr_ibody_header) + sizeof(u32);
 
        error = xattr_check_inode(inode, header, end);
        if (error)
@@ -2746,10 +2739,11 @@ retry:
        if (EXT4_I(inode)->i_file_acl) {
                struct buffer_head *bh;
 
-               bh = sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl);
-               error = -EIO;
-               if (!bh)
+               bh = ext4_sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl, REQ_PRIO);
+               if (IS_ERR(bh)) {
+                       error = PTR_ERR(bh);
                        goto cleanup;
+               }
                error = ext4_xattr_check_block(inode, bh);
                if (error) {
                        brelse(bh);
@@ -2903,11 +2897,12 @@ int ext4_xattr_delete_inode(handle_t *handle, struct inode *inode,
        }
 
        if (EXT4_I(inode)->i_file_acl) {
-               bh = sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl);
-               if (!bh) {
-                       EXT4_ERROR_INODE(inode, "block %llu read error",
-                                        EXT4_I(inode)->i_file_acl);
-                       error = -EIO;
+               bh = ext4_sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl, REQ_PRIO);
+               if (IS_ERR(bh)) {
+                       error = PTR_ERR(bh);
+                       if (error == -EIO)
+                               EXT4_ERROR_INODE(inode, "block %llu read error",
+                                                EXT4_I(inode)->i_file_acl);
                        goto cleanup;
                }
                error = ext4_xattr_check_block(inode, bh);
@@ -3060,8 +3055,10 @@ ext4_xattr_block_cache_find(struct inode *inode,
        while (ce) {
                struct buffer_head *bh;
 
-               bh = sb_bread(inode->i_sb, ce->e_value);
-               if (!bh) {
+               bh = ext4_sb_bread(inode->i_sb, ce->e_value, REQ_PRIO);
+               if (IS_ERR(bh)) {
+                       if (PTR_ERR(bh) == -ENOMEM)
+                               return NULL;
                        EXT4_ERROR_INODE(inode, "block %lu read error",
                                         (unsigned long)ce->e_value);
                } else if (ext4_xattr_cmp(header, BHDR(bh)) == 0) {