linux/fs/reiserfs/xattr.c
<<
>>
Prefs
   1/*
   2 * linux/fs/reiserfs/xattr.c
   3 *
   4 * Copyright (c) 2002 by Jeff Mahoney, <jeffm@suse.com>
   5 *
   6 */
   7
   8/*
   9 * In order to implement EA/ACLs in a clean, backwards compatible manner,
  10 * they are implemented as files in a "private" directory.
  11 * Each EA is in it's own file, with the directory layout like so (/ is assumed
  12 * to be relative to fs root). Inside the /.reiserfs_priv/xattrs directory,
  13 * directories named using the capital-hex form of the objectid and
  14 * generation number are used. Inside each directory are individual files
  15 * named with the name of the extended attribute.
  16 *
  17 * So, for objectid 12648430, we could have:
  18 * /.reiserfs_priv/xattrs/C0FFEE.0/system.posix_acl_access
  19 * /.reiserfs_priv/xattrs/C0FFEE.0/system.posix_acl_default
  20 * /.reiserfs_priv/xattrs/C0FFEE.0/user.Content-Type
  21 * .. or similar.
  22 *
  23 * The file contents are the text of the EA. The size is known based on the
  24 * stat data describing the file.
  25 *
  26 * In the case of system.posix_acl_access and system.posix_acl_default, since
  27 * these are special cases for filesystem ACLs, they are interpreted by the
  28 * kernel, in addition, they are negatively and positively cached and attached
  29 * to the inode so that unnecessary lookups are avoided.
  30 *
  31 * Locking works like so:
  32 * Directory components (xattr root, xattr dir) are protectd by their i_mutex.
  33 * The xattrs themselves are protected by the xattr_sem.
  34 */
  35
  36#include <linux/reiserfs_fs.h>
  37#include <linux/capability.h>
  38#include <linux/dcache.h>
  39#include <linux/namei.h>
  40#include <linux/errno.h>
  41#include <linux/gfp.h>
  42#include <linux/fs.h>
  43#include <linux/file.h>
  44#include <linux/pagemap.h>
  45#include <linux/xattr.h>
  46#include <linux/reiserfs_xattr.h>
  47#include <linux/reiserfs_acl.h>
  48#include <asm/uaccess.h>
  49#include <net/checksum.h>
  50#include <linux/stat.h>
  51#include <linux/quotaops.h>
  52#include <linux/security.h>
  53
  54#define PRIVROOT_NAME ".reiserfs_priv"
  55#define XAROOT_NAME   "xattrs"
  56
  57
  58/* Helpers for inode ops. We do this so that we don't have all the VFS
  59 * overhead and also for proper i_mutex annotation.
  60 * dir->i_mutex must be held for all of them. */
  61#ifdef CONFIG_REISERFS_FS_XATTR
  62static int xattr_create(struct inode *dir, struct dentry *dentry, int mode)
  63{
  64        BUG_ON(!mutex_is_locked(&dir->i_mutex));
  65        return dir->i_op->create(dir, dentry, mode, NULL);
  66}
  67#endif
  68
  69static int xattr_mkdir(struct inode *dir, struct dentry *dentry, int mode)
  70{
  71        BUG_ON(!mutex_is_locked(&dir->i_mutex));
  72        return dir->i_op->mkdir(dir, dentry, mode);
  73}
  74
  75/* We use I_MUTEX_CHILD here to silence lockdep. It's safe because xattr
  76 * mutation ops aren't called during rename or splace, which are the
  77 * only other users of I_MUTEX_CHILD. It violates the ordering, but that's
  78 * better than allocating another subclass just for this code. */
  79static int xattr_unlink(struct inode *dir, struct dentry *dentry)
  80{
  81        int error;
  82        BUG_ON(!mutex_is_locked(&dir->i_mutex));
  83
  84        reiserfs_mutex_lock_nested_safe(&dentry->d_inode->i_mutex,
  85                                        I_MUTEX_CHILD, dir->i_sb);
  86        error = dir->i_op->unlink(dir, dentry);
  87        mutex_unlock(&dentry->d_inode->i_mutex);
  88
  89        if (!error)
  90                d_delete(dentry);
  91        return error;
  92}
  93
  94static int xattr_rmdir(struct inode *dir, struct dentry *dentry)
  95{
  96        int error;
  97        BUG_ON(!mutex_is_locked(&dir->i_mutex));
  98
  99        reiserfs_mutex_lock_nested_safe(&dentry->d_inode->i_mutex,
 100                                        I_MUTEX_CHILD, dir->i_sb);
 101        dentry_unhash(dentry);
 102        error = dir->i_op->rmdir(dir, dentry);
 103        if (!error)
 104                dentry->d_inode->i_flags |= S_DEAD;
 105        mutex_unlock(&dentry->d_inode->i_mutex);
 106        if (!error)
 107                d_delete(dentry);
 108        dput(dentry);
 109
 110        return error;
 111}
 112
 113#define xattr_may_create(flags) (!flags || flags & XATTR_CREATE)
 114
 115static struct dentry *open_xa_root(struct super_block *sb, int flags)
 116{
 117        struct dentry *privroot = REISERFS_SB(sb)->priv_root;
 118        struct dentry *xaroot;
 119        if (!privroot->d_inode)
 120                return ERR_PTR(-ENODATA);
 121
 122        mutex_lock_nested(&privroot->d_inode->i_mutex, I_MUTEX_XATTR);
 123
 124        xaroot = dget(REISERFS_SB(sb)->xattr_root);
 125        if (!xaroot)
 126                xaroot = ERR_PTR(-ENODATA);
 127        else if (!xaroot->d_inode) {
 128                int err = -ENODATA;
 129                if (xattr_may_create(flags))
 130                        err = xattr_mkdir(privroot->d_inode, xaroot, 0700);
 131                if (err) {
 132                        dput(xaroot);
 133                        xaroot = ERR_PTR(err);
 134                }
 135        }
 136
 137        mutex_unlock(&privroot->d_inode->i_mutex);
 138        return xaroot;
 139}
 140
 141static struct dentry *open_xa_dir(const struct inode *inode, int flags)
 142{
 143        struct dentry *xaroot, *xadir;
 144        char namebuf[17];
 145
 146        xaroot = open_xa_root(inode->i_sb, flags);
 147        if (IS_ERR(xaroot))
 148                return xaroot;
 149
 150        snprintf(namebuf, sizeof(namebuf), "%X.%X",
 151                 le32_to_cpu(INODE_PKEY(inode)->k_objectid),
 152                 inode->i_generation);
 153
 154        mutex_lock_nested(&xaroot->d_inode->i_mutex, I_MUTEX_XATTR);
 155
 156        xadir = lookup_one_len(namebuf, xaroot, strlen(namebuf));
 157        if (!IS_ERR(xadir) && !xadir->d_inode) {
 158                int err = -ENODATA;
 159                if (xattr_may_create(flags))
 160                        err = xattr_mkdir(xaroot->d_inode, xadir, 0700);
 161                if (err) {
 162                        dput(xadir);
 163                        xadir = ERR_PTR(err);
 164                }
 165        }
 166
 167        mutex_unlock(&xaroot->d_inode->i_mutex);
 168        dput(xaroot);
 169        return xadir;
 170}
 171
 172/* The following are side effects of other operations that aren't explicitly
 173 * modifying extended attributes. This includes operations such as permissions
 174 * or ownership changes, object deletions, etc. */
 175struct reiserfs_dentry_buf {
 176        struct dentry *xadir;
 177        int count;
 178        struct dentry *dentries[8];
 179};
 180
 181static int
 182fill_with_dentries(void *buf, const char *name, int namelen, loff_t offset,
 183                    u64 ino, unsigned int d_type)
 184{
 185        struct reiserfs_dentry_buf *dbuf = buf;
 186        struct dentry *dentry;
 187        WARN_ON_ONCE(!mutex_is_locked(&dbuf->xadir->d_inode->i_mutex));
 188
 189        if (dbuf->count == ARRAY_SIZE(dbuf->dentries))
 190                return -ENOSPC;
 191
 192        if (name[0] == '.' && (name[1] == '\0' ||
 193                               (name[1] == '.' && name[2] == '\0')))
 194                return 0;
 195
 196        dentry = lookup_one_len(name, dbuf->xadir, namelen);
 197        if (IS_ERR(dentry)) {
 198                return PTR_ERR(dentry);
 199        } else if (!dentry->d_inode) {
 200                /* A directory entry exists, but no file? */
 201                reiserfs_error(dentry->d_sb, "xattr-20003",
 202                               "Corrupted directory: xattr %s listed but "
 203                               "not found for file %s.\n",
 204                               dentry->d_name.name, dbuf->xadir->d_name.name);
 205                dput(dentry);
 206                return -EIO;
 207        }
 208
 209        dbuf->dentries[dbuf->count++] = dentry;
 210        return 0;
 211}
 212
 213static void
 214cleanup_dentry_buf(struct reiserfs_dentry_buf *buf)
 215{
 216        int i;
 217        for (i = 0; i < buf->count; i++)
 218                if (buf->dentries[i])
 219                        dput(buf->dentries[i]);
 220}
 221
 222static int reiserfs_for_each_xattr(struct inode *inode,
 223                                   int (*action)(struct dentry *, void *),
 224                                   void *data)
 225{
 226        struct dentry *dir;
 227        int i, err = 0;
 228        loff_t pos = 0;
 229        struct reiserfs_dentry_buf buf = {
 230                .count = 0,
 231        };
 232
 233        /* Skip out, an xattr has no xattrs associated with it */
 234        if (IS_PRIVATE(inode) || get_inode_sd_version(inode) == STAT_DATA_V1)
 235                return 0;
 236
 237        reiserfs_write_unlock(inode->i_sb);
 238        dir = open_xa_dir(inode, XATTR_REPLACE);
 239        if (IS_ERR(dir)) {
 240                err = PTR_ERR(dir);
 241                reiserfs_write_lock(inode->i_sb);
 242                goto out;
 243        } else if (!dir->d_inode) {
 244                err = 0;
 245                reiserfs_write_lock(inode->i_sb);
 246                goto out_dir;
 247        }
 248
 249        mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_XATTR);
 250
 251        reiserfs_write_lock(inode->i_sb);
 252
 253        buf.xadir = dir;
 254        err = reiserfs_readdir_dentry(dir, &buf, fill_with_dentries, &pos);
 255        while ((err == 0 || err == -ENOSPC) && buf.count) {
 256                err = 0;
 257
 258                for (i = 0; i < buf.count && buf.dentries[i]; i++) {
 259                        int lerr = 0;
 260                        struct dentry *dentry = buf.dentries[i];
 261
 262                        if (err == 0 && !S_ISDIR(dentry->d_inode->i_mode))
 263                                lerr = action(dentry, data);
 264
 265                        dput(dentry);
 266                        buf.dentries[i] = NULL;
 267                        err = lerr ?: err;
 268                }
 269                buf.count = 0;
 270                if (!err)
 271                        err = reiserfs_readdir_dentry(dir, &buf,
 272                                                      fill_with_dentries, &pos);
 273        }
 274        mutex_unlock(&dir->d_inode->i_mutex);
 275
 276        /* Clean up after a failed readdir */
 277        cleanup_dentry_buf(&buf);
 278
 279        if (!err) {
 280                /* We start a transaction here to avoid a ABBA situation
 281                 * between the xattr root's i_mutex and the journal lock.
 282                 * This doesn't incur much additional overhead since the
 283                 * new transaction will just nest inside the
 284                 * outer transaction. */
 285                int blocks = JOURNAL_PER_BALANCE_CNT * 2 + 2 +
 286                             4 * REISERFS_QUOTA_TRANS_BLOCKS(inode->i_sb);
 287                struct reiserfs_transaction_handle th;
 288                err = journal_begin(&th, inode->i_sb, blocks);
 289                if (!err) {
 290                        int jerror;
 291                        reiserfs_mutex_lock_nested_safe(
 292                                          &dir->d_parent->d_inode->i_mutex,
 293                                          I_MUTEX_XATTR, inode->i_sb);
 294                        err = action(dir, data);
 295                        jerror = journal_end(&th, inode->i_sb, blocks);
 296                        mutex_unlock(&dir->d_parent->d_inode->i_mutex);
 297                        err = jerror ?: err;
 298                }
 299        }
 300out_dir:
 301        dput(dir);
 302out:
 303        /* -ENODATA isn't an error */
 304        if (err == -ENODATA)
 305                err = 0;
 306        return err;
 307}
 308
 309static int delete_one_xattr(struct dentry *dentry, void *data)
 310{
 311        struct inode *dir = dentry->d_parent->d_inode;
 312
 313        /* This is the xattr dir, handle specially. */
 314        if (S_ISDIR(dentry->d_inode->i_mode))
 315                return xattr_rmdir(dir, dentry);
 316
 317        return xattr_unlink(dir, dentry);
 318}
 319
 320static int chown_one_xattr(struct dentry *dentry, void *data)
 321{
 322        struct iattr *attrs = data;
 323        return reiserfs_setattr(dentry, attrs);
 324}
 325
 326/* No i_mutex, but the inode is unconnected. */
 327int reiserfs_delete_xattrs(struct inode *inode)
 328{
 329        int err = reiserfs_for_each_xattr(inode, delete_one_xattr, NULL);
 330        if (err)
 331                reiserfs_warning(inode->i_sb, "jdm-20004",
 332                                 "Couldn't delete all xattrs (%d)\n", err);
 333        return err;
 334}
 335
 336/* inode->i_mutex: down */
 337int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs)
 338{
 339        int err = reiserfs_for_each_xattr(inode, chown_one_xattr, attrs);
 340        if (err)
 341                reiserfs_warning(inode->i_sb, "jdm-20007",
 342                                 "Couldn't chown all xattrs (%d)\n", err);
 343        return err;
 344}
 345
 346#ifdef CONFIG_REISERFS_FS_XATTR
 347/* Returns a dentry corresponding to a specific extended attribute file
 348 * for the inode. If flags allow, the file is created. Otherwise, a
 349 * valid or negative dentry, or an error is returned. */
 350static struct dentry *xattr_lookup(struct inode *inode, const char *name,
 351                                    int flags)
 352{
 353        struct dentry *xadir, *xafile;
 354        int err = 0;
 355
 356        xadir = open_xa_dir(inode, flags);
 357        if (IS_ERR(xadir))
 358                return ERR_CAST(xadir);
 359
 360        mutex_lock_nested(&xadir->d_inode->i_mutex, I_MUTEX_XATTR);
 361        xafile = lookup_one_len(name, xadir, strlen(name));
 362        if (IS_ERR(xafile)) {
 363                err = PTR_ERR(xafile);
 364                goto out;
 365        }
 366
 367        if (xafile->d_inode && (flags & XATTR_CREATE))
 368                err = -EEXIST;
 369
 370        if (!xafile->d_inode) {
 371                err = -ENODATA;
 372                if (xattr_may_create(flags))
 373                        err = xattr_create(xadir->d_inode, xafile,
 374                                              0700|S_IFREG);
 375        }
 376
 377        if (err)
 378                dput(xafile);
 379out:
 380        mutex_unlock(&xadir->d_inode->i_mutex);
 381        dput(xadir);
 382        if (err)
 383                return ERR_PTR(err);
 384        return xafile;
 385}
 386
 387/* Internal operations on file data */
 388static inline void reiserfs_put_page(struct page *page)
 389{
 390        kunmap(page);
 391        page_cache_release(page);
 392}
 393
 394static struct page *reiserfs_get_page(struct inode *dir, size_t n)
 395{
 396        struct address_space *mapping = dir->i_mapping;
 397        struct page *page;
 398        /* We can deadlock if we try to free dentries,
 399           and an unlink/rmdir has just occured - GFP_NOFS avoids this */
 400        mapping_set_gfp_mask(mapping, GFP_NOFS);
 401        page = read_mapping_page(mapping, n >> PAGE_CACHE_SHIFT, NULL);
 402        if (!IS_ERR(page)) {
 403                kmap(page);
 404                if (PageError(page))
 405                        goto fail;
 406        }
 407        return page;
 408
 409      fail:
 410        reiserfs_put_page(page);
 411        return ERR_PTR(-EIO);
 412}
 413
 414static inline __u32 xattr_hash(const char *msg, int len)
 415{
 416        return csum_partial(msg, len, 0);
 417}
 418
 419int reiserfs_commit_write(struct file *f, struct page *page,
 420                          unsigned from, unsigned to);
 421
 422static void update_ctime(struct inode *inode)
 423{
 424        struct timespec now = current_fs_time(inode->i_sb);
 425        if (inode_unhashed(inode) || !inode->i_nlink ||
 426            timespec_equal(&inode->i_ctime, &now))
 427                return;
 428
 429        inode->i_ctime = CURRENT_TIME_SEC;
 430        mark_inode_dirty(inode);
 431}
 432
 433static int lookup_and_delete_xattr(struct inode *inode, const char *name)
 434{
 435        int err = 0;
 436        struct dentry *dentry, *xadir;
 437
 438        xadir = open_xa_dir(inode, XATTR_REPLACE);
 439        if (IS_ERR(xadir))
 440                return PTR_ERR(xadir);
 441
 442        mutex_lock_nested(&xadir->d_inode->i_mutex, I_MUTEX_XATTR);
 443        dentry = lookup_one_len(name, xadir, strlen(name));
 444        if (IS_ERR(dentry)) {
 445                err = PTR_ERR(dentry);
 446                goto out_dput;
 447        }
 448
 449        if (dentry->d_inode) {
 450                reiserfs_write_lock(inode->i_sb);
 451                err = xattr_unlink(xadir->d_inode, dentry);
 452                reiserfs_write_unlock(inode->i_sb);
 453                update_ctime(inode);
 454        }
 455
 456        dput(dentry);
 457out_dput:
 458        mutex_unlock(&xadir->d_inode->i_mutex);
 459        dput(xadir);
 460        return err;
 461}
 462
 463
 464/* Generic extended attribute operations that can be used by xa plugins */
 465
 466/*
 467 * inode->i_mutex: down
 468 */
 469int
 470reiserfs_xattr_set_handle(struct reiserfs_transaction_handle *th,
 471                          struct inode *inode, const char *name,
 472                          const void *buffer, size_t buffer_size, int flags)
 473{
 474        int err = 0;
 475        struct dentry *dentry;
 476        struct page *page;
 477        char *data;
 478        size_t file_pos = 0;
 479        size_t buffer_pos = 0;
 480        size_t new_size;
 481        __u32 xahash = 0;
 482
 483        if (get_inode_sd_version(inode) == STAT_DATA_V1)
 484                return -EOPNOTSUPP;
 485
 486        reiserfs_write_unlock(inode->i_sb);
 487
 488        if (!buffer) {
 489                err = lookup_and_delete_xattr(inode, name);
 490                reiserfs_write_lock(inode->i_sb);
 491                return err;
 492        }
 493
 494        dentry = xattr_lookup(inode, name, flags);
 495        if (IS_ERR(dentry)) {
 496                reiserfs_write_lock(inode->i_sb);
 497                return PTR_ERR(dentry);
 498        }
 499
 500        down_write(&REISERFS_I(inode)->i_xattr_sem);
 501
 502        reiserfs_write_lock(inode->i_sb);
 503
 504        xahash = xattr_hash(buffer, buffer_size);
 505        while (buffer_pos < buffer_size || buffer_pos == 0) {
 506                size_t chunk;
 507                size_t skip = 0;
 508                size_t page_offset = (file_pos & (PAGE_CACHE_SIZE - 1));
 509                if (buffer_size - buffer_pos > PAGE_CACHE_SIZE)
 510                        chunk = PAGE_CACHE_SIZE;
 511                else
 512                        chunk = buffer_size - buffer_pos;
 513
 514                page = reiserfs_get_page(dentry->d_inode, file_pos);
 515                if (IS_ERR(page)) {
 516                        err = PTR_ERR(page);
 517                        goto out_unlock;
 518                }
 519
 520                lock_page(page);
 521                data = page_address(page);
 522
 523                if (file_pos == 0) {
 524                        struct reiserfs_xattr_header *rxh;
 525                        skip = file_pos = sizeof(struct reiserfs_xattr_header);
 526                        if (chunk + skip > PAGE_CACHE_SIZE)
 527                                chunk = PAGE_CACHE_SIZE - skip;
 528                        rxh = (struct reiserfs_xattr_header *)data;
 529                        rxh->h_magic = cpu_to_le32(REISERFS_XATTR_MAGIC);
 530                        rxh->h_hash = cpu_to_le32(xahash);
 531                }
 532
 533                err = __reiserfs_write_begin(page, page_offset, chunk + skip);
 534                if (!err) {
 535                        if (buffer)
 536                                memcpy(data + skip, buffer + buffer_pos, chunk);
 537                        err = reiserfs_commit_write(NULL, page, page_offset,
 538                                                    page_offset + chunk +
 539                                                    skip);
 540                }
 541                unlock_page(page);
 542                reiserfs_put_page(page);
 543                buffer_pos += chunk;
 544                file_pos += chunk;
 545                skip = 0;
 546                if (err || buffer_size == 0 || !buffer)
 547                        break;
 548        }
 549
 550        new_size = buffer_size + sizeof(struct reiserfs_xattr_header);
 551        if (!err && new_size < i_size_read(dentry->d_inode)) {
 552                struct iattr newattrs = {
 553                        .ia_ctime = current_fs_time(inode->i_sb),
 554                        .ia_size = new_size,
 555                        .ia_valid = ATTR_SIZE | ATTR_CTIME,
 556                };
 557
 558                reiserfs_write_unlock(inode->i_sb);
 559                mutex_lock_nested(&dentry->d_inode->i_mutex, I_MUTEX_XATTR);
 560                down_write(&dentry->d_inode->i_alloc_sem);
 561                reiserfs_write_lock(inode->i_sb);
 562
 563                err = reiserfs_setattr(dentry, &newattrs);
 564                up_write(&dentry->d_inode->i_alloc_sem);
 565                mutex_unlock(&dentry->d_inode->i_mutex);
 566        } else
 567                update_ctime(inode);
 568out_unlock:
 569        up_write(&REISERFS_I(inode)->i_xattr_sem);
 570        dput(dentry);
 571        return err;
 572}
 573
 574/* We need to start a transaction to maintain lock ordering */
 575int reiserfs_xattr_set(struct inode *inode, const char *name,
 576                       const void *buffer, size_t buffer_size, int flags)
 577{
 578
 579        struct reiserfs_transaction_handle th;
 580        int error, error2;
 581        size_t jbegin_count = reiserfs_xattr_nblocks(inode, buffer_size);
 582
 583        if (!(flags & XATTR_REPLACE))
 584                jbegin_count += reiserfs_xattr_jcreate_nblocks(inode);
 585
 586        reiserfs_write_lock(inode->i_sb);
 587        error = journal_begin(&th, inode->i_sb, jbegin_count);
 588        if (error) {
 589                reiserfs_write_unlock(inode->i_sb);
 590                return error;
 591        }
 592
 593        error = reiserfs_xattr_set_handle(&th, inode, name,
 594                                          buffer, buffer_size, flags);
 595
 596        error2 = journal_end(&th, inode->i_sb, jbegin_count);
 597        if (error == 0)
 598                error = error2;
 599        reiserfs_write_unlock(inode->i_sb);
 600
 601        return error;
 602}
 603
 604/*
 605 * inode->i_mutex: down
 606 */
 607int
 608reiserfs_xattr_get(struct inode *inode, const char *name, void *buffer,
 609                   size_t buffer_size)
 610{
 611        ssize_t err = 0;
 612        struct dentry *dentry;
 613        size_t isize;
 614        size_t file_pos = 0;
 615        size_t buffer_pos = 0;
 616        struct page *page;
 617        __u32 hash = 0;
 618
 619        if (name == NULL)
 620                return -EINVAL;
 621
 622        /* We can't have xattrs attached to v1 items since they don't have
 623         * generation numbers */
 624        if (get_inode_sd_version(inode) == STAT_DATA_V1)
 625                return -EOPNOTSUPP;
 626
 627        dentry = xattr_lookup(inode, name, XATTR_REPLACE);
 628        if (IS_ERR(dentry)) {
 629                err = PTR_ERR(dentry);
 630                goto out;
 631        }
 632
 633        down_read(&REISERFS_I(inode)->i_xattr_sem);
 634
 635        isize = i_size_read(dentry->d_inode);
 636
 637        /* Just return the size needed */
 638        if (buffer == NULL) {
 639                err = isize - sizeof(struct reiserfs_xattr_header);
 640                goto out_unlock;
 641        }
 642
 643        if (buffer_size < isize - sizeof(struct reiserfs_xattr_header)) {
 644                err = -ERANGE;
 645                goto out_unlock;
 646        }
 647
 648        while (file_pos < isize) {
 649                size_t chunk;
 650                char *data;
 651                size_t skip = 0;
 652                if (isize - file_pos > PAGE_CACHE_SIZE)
 653                        chunk = PAGE_CACHE_SIZE;
 654                else
 655                        chunk = isize - file_pos;
 656
 657                page = reiserfs_get_page(dentry->d_inode, file_pos);
 658                if (IS_ERR(page)) {
 659                        err = PTR_ERR(page);
 660                        goto out_unlock;
 661                }
 662
 663                lock_page(page);
 664                data = page_address(page);
 665                if (file_pos == 0) {
 666                        struct reiserfs_xattr_header *rxh =
 667                            (struct reiserfs_xattr_header *)data;
 668                        skip = file_pos = sizeof(struct reiserfs_xattr_header);
 669                        chunk -= skip;
 670                        /* Magic doesn't match up.. */
 671                        if (rxh->h_magic != cpu_to_le32(REISERFS_XATTR_MAGIC)) {
 672                                unlock_page(page);
 673                                reiserfs_put_page(page);
 674                                reiserfs_warning(inode->i_sb, "jdm-20001",
 675                                                 "Invalid magic for xattr (%s) "
 676                                                 "associated with %k", name,
 677                                                 INODE_PKEY(inode));
 678                                err = -EIO;
 679                                goto out_unlock;
 680                        }
 681                        hash = le32_to_cpu(rxh->h_hash);
 682                }
 683                memcpy(buffer + buffer_pos, data + skip, chunk);
 684                unlock_page(page);
 685                reiserfs_put_page(page);
 686                file_pos += chunk;
 687                buffer_pos += chunk;
 688                skip = 0;
 689        }
 690        err = isize - sizeof(struct reiserfs_xattr_header);
 691
 692        if (xattr_hash(buffer, isize - sizeof(struct reiserfs_xattr_header)) !=
 693            hash) {
 694                reiserfs_warning(inode->i_sb, "jdm-20002",
 695                                 "Invalid hash for xattr (%s) associated "
 696                                 "with %k", name, INODE_PKEY(inode));
 697                err = -EIO;
 698        }
 699
 700out_unlock:
 701        up_read(&REISERFS_I(inode)->i_xattr_sem);
 702        dput(dentry);
 703
 704out:
 705        return err;
 706}
 707
 708/*
 709 * In order to implement different sets of xattr operations for each xattr
 710 * prefix with the generic xattr API, a filesystem should create a
 711 * null-terminated array of struct xattr_handler (one for each prefix) and
 712 * hang a pointer to it off of the s_xattr field of the superblock.
 713 *
 714 * The generic_fooxattr() functions will use this list to dispatch xattr
 715 * operations to the correct xattr_handler.
 716 */
 717#define for_each_xattr_handler(handlers, handler)               \
 718                for ((handler) = *(handlers)++;                 \
 719                        (handler) != NULL;                      \
 720                        (handler) = *(handlers)++)
 721
 722/* This is the implementation for the xattr plugin infrastructure */
 723static inline const struct xattr_handler *
 724find_xattr_handler_prefix(const struct xattr_handler **handlers,
 725                           const char *name)
 726{
 727        const struct xattr_handler *xah;
 728
 729        if (!handlers)
 730                return NULL;
 731
 732        for_each_xattr_handler(handlers, xah) {
 733                if (strncmp(xah->prefix, name, strlen(xah->prefix)) == 0)
 734                        break;
 735        }
 736
 737        return xah;
 738}
 739
 740
 741/*
 742 * Inode operation getxattr()
 743 */
 744ssize_t
 745reiserfs_getxattr(struct dentry * dentry, const char *name, void *buffer,
 746                  size_t size)
 747{
 748        const struct xattr_handler *handler;
 749
 750        handler = find_xattr_handler_prefix(dentry->d_sb->s_xattr, name);
 751
 752        if (!handler || get_inode_sd_version(dentry->d_inode) == STAT_DATA_V1)
 753                return -EOPNOTSUPP;
 754
 755        return handler->get(dentry, name, buffer, size, handler->flags);
 756}
 757
 758/*
 759 * Inode operation setxattr()
 760 *
 761 * dentry->d_inode->i_mutex down
 762 */
 763int
 764reiserfs_setxattr(struct dentry *dentry, const char *name, const void *value,
 765                  size_t size, int flags)
 766{
 767        const struct xattr_handler *handler;
 768
 769        handler = find_xattr_handler_prefix(dentry->d_sb->s_xattr, name);
 770
 771        if (!handler || get_inode_sd_version(dentry->d_inode) == STAT_DATA_V1)
 772                return -EOPNOTSUPP;
 773
 774        return handler->set(dentry, name, value, size, flags, handler->flags);
 775}
 776
 777/*
 778 * Inode operation removexattr()
 779 *
 780 * dentry->d_inode->i_mutex down
 781 */
 782int reiserfs_removexattr(struct dentry *dentry, const char *name)
 783{
 784        const struct xattr_handler *handler;
 785        handler = find_xattr_handler_prefix(dentry->d_sb->s_xattr, name);
 786
 787        if (!handler || get_inode_sd_version(dentry->d_inode) == STAT_DATA_V1)
 788                return -EOPNOTSUPP;
 789
 790        return handler->set(dentry, name, NULL, 0, XATTR_REPLACE, handler->flags);
 791}
 792
 793struct listxattr_buf {
 794        size_t size;
 795        size_t pos;
 796        char *buf;
 797        struct dentry *dentry;
 798};
 799
 800static int listxattr_filler(void *buf, const char *name, int namelen,
 801                            loff_t offset, u64 ino, unsigned int d_type)
 802{
 803        struct listxattr_buf *b = (struct listxattr_buf *)buf;
 804        size_t size;
 805        if (name[0] != '.' ||
 806            (namelen != 1 && (name[1] != '.' || namelen != 2))) {
 807                const struct xattr_handler *handler;
 808                handler = find_xattr_handler_prefix(b->dentry->d_sb->s_xattr,
 809                                                    name);
 810                if (!handler)   /* Unsupported xattr name */
 811                        return 0;
 812                if (b->buf) {
 813                        size = handler->list(b->dentry, b->buf + b->pos,
 814                                         b->size, name, namelen,
 815                                         handler->flags);
 816                        if (size > b->size)
 817                                return -ERANGE;
 818                } else {
 819                        size = handler->list(b->dentry, NULL, 0, name,
 820                                             namelen, handler->flags);
 821                }
 822
 823                b->pos += size;
 824        }
 825        return 0;
 826}
 827
 828/*
 829 * Inode operation listxattr()
 830 *
 831 * We totally ignore the generic listxattr here because it would be stupid
 832 * not to. Since the xattrs are organized in a directory, we can just
 833 * readdir to find them.
 834 */
 835ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size)
 836{
 837        struct dentry *dir;
 838        int err = 0;
 839        loff_t pos = 0;
 840        struct listxattr_buf buf = {
 841                .dentry = dentry,
 842                .buf = buffer,
 843                .size = buffer ? size : 0,
 844        };
 845
 846        if (!dentry->d_inode)
 847                return -EINVAL;
 848
 849        if (!dentry->d_sb->s_xattr ||
 850            get_inode_sd_version(dentry->d_inode) == STAT_DATA_V1)
 851                return -EOPNOTSUPP;
 852
 853        dir = open_xa_dir(dentry->d_inode, XATTR_REPLACE);
 854        if (IS_ERR(dir)) {
 855                err = PTR_ERR(dir);
 856                if (err == -ENODATA)
 857                        err = 0;  /* Not an error if there aren't any xattrs */
 858                goto out;
 859        }
 860
 861        mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_XATTR);
 862        err = reiserfs_readdir_dentry(dir, &buf, listxattr_filler, &pos);
 863        mutex_unlock(&dir->d_inode->i_mutex);
 864
 865        if (!err)
 866                err = buf.pos;
 867
 868        dput(dir);
 869out:
 870        return err;
 871}
 872
 873static int reiserfs_check_acl(struct inode *inode, int mask, unsigned int flags)
 874{
 875        struct posix_acl *acl;
 876        int error = -EAGAIN; /* do regular unix permission checks by default */
 877
 878        if (flags & IPERM_FLAG_RCU)
 879                return -ECHILD;
 880
 881        acl = reiserfs_get_acl(inode, ACL_TYPE_ACCESS);
 882
 883        if (acl) {
 884                if (!IS_ERR(acl)) {
 885                        error = posix_acl_permission(inode, acl, mask);
 886                        posix_acl_release(acl);
 887                } else if (PTR_ERR(acl) != -ENODATA)
 888                        error = PTR_ERR(acl);
 889        }
 890
 891        return error;
 892}
 893
 894static int create_privroot(struct dentry *dentry)
 895{
 896        int err;
 897        struct inode *inode = dentry->d_parent->d_inode;
 898        WARN_ON_ONCE(!mutex_is_locked(&inode->i_mutex));
 899
 900        err = xattr_mkdir(inode, dentry, 0700);
 901        if (err || !dentry->d_inode) {
 902                reiserfs_warning(dentry->d_sb, "jdm-20006",
 903                                 "xattrs/ACLs enabled and couldn't "
 904                                 "find/create .reiserfs_priv. "
 905                                 "Failing mount.");
 906                return -EOPNOTSUPP;
 907        }
 908
 909        dentry->d_inode->i_flags |= S_PRIVATE;
 910        reiserfs_info(dentry->d_sb, "Created %s - reserved for xattr "
 911                      "storage.\n", PRIVROOT_NAME);
 912
 913        return 0;
 914}
 915
 916#else
 917int __init reiserfs_xattr_register_handlers(void) { return 0; }
 918void reiserfs_xattr_unregister_handlers(void) {}
 919static int create_privroot(struct dentry *dentry) { return 0; }
 920#endif
 921
 922/* Actual operations that are exported to VFS-land */
 923const struct xattr_handler *reiserfs_xattr_handlers[] = {
 924#ifdef CONFIG_REISERFS_FS_XATTR
 925        &reiserfs_xattr_user_handler,
 926        &reiserfs_xattr_trusted_handler,
 927#endif
 928#ifdef CONFIG_REISERFS_FS_SECURITY
 929        &reiserfs_xattr_security_handler,
 930#endif
 931#ifdef CONFIG_REISERFS_FS_POSIX_ACL
 932        &reiserfs_posix_acl_access_handler,
 933        &reiserfs_posix_acl_default_handler,
 934#endif
 935        NULL
 936};
 937
 938static int xattr_mount_check(struct super_block *s)
 939{
 940        /* We need generation numbers to ensure that the oid mapping is correct
 941         * v3.5 filesystems don't have them. */
 942        if (old_format_only(s)) {
 943                if (reiserfs_xattrs_optional(s)) {
 944                        /* Old format filesystem, but optional xattrs have
 945                         * been enabled. Error out. */
 946                        reiserfs_warning(s, "jdm-2005",
 947                                         "xattrs/ACLs not supported "
 948                                         "on pre-v3.6 format filesystems. "
 949                                         "Failing mount.");
 950                        return -EOPNOTSUPP;
 951                }
 952        }
 953
 954        return 0;
 955}
 956
 957int reiserfs_permission(struct inode *inode, int mask, unsigned int flags)
 958{
 959        if (flags & IPERM_FLAG_RCU)
 960                return -ECHILD;
 961        /*
 962         * We don't do permission checks on the internal objects.
 963         * Permissions are determined by the "owning" object.
 964         */
 965        if (IS_PRIVATE(inode))
 966                return 0;
 967
 968#ifdef CONFIG_REISERFS_FS_XATTR
 969        /*
 970         * Stat data v1 doesn't support ACLs.
 971         */
 972        if (get_inode_sd_version(inode) != STAT_DATA_V1)
 973                return generic_permission(inode, mask, flags,
 974                                        reiserfs_check_acl);
 975#endif
 976        return generic_permission(inode, mask, flags, NULL);
 977}
 978
 979static int xattr_hide_revalidate(struct dentry *dentry, struct nameidata *nd)
 980{
 981        return -EPERM;
 982}
 983
 984static const struct dentry_operations xattr_lookup_poison_ops = {
 985        .d_revalidate = xattr_hide_revalidate,
 986};
 987
 988int reiserfs_lookup_privroot(struct super_block *s)
 989{
 990        struct dentry *dentry;
 991        int err = 0;
 992
 993        /* If we don't have the privroot located yet - go find it */
 994        reiserfs_mutex_lock_safe(&s->s_root->d_inode->i_mutex, s);
 995        dentry = lookup_one_len(PRIVROOT_NAME, s->s_root,
 996                                strlen(PRIVROOT_NAME));
 997        if (!IS_ERR(dentry)) {
 998                REISERFS_SB(s)->priv_root = dentry;
 999                d_set_d_op(dentry, &xattr_lookup_poison_ops);
1000                if (dentry->d_inode)
1001                        dentry->d_inode->i_flags |= S_PRIVATE;
1002        } else
1003                err = PTR_ERR(dentry);
1004        mutex_unlock(&s->s_root->d_inode->i_mutex);
1005
1006        return err;
1007}
1008
1009/* We need to take a copy of the mount flags since things like
1010 * MS_RDONLY don't get set until *after* we're called.
1011 * mount_flags != mount_options */
1012int reiserfs_xattr_init(struct super_block *s, int mount_flags)
1013{
1014        int err = 0;
1015        struct dentry *privroot = REISERFS_SB(s)->priv_root;
1016
1017        err = xattr_mount_check(s);
1018        if (err)
1019                goto error;
1020
1021        if (!privroot->d_inode && !(mount_flags & MS_RDONLY)) {
1022                reiserfs_mutex_lock_safe(&s->s_root->d_inode->i_mutex, s);
1023                err = create_privroot(REISERFS_SB(s)->priv_root);
1024                mutex_unlock(&s->s_root->d_inode->i_mutex);
1025        }
1026
1027        if (privroot->d_inode) {
1028                s->s_xattr = reiserfs_xattr_handlers;
1029                reiserfs_mutex_lock_safe(&privroot->d_inode->i_mutex, s);
1030                if (!REISERFS_SB(s)->xattr_root) {
1031                        struct dentry *dentry;
1032                        dentry = lookup_one_len(XAROOT_NAME, privroot,
1033                                                strlen(XAROOT_NAME));
1034                        if (!IS_ERR(dentry))
1035                                REISERFS_SB(s)->xattr_root = dentry;
1036                        else
1037                                err = PTR_ERR(dentry);
1038                }
1039                mutex_unlock(&privroot->d_inode->i_mutex);
1040        }
1041
1042error:
1043        if (err) {
1044                clear_bit(REISERFS_XATTRS_USER, &(REISERFS_SB(s)->s_mount_opt));
1045                clear_bit(REISERFS_POSIXACL, &(REISERFS_SB(s)->s_mount_opt));
1046        }
1047
1048        /* The super_block MS_POSIXACL must mirror the (no)acl mount option. */
1049        if (reiserfs_posixacl(s))
1050                s->s_flags |= MS_POSIXACL;
1051        else
1052                s->s_flags &= ~MS_POSIXACL;
1053
1054        return err;
1055}
1056