Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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