X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fllite%2Ffile.c;h=f2a8d1462ab15ffbfd4af75316151893d790d822;hp=14d68c696374e4c1d2d952bfc4cd169245d6dd9b;hb=942a9ad2fb230abe2290ae08aad748b5a58c9148;hpb=4c01e64e0a72c1682ebf0a8bd4cccf99fd04cd88 diff --git a/lustre/llite/file.c b/lustre/llite/file.c index 14d68c6..f2a8d14 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -26,7 +26,7 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. */ /* @@ -515,14 +515,14 @@ int ll_file_open(struct inode *inode, struct file *file) fd->fd_file = file; if (S_ISDIR(inode->i_mode)) { - cfs_spin_lock(&lli->lli_lock); + cfs_spin_lock(&lli->lli_sa_lock); if (lli->lli_opendir_key == NULL && lli->lli_opendir_pid == 0) { LASSERT(lli->lli_sai == NULL); lli->lli_opendir_key = fd; lli->lli_opendir_pid = cfs_curproc_pid(); opendir_set = 1; } - cfs_spin_unlock(&lli->lli_lock); + cfs_spin_unlock(&lli->lli_sa_lock); } if (inode->i_sb->s_root == file->f_dentry) { @@ -778,6 +778,9 @@ int ll_merge_lvb(struct inode *inode) lvb.lvb_ctime = lli->lli_lvb.lvb_ctime; rc = obd_merge_lvb(sbi->ll_dt_exp, lli->lli_smd, &lvb, 0); cl_isize_write_nolock(inode, lvb.lvb_size); + + CDEBUG(D_VFSTRACE, DFID" updating i_size "LPU64"\n", + PFID(&lli->lli_fid), lvb.lvb_size); inode->i_blocks = lvb.lvb_blocks; LTIME_S(inode->i_mtime) = lvb.lvb_mtime; @@ -1195,11 +1198,10 @@ static ssize_t ll_file_splice_read(struct file *in_file, loff_t *ppos, } #endif -static int ll_lov_recreate_obj(struct inode *inode, struct file *file, - unsigned long arg) +static int ll_lov_recreate(struct inode *inode, obd_id id, obd_seq seq, + obd_count ost_idx) { struct obd_export *exp = ll_i2dtexp(inode); - struct ll_recreate_obj ucreatp; struct obd_trans_info oti = { 0 }; struct obdo *oa = NULL; int lsm_size; @@ -1207,13 +1209,6 @@ static int ll_lov_recreate_obj(struct inode *inode, struct file *file, struct lov_stripe_md *lsm, *lsm2; ENTRY; - if (!cfs_capable(CFS_CAP_SYS_ADMIN)) - RETURN(-EPERM); - - if (cfs_copy_from_user(&ucreatp, (struct ll_recreate_obj *)arg, - sizeof(struct ll_recreate_obj))) - RETURN(-EFAULT); - OBDO_ALLOC(oa); if (oa == NULL) RETURN(-ENOMEM); @@ -1229,9 +1224,9 @@ static int ll_lov_recreate_obj(struct inode *inode, struct file *file, if (lsm2 == NULL) GOTO(out, rc = -ENOMEM); - oa->o_id = ucreatp.lrc_id; - oa->o_seq = ucreatp.lrc_seq; - oa->o_nlink = ucreatp.lrc_ost_idx; + oa->o_id = id; + oa->o_seq = seq; + oa->o_nlink = ost_idx; oa->o_flags |= OBD_FL_RECREATE_OBJS; oa->o_valid = OBD_MD_FLID | OBD_MD_FLFLAGS | OBD_MD_FLGROUP; obdo_from_inode(oa, inode, &ll_i2info(inode)->lli_fid, OBD_MD_FLTYPE | @@ -1247,6 +1242,41 @@ out: return rc; } +static int ll_lov_recreate_obj(struct inode *inode, unsigned long arg) +{ + struct ll_recreate_obj ucreat; + ENTRY; + + if (!cfs_capable(CFS_CAP_SYS_ADMIN)) + RETURN(-EPERM); + + if (cfs_copy_from_user(&ucreat, (struct ll_recreate_obj *)arg, + sizeof(struct ll_recreate_obj))) + RETURN(-EFAULT); + + RETURN(ll_lov_recreate(inode, ucreat.lrc_id, 0, + ucreat.lrc_ost_idx)); +} + +static int ll_lov_recreate_fid(struct inode *inode, unsigned long arg) +{ + struct lu_fid fid; + obd_id id; + obd_count ost_idx; + ENTRY; + + if (!cfs_capable(CFS_CAP_SYS_ADMIN)) + RETURN(-EPERM); + + if (cfs_copy_from_user(&fid, (struct lu_fid *)arg, + sizeof(struct lu_fid))) + RETURN(-EFAULT); + + id = fid_oid(&fid) | ((fid_seq(&fid) & 0xffff) << 32); + ost_idx = (fid_seq(&fid) >> 16) & 0xffff; + RETURN(ll_lov_recreate(inode, id, 0, ost_idx)); +} + int ll_lov_setstripe_ea_info(struct inode *inode, struct file *file, int flags, struct lov_user_md *lum, int lum_size) { @@ -1744,7 +1774,9 @@ int ll_file_ioctl(struct inode *inode, struct file *file, unsigned int cmd, case LL_IOC_LOV_GETSTRIPE: RETURN(ll_lov_getstripe(inode, arg)); case LL_IOC_RECREATE_OBJ: - RETURN(ll_lov_recreate_obj(inode, file, arg)); + RETURN(ll_lov_recreate_obj(inode, arg)); + case LL_IOC_RECREATE_FID: + RETURN(ll_lov_recreate_fid(inode, arg)); case FSFILT_IOC_FIEMAP: RETURN(ll_ioctl_fiemap(inode, arg)); case FSFILT_IOC_GETFLAGS: @@ -2212,6 +2244,7 @@ int ll_getattr_it(struct vfsmount *mnt, struct dentry *de, struct lookup_intent *it, struct kstat *stat) { struct inode *inode = de->d_inode; + struct ll_inode_info *lli = ll_i2info(inode); int res = 0; res = ll_inode_revalidate_it(de, it); @@ -2221,7 +2254,11 @@ int ll_getattr_it(struct vfsmount *mnt, struct dentry *de, return res; stat->dev = inode->i_sb->s_dev; - stat->ino = inode->i_ino; + if (cfs_curproc_is_32bit()) + stat->ino = cl_fid_build_ino32(&lli->lli_fid); + else + stat->ino = inode->i_ino; + stat->mode = inode->i_mode; stat->nlink = inode->i_nlink; stat->uid = inode->i_uid;