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 65 static 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 72 static 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 */ 84 static 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 99 static 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 118 static 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 146 static 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 */ 183 struct reiserfs_dentry_buf { 184 struct dir_context ctx; 185 struct dentry *xadir; 186 int count; 187 struct dentry *dentries[8]; 188 }; 189 190 static int 191 fill_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 223 static void 224 cleanup_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 233 static 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 } 310 out_dir: 311 dput(dir); 312 out: 313 /* -ENODATA isn't an error */ 314 if (err == -ENODATA) 315 err = 0; 316 return err; 317 } 318 319 static 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 330 static 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. */ 349 int 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 */ 360 int 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 */ 376 static 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); 405 out: 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 */ 414 static inline void reiserfs_put_page(struct page *page) 415 { 416 kunmap(page); 417 page_cache_release(page); 418 } 419 420 static 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 437 fail: 438 reiserfs_put_page(page); 439 return ERR_PTR(-EIO); 440 } 441 442 static inline __u32 xattr_hash(const char *msg, int len) 443 { 444 return csum_partial(msg, len, 0); 445 } 446 447 int reiserfs_commit_write(struct file *f, struct page *page, 448 unsigned from, unsigned to); 449 450 static 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 462 static 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); 484 out_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 */ 496 int 497 reiserfs_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); 589 out_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 */ 596 int 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 */ 629 int 630 reiserfs_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 725 out_unlock: 726 up_read(&REISERFS_I(inode)->i_xattr_sem); 727 dput(dentry); 728 729 out: 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 */ 748 static inline const struct xattr_handler * 749 find_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 */ 769 ssize_t 770 reiserfs_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 */ 788 int 789 reiserfs_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 */ 807 int 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 819 struct listxattr_buf { 820 struct dir_context ctx; 821 size_t size; 822 size_t pos; 823 char *buf; 824 struct dentry *dentry; 825 }; 826 827 static 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 */ 864 ssize_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); 898 out: 899 return err; 900 } 901 902 static 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 926 int __init reiserfs_xattr_register_handlers(void) { return 0; } 927 void reiserfs_xattr_unregister_handlers(void) {} 928 static int create_privroot(struct dentry *dentry) { return 0; } 929 #endif 930 931 /* Actual operations that are exported to VFS-land */ 932 static 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 947 static 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 970 int 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 982 static int xattr_hide_revalidate(struct dentry *dentry, unsigned int flags) 983 { 984 return -EPERM; 985 } 986 987 static const struct dentry_operations xattr_lookup_poison_ops = { 988 .d_revalidate = xattr_hide_revalidate, 989 }; 990 991 int 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 */ 1017 int 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 1048 error: 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 } 1062