linux/fs/f2fs/xattr.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * fs/f2fs/xattr.c
   4 *
   5 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
   6 *             http://www.samsung.com/
   7 *
   8 * Portions of this code from linux/fs/ext2/xattr.c
   9 *
  10 * Copyright (C) 2001-2003 Andreas Gruenbacher <agruen@suse.de>
  11 *
  12 * Fix by Harrison Xing <harrison@mountainviewdata.com>.
  13 * Extended attributes for symlinks and special files added per
  14 *  suggestion of Luka Renko <luka.renko@hermes.si>.
  15 * xattr consolidation Copyright (c) 2004 James Morris <jmorris@redhat.com>,
  16 *  Red Hat Inc.
  17 */
  18#include <linux/rwsem.h>
  19#include <linux/f2fs_fs.h>
  20#include <linux/security.h>
  21#include <linux/posix_acl_xattr.h>
  22#include "f2fs.h"
  23#include "xattr.h"
  24
  25static int f2fs_xattr_generic_get(const struct xattr_handler *handler,
  26                struct dentry *unused, struct inode *inode,
  27                const char *name, void *buffer, size_t size)
  28{
  29        struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
  30
  31        switch (handler->flags) {
  32        case F2FS_XATTR_INDEX_USER:
  33                if (!test_opt(sbi, XATTR_USER))
  34                        return -EOPNOTSUPP;
  35                break;
  36        case F2FS_XATTR_INDEX_TRUSTED:
  37        case F2FS_XATTR_INDEX_SECURITY:
  38                break;
  39        default:
  40                return -EINVAL;
  41        }
  42        return f2fs_getxattr(inode, handler->flags, name,
  43                             buffer, size, NULL);
  44}
  45
  46static int f2fs_xattr_generic_set(const struct xattr_handler *handler,
  47                struct dentry *unused, struct inode *inode,
  48                const char *name, const void *value,
  49                size_t size, int flags)
  50{
  51        struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
  52
  53        switch (handler->flags) {
  54        case F2FS_XATTR_INDEX_USER:
  55                if (!test_opt(sbi, XATTR_USER))
  56                        return -EOPNOTSUPP;
  57                break;
  58        case F2FS_XATTR_INDEX_TRUSTED:
  59        case F2FS_XATTR_INDEX_SECURITY:
  60                break;
  61        default:
  62                return -EINVAL;
  63        }
  64        return f2fs_setxattr(inode, handler->flags, name,
  65                                        value, size, NULL, flags);
  66}
  67
  68static bool f2fs_xattr_user_list(struct dentry *dentry)
  69{
  70        struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb);
  71
  72        return test_opt(sbi, XATTR_USER);
  73}
  74
  75static bool f2fs_xattr_trusted_list(struct dentry *dentry)
  76{
  77        return capable(CAP_SYS_ADMIN);
  78}
  79
  80static int f2fs_xattr_advise_get(const struct xattr_handler *handler,
  81                struct dentry *unused, struct inode *inode,
  82                const char *name, void *buffer, size_t size)
  83{
  84        if (buffer)
  85                *((char *)buffer) = F2FS_I(inode)->i_advise;
  86        return sizeof(char);
  87}
  88
  89static int f2fs_xattr_advise_set(const struct xattr_handler *handler,
  90                struct dentry *unused, struct inode *inode,
  91                const char *name, const void *value,
  92                size_t size, int flags)
  93{
  94        unsigned char old_advise = F2FS_I(inode)->i_advise;
  95        unsigned char new_advise;
  96
  97        if (!inode_owner_or_capable(inode))
  98                return -EPERM;
  99        if (value == NULL)
 100                return -EINVAL;
 101
 102        new_advise = *(char *)value;
 103        if (new_advise & ~FADVISE_MODIFIABLE_BITS)
 104                return -EINVAL;
 105
 106        new_advise = new_advise & FADVISE_MODIFIABLE_BITS;
 107        new_advise |= old_advise & ~FADVISE_MODIFIABLE_BITS;
 108
 109        F2FS_I(inode)->i_advise = new_advise;
 110        f2fs_mark_inode_dirty_sync(inode, true);
 111        return 0;
 112}
 113
 114#ifdef CONFIG_F2FS_FS_SECURITY
 115static int f2fs_initxattrs(struct inode *inode, const struct xattr *xattr_array,
 116                void *page)
 117{
 118        const struct xattr *xattr;
 119        int err = 0;
 120
 121        for (xattr = xattr_array; xattr->name != NULL; xattr++) {
 122                err = f2fs_setxattr(inode, F2FS_XATTR_INDEX_SECURITY,
 123                                xattr->name, xattr->value,
 124                                xattr->value_len, (struct page *)page, 0);
 125                if (err < 0)
 126                        break;
 127        }
 128        return err;
 129}
 130
 131int f2fs_init_security(struct inode *inode, struct inode *dir,
 132                                const struct qstr *qstr, struct page *ipage)
 133{
 134        return security_inode_init_security(inode, dir, qstr,
 135                                &f2fs_initxattrs, ipage);
 136}
 137#endif
 138
 139const struct xattr_handler f2fs_xattr_user_handler = {
 140        .prefix = XATTR_USER_PREFIX,
 141        .flags  = F2FS_XATTR_INDEX_USER,
 142        .list   = f2fs_xattr_user_list,
 143        .get    = f2fs_xattr_generic_get,
 144        .set    = f2fs_xattr_generic_set,
 145};
 146
 147const struct xattr_handler f2fs_xattr_trusted_handler = {
 148        .prefix = XATTR_TRUSTED_PREFIX,
 149        .flags  = F2FS_XATTR_INDEX_TRUSTED,
 150        .list   = f2fs_xattr_trusted_list,
 151        .get    = f2fs_xattr_generic_get,
 152        .set    = f2fs_xattr_generic_set,
 153};
 154
 155const struct xattr_handler f2fs_xattr_advise_handler = {
 156        .name   = F2FS_SYSTEM_ADVISE_NAME,
 157        .flags  = F2FS_XATTR_INDEX_ADVISE,
 158        .get    = f2fs_xattr_advise_get,
 159        .set    = f2fs_xattr_advise_set,
 160};
 161
 162const struct xattr_handler f2fs_xattr_security_handler = {
 163        .prefix = XATTR_SECURITY_PREFIX,
 164        .flags  = F2FS_XATTR_INDEX_SECURITY,
 165        .get    = f2fs_xattr_generic_get,
 166        .set    = f2fs_xattr_generic_set,
 167};
 168
 169static const struct xattr_handler *f2fs_xattr_handler_map[] = {
 170        [F2FS_XATTR_INDEX_USER] = &f2fs_xattr_user_handler,
 171#ifdef CONFIG_F2FS_FS_POSIX_ACL
 172        [F2FS_XATTR_INDEX_POSIX_ACL_ACCESS] = &posix_acl_access_xattr_handler,
 173        [F2FS_XATTR_INDEX_POSIX_ACL_DEFAULT] = &posix_acl_default_xattr_handler,
 174#endif
 175        [F2FS_XATTR_INDEX_TRUSTED] = &f2fs_xattr_trusted_handler,
 176#ifdef CONFIG_F2FS_FS_SECURITY
 177        [F2FS_XATTR_INDEX_SECURITY] = &f2fs_xattr_security_handler,
 178#endif
 179        [F2FS_XATTR_INDEX_ADVISE] = &f2fs_xattr_advise_handler,
 180};
 181
 182const struct xattr_handler *f2fs_xattr_handlers[] = {
 183        &f2fs_xattr_user_handler,
 184#ifdef CONFIG_F2FS_FS_POSIX_ACL
 185        &posix_acl_access_xattr_handler,
 186        &posix_acl_default_xattr_handler,
 187#endif
 188        &f2fs_xattr_trusted_handler,
 189#ifdef CONFIG_F2FS_FS_SECURITY
 190        &f2fs_xattr_security_handler,
 191#endif
 192        &f2fs_xattr_advise_handler,
 193        NULL,
 194};
 195
 196static inline const struct xattr_handler *f2fs_xattr_handler(int index)
 197{
 198        const struct xattr_handler *handler = NULL;
 199
 200        if (index > 0 && index < ARRAY_SIZE(f2fs_xattr_handler_map))
 201                handler = f2fs_xattr_handler_map[index];
 202        return handler;
 203}
 204
 205static struct f2fs_xattr_entry *__find_xattr(void *base_addr,
 206                                void *last_base_addr, int index,
 207                                size_t len, const char *name)
 208{
 209        struct f2fs_xattr_entry *entry;
 210
 211        list_for_each_xattr(entry, base_addr) {
 212                if ((void *)(entry) + sizeof(__u32) > last_base_addr ||
 213                        (void *)XATTR_NEXT_ENTRY(entry) > last_base_addr)
 214                        return NULL;
 215
 216                if (entry->e_name_index != index)
 217                        continue;
 218                if (entry->e_name_len != len)
 219                        continue;
 220                if (!memcmp(entry->e_name, name, len))
 221                        break;
 222        }
 223        return entry;
 224}
 225
 226static struct f2fs_xattr_entry *__find_inline_xattr(struct inode *inode,
 227                                void *base_addr, void **last_addr, int index,
 228                                size_t len, const char *name)
 229{
 230        struct f2fs_xattr_entry *entry;
 231        unsigned int inline_size = inline_xattr_size(inode);
 232        void *max_addr = base_addr + inline_size;
 233
 234        list_for_each_xattr(entry, base_addr) {
 235                if ((void *)entry + sizeof(__u32) > max_addr ||
 236                        (void *)XATTR_NEXT_ENTRY(entry) > max_addr) {
 237                        *last_addr = entry;
 238                        return NULL;
 239                }
 240                if (entry->e_name_index != index)
 241                        continue;
 242                if (entry->e_name_len != len)
 243                        continue;
 244                if (!memcmp(entry->e_name, name, len))
 245                        break;
 246        }
 247
 248        /* inline xattr header or entry across max inline xattr size */
 249        if (IS_XATTR_LAST_ENTRY(entry) &&
 250                (void *)entry + sizeof(__u32) > max_addr) {
 251                *last_addr = entry;
 252                return NULL;
 253        }
 254        return entry;
 255}
 256
 257static int read_inline_xattr(struct inode *inode, struct page *ipage,
 258                                                        void *txattr_addr)
 259{
 260        struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
 261        unsigned int inline_size = inline_xattr_size(inode);
 262        struct page *page = NULL;
 263        void *inline_addr;
 264
 265        if (ipage) {
 266                inline_addr = inline_xattr_addr(inode, ipage);
 267        } else {
 268                page = f2fs_get_node_page(sbi, inode->i_ino);
 269                if (IS_ERR(page))
 270                        return PTR_ERR(page);
 271
 272                inline_addr = inline_xattr_addr(inode, page);
 273        }
 274        memcpy(txattr_addr, inline_addr, inline_size);
 275        f2fs_put_page(page, 1);
 276
 277        return 0;
 278}
 279
 280static int read_xattr_block(struct inode *inode, void *txattr_addr)
 281{
 282        struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
 283        nid_t xnid = F2FS_I(inode)->i_xattr_nid;
 284        unsigned int inline_size = inline_xattr_size(inode);
 285        struct page *xpage;
 286        void *xattr_addr;
 287
 288        /* The inode already has an extended attribute block. */
 289        xpage = f2fs_get_node_page(sbi, xnid);
 290        if (IS_ERR(xpage))
 291                return PTR_ERR(xpage);
 292
 293        xattr_addr = page_address(xpage);
 294        memcpy(txattr_addr + inline_size, xattr_addr, VALID_XATTR_BLOCK_SIZE);
 295        f2fs_put_page(xpage, 1);
 296
 297        return 0;
 298}
 299
 300static int lookup_all_xattrs(struct inode *inode, struct page *ipage,
 301                                unsigned int index, unsigned int len,
 302                                const char *name, struct f2fs_xattr_entry **xe,
 303                                void **base_addr, int *base_size)
 304{
 305        void *cur_addr, *txattr_addr, *last_txattr_addr;
 306        void *last_addr = NULL;
 307        nid_t xnid = F2FS_I(inode)->i_xattr_nid;
 308        unsigned int inline_size = inline_xattr_size(inode);
 309        int err = 0;
 310
 311        if (!xnid && !inline_size)
 312                return -ENODATA;
 313
 314        *base_size = XATTR_SIZE(xnid, inode) + XATTR_PADDING_SIZE;
 315        txattr_addr = f2fs_kzalloc(F2FS_I_SB(inode), *base_size, GFP_NOFS);
 316        if (!txattr_addr)
 317                return -ENOMEM;
 318
 319        last_txattr_addr = (void *)txattr_addr + XATTR_SIZE(xnid, inode);
 320
 321        /* read from inline xattr */
 322        if (inline_size) {
 323                err = read_inline_xattr(inode, ipage, txattr_addr);
 324                if (err)
 325                        goto out;
 326
 327                *xe = __find_inline_xattr(inode, txattr_addr, &last_addr,
 328                                                index, len, name);
 329                if (*xe) {
 330                        *base_size = inline_size;
 331                        goto check;
 332                }
 333        }
 334
 335        /* read from xattr node block */
 336        if (xnid) {
 337                err = read_xattr_block(inode, txattr_addr);
 338                if (err)
 339                        goto out;
 340        }
 341
 342        if (last_addr)
 343                cur_addr = XATTR_HDR(last_addr) - 1;
 344        else
 345                cur_addr = txattr_addr;
 346
 347        *xe = __find_xattr(cur_addr, last_txattr_addr, index, len, name);
 348        if (!*xe) {
 349                err = -EFAULT;
 350                goto out;
 351        }
 352check:
 353        if (IS_XATTR_LAST_ENTRY(*xe)) {
 354                err = -ENODATA;
 355                goto out;
 356        }
 357
 358        *base_addr = txattr_addr;
 359        return 0;
 360out:
 361        kvfree(txattr_addr);
 362        return err;
 363}
 364
 365static int read_all_xattrs(struct inode *inode, struct page *ipage,
 366                                                        void **base_addr)
 367{
 368        struct f2fs_xattr_header *header;
 369        nid_t xnid = F2FS_I(inode)->i_xattr_nid;
 370        unsigned int size = VALID_XATTR_BLOCK_SIZE;
 371        unsigned int inline_size = inline_xattr_size(inode);
 372        void *txattr_addr;
 373        int err;
 374
 375        txattr_addr = f2fs_kzalloc(F2FS_I_SB(inode),
 376                        inline_size + size + XATTR_PADDING_SIZE, GFP_NOFS);
 377        if (!txattr_addr)
 378                return -ENOMEM;
 379
 380        /* read from inline xattr */
 381        if (inline_size) {
 382                err = read_inline_xattr(inode, ipage, txattr_addr);
 383                if (err)
 384                        goto fail;
 385        }
 386
 387        /* read from xattr node block */
 388        if (xnid) {
 389                err = read_xattr_block(inode, txattr_addr);
 390                if (err)
 391                        goto fail;
 392        }
 393
 394        header = XATTR_HDR(txattr_addr);
 395
 396        /* never been allocated xattrs */
 397        if (le32_to_cpu(header->h_magic) != F2FS_XATTR_MAGIC) {
 398                header->h_magic = cpu_to_le32(F2FS_XATTR_MAGIC);
 399                header->h_refcount = cpu_to_le32(1);
 400        }
 401        *base_addr = txattr_addr;
 402        return 0;
 403fail:
 404        kvfree(txattr_addr);
 405        return err;
 406}
 407
 408static inline int write_all_xattrs(struct inode *inode, __u32 hsize,
 409                                void *txattr_addr, struct page *ipage)
 410{
 411        struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
 412        size_t inline_size = inline_xattr_size(inode);
 413        struct page *in_page = NULL;
 414        void *xattr_addr;
 415        void *inline_addr = NULL;
 416        struct page *xpage;
 417        nid_t new_nid = 0;
 418        int err = 0;
 419
 420        if (hsize > inline_size && !F2FS_I(inode)->i_xattr_nid)
 421                if (!f2fs_alloc_nid(sbi, &new_nid))
 422                        return -ENOSPC;
 423
 424        /* write to inline xattr */
 425        if (inline_size) {
 426                if (ipage) {
 427                        inline_addr = inline_xattr_addr(inode, ipage);
 428                } else {
 429                        in_page = f2fs_get_node_page(sbi, inode->i_ino);
 430                        if (IS_ERR(in_page)) {
 431                                f2fs_alloc_nid_failed(sbi, new_nid);
 432                                return PTR_ERR(in_page);
 433                        }
 434                        inline_addr = inline_xattr_addr(inode, in_page);
 435                }
 436
 437                f2fs_wait_on_page_writeback(ipage ? ipage : in_page,
 438                                                        NODE, true, true);
 439                /* no need to use xattr node block */
 440                if (hsize <= inline_size) {
 441                        err = f2fs_truncate_xattr_node(inode);
 442                        f2fs_alloc_nid_failed(sbi, new_nid);
 443                        if (err) {
 444                                f2fs_put_page(in_page, 1);
 445                                return err;
 446                        }
 447                        memcpy(inline_addr, txattr_addr, inline_size);
 448                        set_page_dirty(ipage ? ipage : in_page);
 449                        goto in_page_out;
 450                }
 451        }
 452
 453        /* write to xattr node block */
 454        if (F2FS_I(inode)->i_xattr_nid) {
 455                xpage = f2fs_get_node_page(sbi, F2FS_I(inode)->i_xattr_nid);
 456                if (IS_ERR(xpage)) {
 457                        err = PTR_ERR(xpage);
 458                        f2fs_alloc_nid_failed(sbi, new_nid);
 459                        goto in_page_out;
 460                }
 461                f2fs_bug_on(sbi, new_nid);
 462                f2fs_wait_on_page_writeback(xpage, NODE, true, true);
 463        } else {
 464                struct dnode_of_data dn;
 465                set_new_dnode(&dn, inode, NULL, NULL, new_nid);
 466                xpage = f2fs_new_node_page(&dn, XATTR_NODE_OFFSET);
 467                if (IS_ERR(xpage)) {
 468                        err = PTR_ERR(xpage);
 469                        f2fs_alloc_nid_failed(sbi, new_nid);
 470                        goto in_page_out;
 471                }
 472                f2fs_alloc_nid_done(sbi, new_nid);
 473        }
 474        xattr_addr = page_address(xpage);
 475
 476        if (inline_size)
 477                memcpy(inline_addr, txattr_addr, inline_size);
 478        memcpy(xattr_addr, txattr_addr + inline_size, VALID_XATTR_BLOCK_SIZE);
 479
 480        if (inline_size)
 481                set_page_dirty(ipage ? ipage : in_page);
 482        set_page_dirty(xpage);
 483
 484        f2fs_put_page(xpage, 1);
 485in_page_out:
 486        f2fs_put_page(in_page, 1);
 487        return err;
 488}
 489
 490int f2fs_getxattr(struct inode *inode, int index, const char *name,
 491                void *buffer, size_t buffer_size, struct page *ipage)
 492{
 493        struct f2fs_xattr_entry *entry = NULL;
 494        int error = 0;
 495        unsigned int size, len;
 496        void *base_addr = NULL;
 497        int base_size;
 498
 499        if (name == NULL)
 500                return -EINVAL;
 501
 502        len = strlen(name);
 503        if (len > F2FS_NAME_LEN)
 504                return -ERANGE;
 505
 506        down_read(&F2FS_I(inode)->i_xattr_sem);
 507        error = lookup_all_xattrs(inode, ipage, index, len, name,
 508                                &entry, &base_addr, &base_size);
 509        up_read(&F2FS_I(inode)->i_xattr_sem);
 510        if (error)
 511                return error;
 512
 513        size = le16_to_cpu(entry->e_value_size);
 514
 515        if (buffer && size > buffer_size) {
 516                error = -ERANGE;
 517                goto out;
 518        }
 519
 520        if (buffer) {
 521                char *pval = entry->e_name + entry->e_name_len;
 522
 523                if (base_size - (pval - (char *)base_addr) < size) {
 524                        error = -ERANGE;
 525                        goto out;
 526                }
 527                memcpy(buffer, pval, size);
 528        }
 529        error = size;
 530out:
 531        kvfree(base_addr);
 532        return error;
 533}
 534
 535ssize_t f2fs_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size)
 536{
 537        struct inode *inode = d_inode(dentry);
 538        struct f2fs_xattr_entry *entry;
 539        void *base_addr;
 540        int error = 0;
 541        size_t rest = buffer_size;
 542
 543        down_read(&F2FS_I(inode)->i_xattr_sem);
 544        error = read_all_xattrs(inode, NULL, &base_addr);
 545        up_read(&F2FS_I(inode)->i_xattr_sem);
 546        if (error)
 547                return error;
 548
 549        list_for_each_xattr(entry, base_addr) {
 550                const struct xattr_handler *handler =
 551                        f2fs_xattr_handler(entry->e_name_index);
 552                const char *prefix;
 553                size_t prefix_len;
 554                size_t size;
 555
 556                if (!handler || (handler->list && !handler->list(dentry)))
 557                        continue;
 558
 559                prefix = xattr_prefix(handler);
 560                prefix_len = strlen(prefix);
 561                size = prefix_len + entry->e_name_len + 1;
 562                if (buffer) {
 563                        if (size > rest) {
 564                                error = -ERANGE;
 565                                goto cleanup;
 566                        }
 567                        memcpy(buffer, prefix, prefix_len);
 568                        buffer += prefix_len;
 569                        memcpy(buffer, entry->e_name, entry->e_name_len);
 570                        buffer += entry->e_name_len;
 571                        *buffer++ = 0;
 572                }
 573                rest -= size;
 574        }
 575        error = buffer_size - rest;
 576cleanup:
 577        kvfree(base_addr);
 578        return error;
 579}
 580
 581static bool f2fs_xattr_value_same(struct f2fs_xattr_entry *entry,
 582                                        const void *value, size_t size)
 583{
 584        void *pval = entry->e_name + entry->e_name_len;
 585
 586        return (le16_to_cpu(entry->e_value_size) == size) &&
 587                                        !memcmp(pval, value, size);
 588}
 589
 590static int __f2fs_setxattr(struct inode *inode, int index,
 591                        const char *name, const void *value, size_t size,
 592                        struct page *ipage, int flags)
 593{
 594        struct f2fs_xattr_entry *here, *last;
 595        void *base_addr, *last_base_addr;
 596        nid_t xnid = F2FS_I(inode)->i_xattr_nid;
 597        int found, newsize;
 598        size_t len;
 599        __u32 new_hsize;
 600        int error = 0;
 601
 602        if (name == NULL)
 603                return -EINVAL;
 604
 605        if (value == NULL)
 606                size = 0;
 607
 608        len = strlen(name);
 609
 610        if (len > F2FS_NAME_LEN)
 611                return -ERANGE;
 612
 613        if (size > MAX_VALUE_LEN(inode))
 614                return -E2BIG;
 615
 616        error = read_all_xattrs(inode, ipage, &base_addr);
 617        if (error)
 618                return error;
 619
 620        last_base_addr = (void *)base_addr + XATTR_SIZE(xnid, inode);
 621
 622        /* find entry with wanted name. */
 623        here = __find_xattr(base_addr, last_base_addr, index, len, name);
 624        if (!here) {
 625                error = -EFAULT;
 626                goto exit;
 627        }
 628
 629        found = IS_XATTR_LAST_ENTRY(here) ? 0 : 1;
 630
 631        if (found) {
 632                if ((flags & XATTR_CREATE)) {
 633                        error = -EEXIST;
 634                        goto exit;
 635                }
 636
 637                if (value && f2fs_xattr_value_same(here, value, size))
 638                        goto exit;
 639        } else if ((flags & XATTR_REPLACE)) {
 640                error = -ENODATA;
 641                goto exit;
 642        }
 643
 644        last = here;
 645        while (!IS_XATTR_LAST_ENTRY(last))
 646                last = XATTR_NEXT_ENTRY(last);
 647
 648        newsize = XATTR_ALIGN(sizeof(struct f2fs_xattr_entry) + len + size);
 649
 650        /* 1. Check space */
 651        if (value) {
 652                int free;
 653                /*
 654                 * If value is NULL, it is remove operation.
 655                 * In case of update operation, we calculate free.
 656                 */
 657                free = MIN_OFFSET(inode) - ((char *)last - (char *)base_addr);
 658                if (found)
 659                        free = free + ENTRY_SIZE(here);
 660
 661                if (unlikely(free < newsize)) {
 662                        error = -E2BIG;
 663                        goto exit;
 664                }
 665        }
 666
 667        /* 2. Remove old entry */
 668        if (found) {
 669                /*
 670                 * If entry is found, remove old entry.
 671                 * If not found, remove operation is not needed.
 672                 */
 673                struct f2fs_xattr_entry *next = XATTR_NEXT_ENTRY(here);
 674                int oldsize = ENTRY_SIZE(here);
 675
 676                memmove(here, next, (char *)last - (char *)next);
 677                last = (struct f2fs_xattr_entry *)((char *)last - oldsize);
 678                memset(last, 0, oldsize);
 679        }
 680
 681        new_hsize = (char *)last - (char *)base_addr;
 682
 683        /* 3. Write new entry */
 684        if (value) {
 685                char *pval;
 686                /*
 687                 * Before we come here, old entry is removed.
 688                 * We just write new entry.
 689                 */
 690                last->e_name_index = index;
 691                last->e_name_len = len;
 692                memcpy(last->e_name, name, len);
 693                pval = last->e_name + len;
 694                memcpy(pval, value, size);
 695                last->e_value_size = cpu_to_le16(size);
 696                new_hsize += newsize;
 697        }
 698
 699        error = write_all_xattrs(inode, new_hsize, base_addr, ipage);
 700        if (error)
 701                goto exit;
 702
 703        if (is_inode_flag_set(inode, FI_ACL_MODE)) {
 704                inode->i_mode = F2FS_I(inode)->i_acl_mode;
 705                inode->i_ctime = current_time(inode);
 706                clear_inode_flag(inode, FI_ACL_MODE);
 707        }
 708        if (index == F2FS_XATTR_INDEX_ENCRYPTION &&
 709                        !strcmp(name, F2FS_XATTR_NAME_ENCRYPTION_CONTEXT))
 710                f2fs_set_encrypted_inode(inode);
 711        f2fs_mark_inode_dirty_sync(inode, true);
 712        if (!error && S_ISDIR(inode->i_mode))
 713                set_sbi_flag(F2FS_I_SB(inode), SBI_NEED_CP);
 714exit:
 715        kvfree(base_addr);
 716        return error;
 717}
 718
 719int f2fs_setxattr(struct inode *inode, int index, const char *name,
 720                                const void *value, size_t size,
 721                                struct page *ipage, int flags)
 722{
 723        struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
 724        int err;
 725
 726        err = dquot_initialize(inode);
 727        if (err)
 728                return err;
 729
 730        /* this case is only from f2fs_init_inode_metadata */
 731        if (ipage)
 732                return __f2fs_setxattr(inode, index, name, value,
 733                                                size, ipage, flags);
 734        f2fs_balance_fs(sbi, true);
 735
 736        f2fs_lock_op(sbi);
 737        /* protect xattr_ver */
 738        down_write(&F2FS_I(inode)->i_sem);
 739        down_write(&F2FS_I(inode)->i_xattr_sem);
 740        err = __f2fs_setxattr(inode, index, name, value, size, ipage, flags);
 741        up_write(&F2FS_I(inode)->i_xattr_sem);
 742        up_write(&F2FS_I(inode)->i_sem);
 743        f2fs_unlock_op(sbi);
 744
 745        f2fs_update_time(sbi, REQ_TIME);
 746        return err;
 747}
 748