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