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