[PATCH] reiserfs: eliminate private use of struct file in xattr

After several posts and bug reports regarding interaction with the NULL
nameidata, here's a patch to clean up the mess with struct file in the
reiserfs xattr code.

As observed in several of the posts, there's really no need for struct file
to exist in the xattr code. It was really only passed around due to the
f_op->readdir() and a_ops->{prepare,commit}_write prototypes requiring it.

reiserfs_prepare_write() and reiserfs_commit_write() don't actually use the
struct file passed to it, and the xattr code uses a private version of
reiserfs_readdir() to enumerate the xattr directories.

Signed-off-by: Jeff Mahoney <jeffm@suse.com>
Acked-by: Al Viro <viro@ZenIV.linux.org.uk>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Dave Hansen <haveblue@us.ibm.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

authored by Jeff Mahoney and committed by Al Viro 3227e14c f382d6e6

+30 -80
+30 -80
fs/reiserfs/xattr.c
··· 191 191 dput(xadir); 192 192 if (err) 193 193 xafile = ERR_PTR(err); 194 - return xafile; 195 - } 196 - 197 - /* Opens a file pointer to the attribute associated with inode */ 198 - static struct file *open_xa_file(const struct inode *inode, const char *name, 199 - int flags) 200 - { 201 - struct dentry *xafile; 202 - struct file *fp; 203 - 204 - xafile = get_xa_file_dentry(inode, name, flags); 205 - if (IS_ERR(xafile)) 206 - return ERR_PTR(PTR_ERR(xafile)); 207 194 else if (!xafile->d_inode) { 208 195 dput(xafile); 209 - return ERR_PTR(-ENODATA); 196 + xafile = ERR_PTR(-ENODATA); 210 197 } 211 - 212 - fp = dentry_open(xafile, NULL, O_RDWR); 213 - /* dentry_open dputs the dentry if it fails */ 214 - 215 - return fp; 198 + return xafile; 216 199 } 217 200 218 201 /* ··· 211 228 * we're called with i_mutex held, so there are no worries about the directory 212 229 * changing underneath us. 213 230 */ 214 - static int __xattr_readdir(struct file *filp, void *dirent, filldir_t filldir) 231 + static int __xattr_readdir(struct inode *inode, void *dirent, filldir_t filldir) 215 232 { 216 - struct inode *inode = filp->f_path.dentry->d_inode; 217 233 struct cpu_key pos_key; /* key of current position in the directory (key of directory entry) */ 218 234 INITIALIZE_PATH(path_to_entry); 219 235 struct buffer_head *bh; ··· 356 374 * 357 375 */ 358 376 static 359 - int xattr_readdir(struct file *file, filldir_t filler, void *buf) 377 + int xattr_readdir(struct inode *inode, filldir_t filler, void *buf) 360 378 { 361 - struct inode *inode = file->f_path.dentry->d_inode; 362 - int res = -ENOTDIR; 363 - if (!file->f_op || !file->f_op->readdir) 364 - goto out; 379 + int res = -ENOENT; 365 380 mutex_lock_nested(&inode->i_mutex, I_MUTEX_XATTR); 366 - // down(&inode->i_zombie); 367 - res = -ENOENT; 368 381 if (!IS_DEADDIR(inode)) { 369 382 lock_kernel(); 370 - res = __xattr_readdir(file, buf, filler); 383 + res = __xattr_readdir(inode, buf, filler); 371 384 unlock_kernel(); 372 385 } 373 - // up(&inode->i_zombie); 374 386 mutex_unlock(&inode->i_mutex); 375 - out: 376 387 return res; 377 388 } 378 389 ··· 417 442 size_t buffer_size, int flags) 418 443 { 419 444 int err = 0; 420 - struct file *fp; 445 + struct dentry *dentry; 421 446 struct page *page; 422 447 char *data; 423 448 struct address_space *mapping; ··· 435 460 xahash = xattr_hash(buffer, buffer_size); 436 461 437 462 open_file: 438 - fp = open_xa_file(inode, name, flags); 439 - if (IS_ERR(fp)) { 440 - err = PTR_ERR(fp); 463 + dentry = get_xa_file_dentry(inode, name, flags); 464 + if (IS_ERR(dentry)) { 465 + err = PTR_ERR(dentry); 441 466 goto out; 442 467 } 443 468 444 - xinode = fp->f_path.dentry->d_inode; 469 + xinode = dentry->d_inode; 445 470 REISERFS_I(inode)->i_flags |= i_has_xattr_dir; 446 471 447 472 /* we need to copy it off.. */ 448 473 if (xinode->i_nlink > 1) { 449 - fput(fp); 474 + dput(dentry); 450 475 err = reiserfs_xattr_del(inode, name); 451 476 if (err < 0) 452 477 goto out; ··· 460 485 newattrs.ia_size = buffer_size; 461 486 newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME; 462 487 mutex_lock_nested(&xinode->i_mutex, I_MUTEX_XATTR); 463 - err = notify_change(fp->f_path.dentry, &newattrs); 488 + err = notify_change(dentry, &newattrs); 464 489 if (err) 465 490 goto out_filp; 466 491 ··· 493 518 rxh->h_hash = cpu_to_le32(xahash); 494 519 } 495 520 496 - err = reiserfs_prepare_write(fp, page, page_offset, 521 + err = reiserfs_prepare_write(NULL, page, page_offset, 497 522 page_offset + chunk + skip); 498 523 if (!err) { 499 524 if (buffer) 500 525 memcpy(data + skip, buffer + buffer_pos, chunk); 501 - err = 502 - reiserfs_commit_write(fp, page, page_offset, 503 - page_offset + chunk + 504 - skip); 526 + err = reiserfs_commit_write(NULL, page, page_offset, 527 + page_offset + chunk + 528 + skip); 505 529 } 506 530 unlock_page(page); 507 531 reiserfs_put_page(page); ··· 522 548 523 549 out_filp: 524 550 mutex_unlock(&xinode->i_mutex); 525 - fput(fp); 551 + dput(dentry); 526 552 527 553 out: 528 554 return err; ··· 536 562 size_t buffer_size) 537 563 { 538 564 ssize_t err = 0; 539 - struct file *fp; 565 + struct dentry *dentry; 540 566 size_t isize; 541 567 size_t file_pos = 0; 542 568 size_t buffer_pos = 0; ··· 552 578 if (get_inode_sd_version(inode) == STAT_DATA_V1) 553 579 return -EOPNOTSUPP; 554 580 555 - fp = open_xa_file(inode, name, FL_READONLY); 556 - if (IS_ERR(fp)) { 557 - err = PTR_ERR(fp); 581 + dentry = get_xa_file_dentry(inode, name, FL_READONLY); 582 + if (IS_ERR(dentry)) { 583 + err = PTR_ERR(dentry); 558 584 goto out; 559 585 } 560 586 561 - xinode = fp->f_path.dentry->d_inode; 587 + xinode = dentry->d_inode; 562 588 isize = xinode->i_size; 563 589 REISERFS_I(inode)->i_flags |= i_has_xattr_dir; 564 590 ··· 626 652 } 627 653 628 654 out_dput: 629 - fput(fp); 655 + dput(dentry); 630 656 631 657 out: 632 658 return err; ··· 716 742 /* This is called w/ inode->i_mutex downed */ 717 743 int reiserfs_delete_xattrs(struct inode *inode) 718 744 { 719 - struct file *fp; 720 745 struct dentry *dir, *root; 721 746 int err = 0; 722 747 ··· 736 763 return 0; 737 764 } 738 765 739 - fp = dentry_open(dir, NULL, O_RDWR); 740 - if (IS_ERR(fp)) { 741 - err = PTR_ERR(fp); 742 - /* dentry_open dputs the dentry if it fails */ 743 - goto out; 744 - } 745 - 746 766 lock_kernel(); 747 - err = xattr_readdir(fp, reiserfs_delete_xattrs_filler, dir); 767 + err = xattr_readdir(dir->d_inode, reiserfs_delete_xattrs_filler, dir); 748 768 if (err) { 749 769 unlock_kernel(); 750 770 goto out_dir; ··· 757 791 unlock_kernel(); 758 792 759 793 out_dir: 760 - fput(fp); 794 + dput(dir); 761 795 762 796 out: 763 797 if (!err) ··· 799 833 800 834 int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs) 801 835 { 802 - struct file *fp; 803 836 struct dentry *dir; 804 837 int err = 0; 805 838 struct reiserfs_chown_buf buf; ··· 822 857 goto out; 823 858 } 824 859 825 - fp = dentry_open(dir, NULL, O_RDWR); 826 - if (IS_ERR(fp)) { 827 - err = PTR_ERR(fp); 828 - /* dentry_open dputs the dentry if it fails */ 829 - goto out; 830 - } 831 - 832 860 lock_kernel(); 833 861 834 862 attrs->ia_valid &= (ATTR_UID | ATTR_GID | ATTR_CTIME); ··· 829 871 buf.attrs = attrs; 830 872 buf.inode = inode; 831 873 832 - err = xattr_readdir(fp, reiserfs_chown_xattrs_filler, &buf); 874 + err = xattr_readdir(dir->d_inode, reiserfs_chown_xattrs_filler, &buf); 833 875 if (err) { 834 876 unlock_kernel(); 835 877 goto out_dir; ··· 839 881 unlock_kernel(); 840 882 841 883 out_dir: 842 - fput(fp); 884 + dput(dir); 843 885 844 886 out: 845 887 attrs->ia_valid = ia_valid; ··· 987 1029 */ 988 1030 ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size) 989 1031 { 990 - struct file *fp; 991 1032 struct dentry *dir; 992 1033 int err = 0; 993 1034 struct reiserfs_listxattr_buf buf; ··· 1009 1052 goto out; 1010 1053 } 1011 1054 1012 - fp = dentry_open(dir, NULL, O_RDWR); 1013 - if (IS_ERR(fp)) { 1014 - err = PTR_ERR(fp); 1015 - /* dentry_open dputs the dentry if it fails */ 1016 - goto out; 1017 - } 1018 - 1019 1055 buf.r_buf = buffer; 1020 1056 buf.r_size = buffer ? size : 0; 1021 1057 buf.r_pos = 0; ··· 1016 1066 1017 1067 REISERFS_I(dentry->d_inode)->i_flags |= i_has_xattr_dir; 1018 1068 1019 - err = xattr_readdir(fp, reiserfs_listxattr_filler, &buf); 1069 + err = xattr_readdir(dir->d_inode, reiserfs_listxattr_filler, &buf); 1020 1070 if (err) 1021 1071 goto out_dir; 1022 1072 ··· 1026 1076 err = buf.r_pos; 1027 1077 1028 1078 out_dir: 1029 - fput(fp); 1079 + dput(dir); 1030 1080 1031 1081 out: 1032 1082 reiserfs_read_unlock_xattr_i(dentry->d_inode);