aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/linux-2.6/xfs_iops.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/xfs/linux-2.6/xfs_iops.c')
-rw-r--r--fs/xfs/linux-2.6/xfs_iops.c38
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