diff options
Diffstat (limited to 'fs/xfs/linux-2.6/xfs_iops.c')
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_iops.c | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c index 12810baeb5d4..3ba814ae3bba 100644 --- a/fs/xfs/linux-2.6/xfs_iops.c +++ b/fs/xfs/linux-2.6/xfs_iops.c | |||
| @@ -419,16 +419,15 @@ xfs_vn_link( | |||
| 419 | int error; | 419 | int error; |
| 420 | 420 | ||
| 421 | ip = old_dentry->d_inode; /* inode being linked to */ | 421 | ip = old_dentry->d_inode; /* inode being linked to */ |
| 422 | if (S_ISDIR(ip->i_mode)) | ||
| 423 | return -EPERM; | ||
| 424 | |||
| 425 | tdvp = vn_from_inode(dir); | 422 | tdvp = vn_from_inode(dir); |
| 426 | vp = vn_from_inode(ip); | 423 | vp = vn_from_inode(ip); |
| 427 | 424 | ||
| 425 | VN_HOLD(vp); | ||
| 428 | error = bhv_vop_link(tdvp, vp, dentry, NULL); | 426 | error = bhv_vop_link(tdvp, vp, dentry, NULL); |
| 429 | if (likely(!error)) { | 427 | if (unlikely(error)) { |
| 428 | VN_RELE(vp); | ||
| 429 | } else { | ||
| 430 | VMODIFY(tdvp); | 430 | VMODIFY(tdvp); |
| 431 | VN_HOLD(vp); | ||
| 432 | xfs_validate_fields(ip, &vattr); | 431 | xfs_validate_fields(ip, &vattr); |
| 433 | d_instantiate(dentry, ip); | 432 | d_instantiate(dentry, ip); |
| 434 | } | 433 | } |
| @@ -554,13 +553,13 @@ xfs_vn_follow_link( | |||
| 554 | ASSERT(dentry); | 553 | ASSERT(dentry); |
| 555 | ASSERT(nd); | 554 | ASSERT(nd); |
| 556 | 555 | ||
| 557 | link = (char *)kmalloc(MAXPATHLEN+1, GFP_KERNEL); | 556 | link = kmalloc(MAXPATHLEN+1, GFP_KERNEL); |
| 558 | if (!link) { | 557 | if (!link) { |
| 559 | nd_set_link(nd, ERR_PTR(-ENOMEM)); | 558 | nd_set_link(nd, ERR_PTR(-ENOMEM)); |
| 560 | return NULL; | 559 | return NULL; |
| 561 | } | 560 | } |
| 562 | 561 | ||
| 563 | uio = (uio_t *)kmalloc(sizeof(uio_t), GFP_KERNEL); | 562 | uio = kmalloc(sizeof(uio_t), GFP_KERNEL); |
| 564 | if (!uio) { | 563 | if (!uio) { |
| 565 | kfree(link); | 564 | kfree(link); |
| 566 | nd_set_link(nd, ERR_PTR(-ENOMEM)); | 565 | nd_set_link(nd, ERR_PTR(-ENOMEM)); |
| @@ -624,12 +623,27 @@ xfs_vn_getattr( | |||
| 624 | { | 623 | { |
| 625 | struct inode *inode = dentry->d_inode; | 624 | struct inode *inode = dentry->d_inode; |
| 626 | bhv_vnode_t *vp = vn_from_inode(inode); | 625 | bhv_vnode_t *vp = vn_from_inode(inode); |
| 627 | int error = 0; | 626 | bhv_vattr_t vattr = { .va_mask = XFS_AT_STAT }; |
| 627 | int error; | ||
| 628 | 628 | ||
| 629 | if (unlikely(vp->v_flag & VMODIFIED)) | 629 | error = bhv_vop_getattr(vp, &vattr, ATTR_LAZY, NULL); |
| 630 | error = vn_revalidate(vp); | 630 | if (likely(!error)) { |
| 631 | if (!error) | 631 | stat->size = i_size_read(inode); |
| 632 | generic_fillattr(inode, stat); | 632 | stat->dev = inode->i_sb->s_dev; |
| 633 | stat->rdev = (vattr.va_rdev == 0) ? 0 : | ||
| 634 | MKDEV(sysv_major(vattr.va_rdev) & 0x1ff, | ||
| 635 | sysv_minor(vattr.va_rdev)); | ||
| 636 | stat->mode = vattr.va_mode; | ||
| 637 | stat->nlink = vattr.va_nlink; | ||
| 638 | stat->uid = vattr.va_uid; | ||
| 639 | stat->gid = vattr.va_gid; | ||
| 640 | stat->ino = vattr.va_nodeid; | ||
| 641 | stat->atime = vattr.va_atime; | ||
| 642 | stat->mtime = vattr.va_mtime; | ||
| 643 | stat->ctime = vattr.va_ctime; | ||
| 644 | stat->blocks = vattr.va_nblocks; | ||
| 645 | stat->blksize = vattr.va_blocksize; | ||
| 646 | } | ||
| 633 | return -error; | 647 | return -error; |
| 634 | } | 648 | } |
| 635 | 649 | ||
