mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-27 14:43:58 +08:00
Merge branch 'for-lustre' into for-next
This commit is contained in:
commit
e63fa0d458
@ -1025,8 +1025,8 @@ static int tracefiled(void *arg)
|
||||
|
||||
if (f_pos >= (off_t)cfs_tracefile_size)
|
||||
f_pos = 0;
|
||||
else if (f_pos > i_size_read(filp->f_dentry->d_inode))
|
||||
f_pos = i_size_read(filp->f_dentry->d_inode);
|
||||
else if (f_pos > i_size_read(file_inode(filp)))
|
||||
f_pos = i_size_read(file_inode(filp));
|
||||
|
||||
buf = kmap(tage->page);
|
||||
rc = vfs_write(filp, (__force const char __user *)buf,
|
||||
|
@ -151,10 +151,10 @@ static int ll_ddelete(const struct dentry *de)
|
||||
{
|
||||
LASSERT(de);
|
||||
|
||||
CDEBUG(D_DENTRY, "%s dentry %.*s (%p, parent %p, inode %p) %s%s\n",
|
||||
CDEBUG(D_DENTRY, "%s dentry %pd (%p, parent %p, inode %p) %s%s\n",
|
||||
d_lustre_invalid((struct dentry *)de) ? "deleting" : "keeping",
|
||||
de->d_name.len, de->d_name.name, de, de->d_parent, de->d_inode,
|
||||
d_unhashed((struct dentry *)de) ? "" : "hashed,",
|
||||
de, de, de->d_parent, de->d_inode,
|
||||
d_unhashed(de) ? "" : "hashed,",
|
||||
list_empty(&de->d_subdirs) ? "" : "subdirs");
|
||||
|
||||
/* kernel >= 2.6.38 last refcount is decreased after this function. */
|
||||
@ -180,8 +180,8 @@ int ll_d_init(struct dentry *de)
|
||||
{
|
||||
LASSERT(de != NULL);
|
||||
|
||||
CDEBUG(D_DENTRY, "ldd on dentry %.*s (%p) parent %p inode %p refc %d\n",
|
||||
de->d_name.len, de->d_name.name, de, de->d_parent, de->d_inode,
|
||||
CDEBUG(D_DENTRY, "ldd on dentry %pd (%p) parent %p inode %p refc %d\n",
|
||||
de, de, de->d_parent, de->d_inode,
|
||||
d_count(de));
|
||||
|
||||
if (de->d_fsdata == NULL) {
|
||||
@ -259,9 +259,8 @@ void ll_invalidate_aliases(struct inode *inode)
|
||||
|
||||
ll_lock_dcache(inode);
|
||||
ll_d_hlist_for_each_entry(dentry, p, &inode->i_dentry, d_u.d_alias) {
|
||||
CDEBUG(D_DENTRY, "dentry in drop %.*s (%p) parent %p "
|
||||
"inode %p flags %d\n", dentry->d_name.len,
|
||||
dentry->d_name.name, dentry, dentry->d_parent,
|
||||
CDEBUG(D_DENTRY, "dentry in drop %pd (%p) parent %p "
|
||||
"inode %p flags %d\n", dentry, dentry, dentry->d_parent,
|
||||
dentry->d_inode, dentry->d_flags);
|
||||
|
||||
if (unlikely(dentry == dentry->d_sb->s_root)) {
|
||||
@ -352,8 +351,8 @@ static int ll_revalidate_nd(struct dentry *dentry, unsigned int flags)
|
||||
{
|
||||
int rc;
|
||||
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:name=%s, flags=%u\n",
|
||||
dentry->d_name.name, flags);
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:name=%pd, flags=%u\n",
|
||||
dentry, flags);
|
||||
|
||||
rc = ll_revalidate_dentry(dentry, flags);
|
||||
return rc;
|
||||
|
@ -593,7 +593,7 @@ int ll_dir_read(struct inode *inode, struct dir_context *ctx)
|
||||
|
||||
static int ll_readdir(struct file *filp, struct dir_context *ctx)
|
||||
{
|
||||
struct inode *inode = filp->f_dentry->d_inode;
|
||||
struct inode *inode = file_inode(filp);
|
||||
struct ll_file_data *lfd = LUSTRE_FPRIVATE(filp);
|
||||
struct ll_sb_info *sbi = ll_i2sbi(inode);
|
||||
int hash64 = sbi->ll_flags & LL_SBI_64BIT_HASH;
|
||||
@ -1242,7 +1242,7 @@ ll_getname(const char __user *filename)
|
||||
|
||||
static long ll_dir_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct inode *inode = file->f_dentry->d_inode;
|
||||
struct inode *inode = file_inode(file);
|
||||
struct ll_sb_info *sbi = ll_i2sbi(inode);
|
||||
struct obd_ioctl_data *data;
|
||||
int rc = 0;
|
||||
@ -1389,7 +1389,7 @@ lmv_out_free:
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
if (inode->i_sb->s_root == file->f_dentry)
|
||||
if (is_root_inode(inode))
|
||||
set_default = 1;
|
||||
|
||||
/* in v1 and v3 cases lumv1 points to data */
|
||||
@ -1780,8 +1780,7 @@ out_quotactl:
|
||||
return ll_flush_ctx(inode);
|
||||
#ifdef CONFIG_FS_POSIX_ACL
|
||||
case LL_IOC_RMTACL: {
|
||||
if (sbi->ll_flags & LL_SBI_RMT_CLIENT &&
|
||||
inode == inode->i_sb->s_root->d_inode) {
|
||||
if (sbi->ll_flags & LL_SBI_RMT_CLIENT && is_root_inode(inode)) {
|
||||
struct ll_file_data *fd = LUSTRE_FPRIVATE(file);
|
||||
|
||||
LASSERT(fd != NULL);
|
||||
|
@ -266,6 +266,10 @@ static int ll_md_close(struct obd_export *md_exp, struct inode *inode,
|
||||
{
|
||||
struct ll_file_data *fd = LUSTRE_FPRIVATE(file);
|
||||
struct ll_inode_info *lli = ll_i2info(inode);
|
||||
int lockmode;
|
||||
__u64 flags = LDLM_FL_BLOCK_GRANTED | LDLM_FL_TEST_LOCK;
|
||||
struct lustre_handle lockh;
|
||||
ldlm_policy_data_t policy = {.l_inodebits={MDS_INODELOCK_OPEN}};
|
||||
int rc = 0;
|
||||
|
||||
/* clear group lock, if present */
|
||||
@ -292,39 +296,26 @@ static int ll_md_close(struct obd_export *md_exp, struct inode *inode,
|
||||
|
||||
/* Let's see if we have good enough OPEN lock on the file and if
|
||||
we can skip talking to MDS */
|
||||
if (file->f_dentry->d_inode) { /* Can this ever be false? */
|
||||
int lockmode;
|
||||
__u64 flags = LDLM_FL_BLOCK_GRANTED | LDLM_FL_TEST_LOCK;
|
||||
struct lustre_handle lockh;
|
||||
struct inode *inode = file->f_dentry->d_inode;
|
||||
ldlm_policy_data_t policy = {.l_inodebits={MDS_INODELOCK_OPEN}};
|
||||
|
||||
mutex_lock(&lli->lli_och_mutex);
|
||||
if (fd->fd_omode & FMODE_WRITE) {
|
||||
lockmode = LCK_CW;
|
||||
LASSERT(lli->lli_open_fd_write_count);
|
||||
lli->lli_open_fd_write_count--;
|
||||
} else if (fd->fd_omode & FMODE_EXEC) {
|
||||
lockmode = LCK_PR;
|
||||
LASSERT(lli->lli_open_fd_exec_count);
|
||||
lli->lli_open_fd_exec_count--;
|
||||
} else {
|
||||
lockmode = LCK_CR;
|
||||
LASSERT(lli->lli_open_fd_read_count);
|
||||
lli->lli_open_fd_read_count--;
|
||||
}
|
||||
mutex_unlock(&lli->lli_och_mutex);
|
||||
|
||||
if (!md_lock_match(md_exp, flags, ll_inode2fid(inode),
|
||||
LDLM_IBITS, &policy, lockmode,
|
||||
&lockh)) {
|
||||
rc = ll_md_real_close(file->f_dentry->d_inode,
|
||||
fd->fd_omode);
|
||||
}
|
||||
mutex_lock(&lli->lli_och_mutex);
|
||||
if (fd->fd_omode & FMODE_WRITE) {
|
||||
lockmode = LCK_CW;
|
||||
LASSERT(lli->lli_open_fd_write_count);
|
||||
lli->lli_open_fd_write_count--;
|
||||
} else if (fd->fd_omode & FMODE_EXEC) {
|
||||
lockmode = LCK_PR;
|
||||
LASSERT(lli->lli_open_fd_exec_count);
|
||||
lli->lli_open_fd_exec_count--;
|
||||
} else {
|
||||
CERROR("Releasing a file %p with negative dentry %p. Name %s",
|
||||
file, file->f_dentry, file->f_dentry->d_name.name);
|
||||
lockmode = LCK_CR;
|
||||
LASSERT(lli->lli_open_fd_read_count);
|
||||
lli->lli_open_fd_read_count--;
|
||||
}
|
||||
mutex_unlock(&lli->lli_och_mutex);
|
||||
|
||||
if (!md_lock_match(md_exp, flags, ll_inode2fid(inode),
|
||||
LDLM_IBITS, &policy, lockmode, &lockh))
|
||||
rc = ll_md_real_close(inode, fd->fd_omode);
|
||||
|
||||
out:
|
||||
LUSTRE_FPRIVATE(file) = NULL;
|
||||
@ -350,8 +341,7 @@ int ll_file_release(struct inode *inode, struct file *file)
|
||||
inode->i_generation, inode);
|
||||
|
||||
#ifdef CONFIG_FS_POSIX_ACL
|
||||
if (sbi->ll_flags & LL_SBI_RMT_CLIENT &&
|
||||
inode == inode->i_sb->s_root->d_inode) {
|
||||
if (sbi->ll_flags & LL_SBI_RMT_CLIENT && is_root_inode(inode)) {
|
||||
struct ll_file_data *fd = LUSTRE_FPRIVATE(file);
|
||||
|
||||
LASSERT(fd != NULL);
|
||||
@ -363,7 +353,7 @@ int ll_file_release(struct inode *inode, struct file *file)
|
||||
}
|
||||
#endif
|
||||
|
||||
if (inode->i_sb->s_root != file->f_dentry)
|
||||
if (!is_root_inode(inode))
|
||||
ll_stats_ops_tally(sbi, LPROC_LL_RELEASE, 1);
|
||||
fd = LUSTRE_FPRIVATE(file);
|
||||
LASSERT(fd != NULL);
|
||||
@ -375,7 +365,7 @@ int ll_file_release(struct inode *inode, struct file *file)
|
||||
lli->lli_opendir_pid != 0)
|
||||
ll_stop_statahead(inode, lli->lli_opendir_key);
|
||||
|
||||
if (inode->i_sb->s_root == file->f_dentry) {
|
||||
if (is_root_inode(inode)) {
|
||||
LUSTRE_FPRIVATE(file) = NULL;
|
||||
ll_file_data_put(fd);
|
||||
return 0;
|
||||
@ -394,21 +384,19 @@ int ll_file_release(struct inode *inode, struct file *file)
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int ll_intent_file_open(struct file *file, void *lmm,
|
||||
static int ll_intent_file_open(struct dentry *dentry, void *lmm,
|
||||
int lmmsize, struct lookup_intent *itp)
|
||||
{
|
||||
struct ll_sb_info *sbi = ll_i2sbi(file->f_dentry->d_inode);
|
||||
struct dentry *parent = file->f_dentry->d_parent;
|
||||
const char *name = file->f_dentry->d_name.name;
|
||||
const int len = file->f_dentry->d_name.len;
|
||||
struct inode *inode = dentry->d_inode;
|
||||
struct ll_sb_info *sbi = ll_i2sbi(inode);
|
||||
struct dentry *parent = dentry->d_parent;
|
||||
const char *name = dentry->d_name.name;
|
||||
const int len = dentry->d_name.len;
|
||||
struct md_op_data *op_data;
|
||||
struct ptlrpc_request *req;
|
||||
__u32 opc = LUSTRE_OPC_ANY;
|
||||
int rc;
|
||||
|
||||
if (!parent)
|
||||
return -ENOENT;
|
||||
|
||||
/* Usually we come here only for NFSD, and we want open lock.
|
||||
But we can also get here with pre 2.6.15 patchless kernels, and in
|
||||
that case that lock is also ok */
|
||||
@ -425,7 +413,7 @@ static int ll_intent_file_open(struct file *file, void *lmm,
|
||||
}
|
||||
|
||||
op_data = ll_prep_md_op_data(NULL, parent->d_inode,
|
||||
file->f_dentry->d_inode, name, len,
|
||||
inode, name, len,
|
||||
O_RDWR, opc, NULL);
|
||||
if (IS_ERR(op_data))
|
||||
return PTR_ERR(op_data);
|
||||
@ -441,7 +429,7 @@ static int ll_intent_file_open(struct file *file, void *lmm,
|
||||
if (!it_disposition(itp, DISP_OPEN_OPEN) ||
|
||||
it_open_error(DISP_OPEN_OPEN, itp))
|
||||
goto out;
|
||||
ll_release_openhandle(file->f_dentry, itp);
|
||||
ll_release_openhandle(inode, itp);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -456,10 +444,9 @@ static int ll_intent_file_open(struct file *file, void *lmm,
|
||||
goto out;
|
||||
}
|
||||
|
||||
rc = ll_prep_inode(&file->f_dentry->d_inode, req, NULL, itp);
|
||||
rc = ll_prep_inode(&inode, req, NULL, itp);
|
||||
if (!rc && itp->d.lustre.it_lock_mode)
|
||||
ll_set_lock_data(sbi->ll_md_exp, file->f_dentry->d_inode,
|
||||
itp, NULL);
|
||||
ll_set_lock_data(sbi->ll_md_exp, inode, itp, NULL);
|
||||
|
||||
out:
|
||||
ptlrpc_req_finished(req);
|
||||
@ -501,7 +488,7 @@ static int ll_och_fill(struct obd_export *md_exp, struct lookup_intent *it,
|
||||
static int ll_local_open(struct file *file, struct lookup_intent *it,
|
||||
struct ll_file_data *fd, struct obd_client_handle *och)
|
||||
{
|
||||
struct inode *inode = file->f_dentry->d_inode;
|
||||
struct inode *inode = file_inode(file);
|
||||
struct ll_inode_info *lli = ll_i2info(inode);
|
||||
|
||||
LASSERT(!LUSTRE_FPRIVATE(file));
|
||||
@ -574,7 +561,7 @@ int ll_file_open(struct inode *inode, struct file *file)
|
||||
spin_unlock(&lli->lli_sa_lock);
|
||||
}
|
||||
|
||||
if (inode->i_sb->s_root == file->f_dentry) {
|
||||
if (is_root_inode(inode)) {
|
||||
LUSTRE_FPRIVATE(file) = fd;
|
||||
return 0;
|
||||
}
|
||||
@ -632,7 +619,7 @@ restart:
|
||||
goto out_openerr;
|
||||
}
|
||||
|
||||
ll_release_openhandle(file->f_dentry, it);
|
||||
ll_release_openhandle(inode, it);
|
||||
}
|
||||
(*och_usecount)++;
|
||||
|
||||
@ -652,7 +639,7 @@ restart:
|
||||
result in a deadlock */
|
||||
mutex_unlock(&lli->lli_och_mutex);
|
||||
it->it_create_mode |= M_CHECK_STALE;
|
||||
rc = ll_intent_file_open(file, NULL, 0, it);
|
||||
rc = ll_intent_file_open(file->f_path.dentry, NULL, 0, it);
|
||||
it->it_create_mode &= ~M_CHECK_STALE;
|
||||
if (rc)
|
||||
goto out_openerr;
|
||||
@ -1065,7 +1052,7 @@ int ll_glimpse_ioctl(struct ll_sb_info *sbi, struct lov_stripe_md *lsm,
|
||||
static bool file_is_noatime(const struct file *file)
|
||||
{
|
||||
const struct vfsmount *mnt = file->f_path.mnt;
|
||||
const struct inode *inode = file->f_path.dentry->d_inode;
|
||||
const struct inode *inode = file_inode(file);
|
||||
|
||||
/* Adapted from file_accessed() and touch_atime().*/
|
||||
if (file->f_flags & O_NOATIME)
|
||||
@ -1091,7 +1078,7 @@ static bool file_is_noatime(const struct file *file)
|
||||
|
||||
void ll_io_init(struct cl_io *io, const struct file *file, int write)
|
||||
{
|
||||
struct inode *inode = file->f_dentry->d_inode;
|
||||
struct inode *inode = file_inode(file);
|
||||
|
||||
io->u.ci_rw.crw_nonblock = file->f_flags & O_NONBLOCK;
|
||||
if (write) {
|
||||
@ -1117,7 +1104,7 @@ ll_file_io_generic(const struct lu_env *env, struct vvp_io_args *args,
|
||||
struct file *file, enum cl_io_type iot,
|
||||
loff_t *ppos, size_t count)
|
||||
{
|
||||
struct ll_inode_info *lli = ll_i2info(file->f_dentry->d_inode);
|
||||
struct ll_inode_info *lli = ll_i2info(file_inode(file));
|
||||
struct ll_file_data *fd = LUSTRE_FPRIVATE(file);
|
||||
struct cl_io *io;
|
||||
ssize_t result;
|
||||
@ -1178,20 +1165,20 @@ out:
|
||||
/* If any bit been read/written (result != 0), we just return
|
||||
* short read/write instead of restart io. */
|
||||
if ((result == 0 || result == -ENODATA) && io->ci_need_restart) {
|
||||
CDEBUG(D_VFSTRACE, "Restart %s on %s from %lld, count:%zd\n",
|
||||
CDEBUG(D_VFSTRACE, "Restart %s on %pD from %lld, count:%zd\n",
|
||||
iot == CIT_READ ? "read" : "write",
|
||||
file->f_dentry->d_name.name, *ppos, count);
|
||||
file, *ppos, count);
|
||||
LASSERTF(io->ci_nob == 0, "%zd", io->ci_nob);
|
||||
goto restart;
|
||||
}
|
||||
|
||||
if (iot == CIT_READ) {
|
||||
if (result >= 0)
|
||||
ll_stats_ops_tally(ll_i2sbi(file->f_dentry->d_inode),
|
||||
ll_stats_ops_tally(ll_i2sbi(file_inode(file)),
|
||||
LPROC_LL_READ_BYTES, result);
|
||||
} else if (iot == CIT_WRITE) {
|
||||
if (result >= 0) {
|
||||
ll_stats_ops_tally(ll_i2sbi(file->f_dentry->d_inode),
|
||||
ll_stats_ops_tally(ll_i2sbi(file_inode(file)),
|
||||
LPROC_LL_WRITE_BYTES, result);
|
||||
fd->fd_write_failed = false;
|
||||
} else if (result != -ERESTARTSYS) {
|
||||
@ -1354,7 +1341,7 @@ static int ll_lov_recreate_fid(struct inode *inode, unsigned long arg)
|
||||
return ll_lov_recreate(inode, &oi, ost_idx);
|
||||
}
|
||||
|
||||
int ll_lov_setstripe_ea_info(struct inode *inode, struct file *file,
|
||||
int ll_lov_setstripe_ea_info(struct inode *inode, struct dentry *dentry,
|
||||
int flags, struct lov_user_md *lum, int lum_size)
|
||||
{
|
||||
struct lov_stripe_md *lsm = NULL;
|
||||
@ -1371,21 +1358,20 @@ int ll_lov_setstripe_ea_info(struct inode *inode, struct file *file,
|
||||
}
|
||||
|
||||
ll_inode_size_lock(inode);
|
||||
rc = ll_intent_file_open(file, lum, lum_size, &oit);
|
||||
rc = ll_intent_file_open(dentry, lum, lum_size, &oit);
|
||||
if (rc)
|
||||
goto out_unlock;
|
||||
rc = oit.d.lustre.it_status;
|
||||
if (rc < 0)
|
||||
goto out_req_free;
|
||||
|
||||
ll_release_openhandle(file->f_dentry, &oit);
|
||||
ll_release_openhandle(inode, &oit);
|
||||
|
||||
out_unlock:
|
||||
ll_inode_size_unlock(inode);
|
||||
ll_intent_release(&oit);
|
||||
ccc_inode_lsm_put(inode, lsm);
|
||||
out:
|
||||
cl_lov_delay_create_clear(&file->f_flags);
|
||||
return rc;
|
||||
out_req_free:
|
||||
ptlrpc_req_finished((struct ptlrpc_request *) oit.d.lustre.it_data);
|
||||
@ -1499,7 +1485,9 @@ static int ll_lov_setea(struct inode *inode, struct file *file,
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
rc = ll_lov_setstripe_ea_info(inode, file, flags, lump, lum_size);
|
||||
rc = ll_lov_setstripe_ea_info(inode, file->f_path.dentry, flags, lump,
|
||||
lum_size);
|
||||
cl_lov_delay_create_clear(&file->f_flags);
|
||||
|
||||
OBD_FREE_LARGE(lump, lum_size);
|
||||
return rc;
|
||||
@ -1526,7 +1514,9 @@ static int ll_lov_setstripe(struct inode *inode, struct file *file,
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
rc = ll_lov_setstripe_ea_info(inode, file, flags, lumv1, lum_size);
|
||||
rc = ll_lov_setstripe_ea_info(inode, file->f_path.dentry, flags, lumv1,
|
||||
lum_size);
|
||||
cl_lov_delay_create_clear(&file->f_flags);
|
||||
if (rc == 0) {
|
||||
struct lov_stripe_md *lsm;
|
||||
__u32 gen;
|
||||
@ -1631,22 +1621,21 @@ int ll_put_grouplock(struct inode *inode, struct file *file, unsigned long arg)
|
||||
/**
|
||||
* Close inode open handle
|
||||
*
|
||||
* \param dentry [in] dentry which contains the inode
|
||||
* \param inode [in] inode in question
|
||||
* \param it [in,out] intent which contains open info and result
|
||||
*
|
||||
* \retval 0 success
|
||||
* \retval <0 failure
|
||||
*/
|
||||
int ll_release_openhandle(struct dentry *dentry, struct lookup_intent *it)
|
||||
int ll_release_openhandle(struct inode *inode, struct lookup_intent *it)
|
||||
{
|
||||
struct inode *inode = dentry->d_inode;
|
||||
struct obd_client_handle *och;
|
||||
int rc;
|
||||
|
||||
LASSERT(inode);
|
||||
|
||||
/* Root ? Do nothing. */
|
||||
if (dentry->d_inode->i_sb->s_root == dentry)
|
||||
if (is_root_inode(inode))
|
||||
return 0;
|
||||
|
||||
/* No open handle to close? Move away */
|
||||
@ -1959,8 +1948,8 @@ static int ll_swap_layouts(struct file *file1, struct file *file2,
|
||||
if (!llss)
|
||||
return -ENOMEM;
|
||||
|
||||
llss->inode1 = file1->f_dentry->d_inode;
|
||||
llss->inode2 = file2->f_dentry->d_inode;
|
||||
llss->inode1 = file_inode(file1);
|
||||
llss->inode2 = file_inode(file2);
|
||||
|
||||
if (!S_ISREG(llss->inode2->i_mode)) {
|
||||
rc = -EINVAL;
|
||||
@ -2204,7 +2193,7 @@ out:
|
||||
static long
|
||||
ll_file_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct inode *inode = file->f_dentry->d_inode;
|
||||
struct inode *inode = file_inode(file);
|
||||
struct ll_file_data *fd = LUSTRE_FPRIVATE(file);
|
||||
int flags, rc;
|
||||
|
||||
@ -2523,7 +2512,7 @@ ll_file_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
|
||||
static loff_t ll_file_seek(struct file *file, loff_t offset, int origin)
|
||||
{
|
||||
struct inode *inode = file->f_dentry->d_inode;
|
||||
struct inode *inode = file_inode(file);
|
||||
loff_t retval, eof = 0;
|
||||
|
||||
retval = offset + ((origin == SEEK_END) ? i_size_read(inode) :
|
||||
@ -2547,7 +2536,7 @@ static loff_t ll_file_seek(struct file *file, loff_t offset, int origin)
|
||||
|
||||
static int ll_flush(struct file *file, fl_owner_t id)
|
||||
{
|
||||
struct inode *inode = file->f_dentry->d_inode;
|
||||
struct inode *inode = file_inode(file);
|
||||
struct ll_inode_info *lli = ll_i2info(inode);
|
||||
struct ll_file_data *fd = LUSTRE_FPRIVATE(file);
|
||||
int rc, err;
|
||||
@ -2624,8 +2613,7 @@ int cl_sync_file_range(struct inode *inode, loff_t start, loff_t end,
|
||||
|
||||
int ll_fsync(struct file *file, loff_t start, loff_t end, int datasync)
|
||||
{
|
||||
struct dentry *dentry = file->f_dentry;
|
||||
struct inode *inode = dentry->d_inode;
|
||||
struct inode *inode = file_inode(file);
|
||||
struct ll_inode_info *lli = ll_i2info(inode);
|
||||
struct ptlrpc_request *req;
|
||||
struct obd_capa *oc;
|
||||
@ -2678,7 +2666,7 @@ int ll_fsync(struct file *file, loff_t start, loff_t end, int datasync)
|
||||
static int
|
||||
ll_file_flock(struct file *file, int cmd, struct file_lock *file_lock)
|
||||
{
|
||||
struct inode *inode = file->f_dentry->d_inode;
|
||||
struct inode *inode = file_inode(file);
|
||||
struct ll_sb_info *sbi = ll_i2sbi(inode);
|
||||
struct ldlm_enqueue_info einfo = {
|
||||
.ei_type = LDLM_FLOCK,
|
||||
@ -2902,8 +2890,8 @@ static int __ll_inode_revalidate(struct dentry *dentry, __u64 ibits)
|
||||
|
||||
LASSERT(inode != NULL);
|
||||
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p),name=%s\n",
|
||||
inode->i_ino, inode->i_generation, inode, dentry->d_name.name);
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p),name=%pd\n",
|
||||
inode->i_ino, inode->i_generation, inode, dentry);
|
||||
|
||||
exp = ll_i2mdexp(inode);
|
||||
|
||||
@ -3113,7 +3101,7 @@ int ll_inode_permission(struct inode *inode, int mask)
|
||||
/* as root inode are NOT getting validated in lookup operation,
|
||||
* need to do it before permission check. */
|
||||
|
||||
if (inode == inode->i_sb->s_root->d_inode) {
|
||||
if (is_root_inode(inode)) {
|
||||
rc = __ll_inode_revalidate(inode->i_sb->s_root,
|
||||
MDS_INODELOCK_LOOKUP);
|
||||
if (rc)
|
||||
|
@ -748,7 +748,7 @@ int ll_file_release(struct inode *inode, struct file *file);
|
||||
int ll_glimpse_ioctl(struct ll_sb_info *sbi,
|
||||
struct lov_stripe_md *lsm, lstat_t *st);
|
||||
void ll_ioepoch_open(struct ll_inode_info *lli, __u64 ioepoch);
|
||||
int ll_release_openhandle(struct dentry *, struct lookup_intent *);
|
||||
int ll_release_openhandle(struct inode *, struct lookup_intent *);
|
||||
int ll_md_real_close(struct inode *inode, fmode_t fmode);
|
||||
void ll_ioepoch_close(struct inode *inode, struct md_op_data *op_data,
|
||||
struct obd_client_handle **och, unsigned long flags);
|
||||
@ -763,7 +763,7 @@ struct posix_acl *ll_get_acl(struct inode *inode, int type);
|
||||
|
||||
int ll_inode_permission(struct inode *inode, int mask);
|
||||
|
||||
int ll_lov_setstripe_ea_info(struct inode *inode, struct file *file,
|
||||
int ll_lov_setstripe_ea_info(struct inode *inode, struct dentry *dentry,
|
||||
int flags, struct lov_user_md *lum,
|
||||
int lum_size);
|
||||
int ll_lov_getstripe_ea_info(struct inode *inode, const char *filename,
|
||||
@ -1413,7 +1413,7 @@ extern ssize_t ll_direct_rw_pages(const struct lu_env *env, struct cl_io *io,
|
||||
static inline int ll_file_nolock(const struct file *file)
|
||||
{
|
||||
struct ll_file_data *fd = LUSTRE_FPRIVATE(file);
|
||||
struct inode *inode = file->f_dentry->d_inode;
|
||||
struct inode *inode = file_inode(file);
|
||||
|
||||
LASSERT(fd != NULL);
|
||||
return ((fd->fd_flags & LL_FILE_IGNORE_LOCK) ||
|
||||
@ -1489,8 +1489,8 @@ static inline void __d_lustre_invalidate(struct dentry *dentry)
|
||||
*/
|
||||
static inline void d_lustre_invalidate(struct dentry *dentry, int nested)
|
||||
{
|
||||
CDEBUG(D_DENTRY, "invalidate dentry %.*s (%p) parent %p inode %p "
|
||||
"refc %d\n", dentry->d_name.len, dentry->d_name.name, dentry,
|
||||
CDEBUG(D_DENTRY, "invalidate dentry %pd (%p) parent %p inode %p "
|
||||
"refc %d\n", dentry, dentry,
|
||||
dentry->d_parent, dentry->d_inode, d_count(dentry));
|
||||
|
||||
spin_lock_nested(&dentry->d_lock,
|
||||
|
@ -698,10 +698,8 @@ void lustre_dump_dentry(struct dentry *dentry, int recur)
|
||||
list_for_each(tmp, &dentry->d_subdirs)
|
||||
subdirs++;
|
||||
|
||||
CERROR("dentry %p dump: name=%.*s parent=%.*s (%p), inode=%p, count=%u,"
|
||||
" flags=0x%x, fsdata=%p, %d subdirs\n", dentry,
|
||||
dentry->d_name.len, dentry->d_name.name,
|
||||
dentry->d_parent->d_name.len, dentry->d_parent->d_name.name,
|
||||
CERROR("dentry %p dump: name=%pd parent=%p, inode=%p, count=%u,"
|
||||
" flags=0x%x, fsdata=%p, %d subdirs\n", dentry, dentry,
|
||||
dentry->d_parent, dentry->d_inode, d_count(dentry),
|
||||
dentry->d_flags, dentry->d_fsdata, subdirs);
|
||||
if (dentry->d_inode != NULL)
|
||||
|
@ -100,7 +100,7 @@ ll_fault_io_init(struct vm_area_struct *vma, struct lu_env **env_ret,
|
||||
unsigned long *ra_flags)
|
||||
{
|
||||
struct file *file = vma->vm_file;
|
||||
struct inode *inode = file->f_dentry->d_inode;
|
||||
struct inode *inode = file_inode(file);
|
||||
struct cl_io *io;
|
||||
struct cl_fault_io *fio;
|
||||
struct lu_env *env;
|
||||
@ -213,7 +213,7 @@ static int ll_page_mkwrite0(struct vm_area_struct *vma, struct page *vmpage,
|
||||
cfs_restore_sigs(set);
|
||||
|
||||
if (result == 0) {
|
||||
struct inode *inode = vma->vm_file->f_dentry->d_inode;
|
||||
struct inode *inode = file_inode(vma->vm_file);
|
||||
struct ll_inode_info *lli = ll_i2info(inode);
|
||||
|
||||
lock_page(vmpage);
|
||||
@ -396,7 +396,7 @@ static int ll_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
|
||||
CWARN("app(%s): the page %lu of file %lu is under heavy"
|
||||
" contention.\n",
|
||||
current->comm, vmf->pgoff,
|
||||
vma->vm_file->f_dentry->d_inode->i_ino);
|
||||
file_inode(vma->vm_file)->i_ino);
|
||||
printed = true;
|
||||
}
|
||||
} while (retry);
|
||||
@ -430,7 +430,7 @@ static int ll_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
|
||||
*/
|
||||
static void ll_vm_open(struct vm_area_struct *vma)
|
||||
{
|
||||
struct inode *inode = vma->vm_file->f_dentry->d_inode;
|
||||
struct inode *inode = file_inode(vma->vm_file);
|
||||
struct ccc_object *vob = cl_inode2ccc(inode);
|
||||
|
||||
LASSERT(vma->vm_file);
|
||||
@ -443,7 +443,7 @@ static void ll_vm_open(struct vm_area_struct *vma)
|
||||
*/
|
||||
static void ll_vm_close(struct vm_area_struct *vma)
|
||||
{
|
||||
struct inode *inode = vma->vm_file->f_dentry->d_inode;
|
||||
struct inode *inode = file_inode(vma->vm_file);
|
||||
struct ccc_object *vob = cl_inode2ccc(inode);
|
||||
|
||||
LASSERT(vma->vm_file);
|
||||
@ -476,7 +476,7 @@ static const struct vm_operations_struct ll_file_vm_ops = {
|
||||
|
||||
int ll_file_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
{
|
||||
struct inode *inode = file->f_dentry->d_inode;
|
||||
struct inode *inode = file_inode(file);
|
||||
int rc;
|
||||
|
||||
if (ll_file_nolock(file))
|
||||
|
@ -187,7 +187,7 @@ static int do_bio_lustrebacked(struct lloop_device *lo, struct bio *head)
|
||||
{
|
||||
const struct lu_env *env = lo->lo_env;
|
||||
struct cl_io *io = &lo->lo_io;
|
||||
struct inode *inode = lo->lo_backing_file->f_dentry->d_inode;
|
||||
struct inode *inode = file_inode(lo->lo_backing_file);
|
||||
struct cl_object *obj = ll_i2info(inode)->lli_clob;
|
||||
pgoff_t offset;
|
||||
int ret;
|
||||
@ -626,7 +626,7 @@ static int lo_ioctl(struct block_device *bdev, fmode_t mode,
|
||||
break;
|
||||
}
|
||||
if (inode == NULL)
|
||||
inode = lo->lo_backing_file->f_dentry->d_inode;
|
||||
inode = file_inode(lo->lo_backing_file);
|
||||
if (lo->lo_state == LLOOP_BOUND)
|
||||
fid = ll_i2info(inode)->lli_fid;
|
||||
else
|
||||
@ -692,8 +692,7 @@ static enum llioc_iter lloop_ioctl(struct inode *unused, struct file *file,
|
||||
lo_free = lo;
|
||||
continue;
|
||||
}
|
||||
if (lo->lo_backing_file->f_dentry->d_inode ==
|
||||
file->f_dentry->d_inode)
|
||||
if (file_inode(lo->lo_backing_file) == file_inode(file))
|
||||
break;
|
||||
}
|
||||
if (lo || !lo_free) {
|
||||
|
@ -54,27 +54,6 @@
|
||||
static int ll_create_it(struct inode *, struct dentry *,
|
||||
int, struct lookup_intent *);
|
||||
|
||||
/*
|
||||
* Check if we have something mounted at the named dchild.
|
||||
* In such a case there would always be dentry present.
|
||||
*/
|
||||
static int ll_d_mountpoint(struct dentry *dparent, struct dentry *dchild,
|
||||
struct qstr *name)
|
||||
{
|
||||
int mounted = 0;
|
||||
|
||||
if (unlikely(dchild)) {
|
||||
mounted = d_mountpoint(dchild);
|
||||
} else if (dparent) {
|
||||
dchild = d_lookup(dparent, name);
|
||||
if (dchild) {
|
||||
mounted = d_mountpoint(dchild);
|
||||
dput(dchild);
|
||||
}
|
||||
}
|
||||
return mounted;
|
||||
}
|
||||
|
||||
/* called from iget5_locked->find_inode() under inode_hash_lock spinlock */
|
||||
static int ll_test_inode(struct inode *inode, void *opaque)
|
||||
{
|
||||
@ -285,7 +264,7 @@ int ll_md_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc,
|
||||
|
||||
if ((bits & (MDS_INODELOCK_LOOKUP | MDS_INODELOCK_PERM)) &&
|
||||
inode->i_sb->s_root != NULL &&
|
||||
inode != inode->i_sb->s_root->d_inode)
|
||||
is_root_inode(inode))
|
||||
ll_invalidate_aliases(inode);
|
||||
|
||||
iput(inode);
|
||||
@ -509,8 +488,8 @@ static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry,
|
||||
if (dentry->d_name.len > ll_i2sbi(parent)->ll_namelen)
|
||||
return ERR_PTR(-ENAMETOOLONG);
|
||||
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p),intent=%s\n",
|
||||
dentry->d_name.len, dentry->d_name.name, parent->i_ino,
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:name=%pd,dir=%lu/%u(%p),intent=%s\n",
|
||||
dentry, parent->i_ino,
|
||||
parent->i_generation, parent, LL_IT2STR(it));
|
||||
|
||||
if (d_mountpoint(dentry))
|
||||
@ -563,7 +542,7 @@ static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry,
|
||||
if ((it->it_op & IT_OPEN) && dentry->d_inode &&
|
||||
!S_ISREG(dentry->d_inode->i_mode) &&
|
||||
!S_ISDIR(dentry->d_inode->i_mode)) {
|
||||
ll_release_openhandle(dentry, it);
|
||||
ll_release_openhandle(dentry->d_inode, it);
|
||||
}
|
||||
ll_lookup_finish_locks(it, dentry);
|
||||
|
||||
@ -586,8 +565,8 @@ static struct dentry *ll_lookup_nd(struct inode *parent, struct dentry *dentry,
|
||||
struct lookup_intent *itp, it = { .it_op = IT_GETATTR };
|
||||
struct dentry *de;
|
||||
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p),flags=%u\n",
|
||||
dentry->d_name.len, dentry->d_name.name, parent->i_ino,
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:name=%pd,dir=%lu/%u(%p),flags=%u\n",
|
||||
dentry, parent->i_ino,
|
||||
parent->i_generation, parent, flags);
|
||||
|
||||
/* Optimize away (CREATE && !OPEN). Let .create handle the race. */
|
||||
@ -619,9 +598,9 @@ static int ll_atomic_open(struct inode *dir, struct dentry *dentry,
|
||||
long long lookup_flags = LOOKUP_OPEN;
|
||||
int rc = 0;
|
||||
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p),file %p,"
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:name=%pd,dir=%lu/%u(%p),file %p,"
|
||||
"open_flags %x,mode %x opened %d\n",
|
||||
dentry->d_name.len, dentry->d_name.name, dir->i_ino,
|
||||
dentry, dir->i_ino,
|
||||
dir->i_generation, dir, file, open_flags, mode, *opened);
|
||||
|
||||
it = kzalloc(sizeof(*it), GFP_NOFS);
|
||||
@ -741,8 +720,8 @@ static int ll_create_it(struct inode *dir, struct dentry *dentry, int mode,
|
||||
struct inode *inode;
|
||||
int rc = 0;
|
||||
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p),intent=%s\n",
|
||||
dentry->d_name.len, dentry->d_name.name, dir->i_ino,
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:name=%pd,dir=%lu/%u(%p),intent=%s\n",
|
||||
dentry, dir->i_ino,
|
||||
dir->i_generation, dir, LL_IT2STR(it));
|
||||
|
||||
rc = it_open_error(DISP_OPEN_CREATE, it);
|
||||
@ -775,9 +754,9 @@ static void ll_update_times(struct ptlrpc_request *request,
|
||||
LTIME_S(inode->i_ctime) = body->ctime;
|
||||
}
|
||||
|
||||
static int ll_new_node(struct inode *dir, struct qstr *name,
|
||||
static int ll_new_node(struct inode *dir, struct dentry *dentry,
|
||||
const char *tgt, int mode, int rdev,
|
||||
struct dentry *dchild, __u32 opc)
|
||||
__u32 opc)
|
||||
{
|
||||
struct ptlrpc_request *request = NULL;
|
||||
struct md_op_data *op_data;
|
||||
@ -789,8 +768,10 @@ static int ll_new_node(struct inode *dir, struct qstr *name,
|
||||
if (unlikely(tgt != NULL))
|
||||
tgt_len = strlen(tgt) + 1;
|
||||
|
||||
op_data = ll_prep_md_op_data(NULL, dir, NULL, name->name,
|
||||
name->len, 0, opc, NULL);
|
||||
op_data = ll_prep_md_op_data(NULL, dir, NULL,
|
||||
dentry->d_name.name,
|
||||
dentry->d_name.len,
|
||||
0, opc, NULL);
|
||||
if (IS_ERR(op_data)) {
|
||||
err = PTR_ERR(op_data);
|
||||
goto err_exit;
|
||||
@ -806,27 +787,25 @@ static int ll_new_node(struct inode *dir, struct qstr *name,
|
||||
|
||||
ll_update_times(request, dir);
|
||||
|
||||
if (dchild) {
|
||||
err = ll_prep_inode(&inode, request, dchild->d_sb, NULL);
|
||||
if (err)
|
||||
goto err_exit;
|
||||
err = ll_prep_inode(&inode, request, dir->i_sb, NULL);
|
||||
if (err)
|
||||
goto err_exit;
|
||||
|
||||
d_instantiate(dchild, inode);
|
||||
}
|
||||
d_instantiate(dentry, inode);
|
||||
err_exit:
|
||||
ptlrpc_req_finished(request);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ll_mknod_generic(struct inode *dir, struct qstr *name, int mode,
|
||||
unsigned rdev, struct dentry *dchild)
|
||||
static int ll_mknod(struct inode *dir, struct dentry *dchild,
|
||||
umode_t mode, dev_t rdev)
|
||||
{
|
||||
int err;
|
||||
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p) mode %o dev %x\n",
|
||||
name->len, name->name, dir->i_ino, dir->i_generation, dir,
|
||||
mode, rdev);
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:name=%pd,dir=%lu/%u(%p) mode %o dev %x\n",
|
||||
dchild, dir->i_ino, dir->i_generation, dir,
|
||||
mode, old_encode_dev(rdev));
|
||||
|
||||
if (!IS_POSIXACL(dir) || !exp_connect_umask(ll_i2mdexp(dir)))
|
||||
mode &= ~current_umask();
|
||||
@ -839,7 +818,8 @@ static int ll_mknod_generic(struct inode *dir, struct qstr *name, int mode,
|
||||
case S_IFBLK:
|
||||
case S_IFIFO:
|
||||
case S_IFSOCK:
|
||||
err = ll_new_node(dir, name, NULL, mode, rdev, dchild,
|
||||
err = ll_new_node(dir, dchild, NULL, mode,
|
||||
old_encode_dev(rdev),
|
||||
LUSTRE_OPC_MKNOD);
|
||||
break;
|
||||
case S_IFDIR:
|
||||
@ -863,134 +843,25 @@ static int ll_create_nd(struct inode *dir, struct dentry *dentry,
|
||||
{
|
||||
int rc;
|
||||
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p),"
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:name=%pd,dir=%lu/%u(%p),"
|
||||
"flags=%u, excl=%d\n",
|
||||
dentry->d_name.len, dentry->d_name.name, dir->i_ino,
|
||||
dentry, dir->i_ino,
|
||||
dir->i_generation, dir, mode, want_excl);
|
||||
|
||||
rc = ll_mknod_generic(dir, &dentry->d_name, mode, 0, dentry);
|
||||
rc = ll_mknod(dir, dentry, mode, 0);
|
||||
|
||||
ll_stats_ops_tally(ll_i2sbi(dir), LPROC_LL_CREATE, 1);
|
||||
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s, unhashed %d\n",
|
||||
dentry->d_name.len, dentry->d_name.name, d_unhashed(dentry));
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:name=%pd, unhashed %d\n",
|
||||
dentry, d_unhashed(dentry));
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int ll_symlink_generic(struct inode *dir, struct qstr *name,
|
||||
const char *tgt, struct dentry *dchild)
|
||||
static inline void ll_get_child_fid(struct dentry *child, struct lu_fid *fid)
|
||||
{
|
||||
int err;
|
||||
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p),target=%.*s\n",
|
||||
name->len, name->name, dir->i_ino, dir->i_generation,
|
||||
dir, 3000, tgt);
|
||||
|
||||
err = ll_new_node(dir, name, (char *)tgt, S_IFLNK | S_IRWXUGO,
|
||||
0, dchild, LUSTRE_OPC_SYMLINK);
|
||||
|
||||
if (!err)
|
||||
ll_stats_ops_tally(ll_i2sbi(dir), LPROC_LL_SYMLINK, 1);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ll_link_generic(struct inode *src, struct inode *dir,
|
||||
struct qstr *name, struct dentry *dchild)
|
||||
{
|
||||
struct ll_sb_info *sbi = ll_i2sbi(dir);
|
||||
struct ptlrpc_request *request = NULL;
|
||||
struct md_op_data *op_data;
|
||||
int err;
|
||||
|
||||
CDEBUG(D_VFSTRACE,
|
||||
"VFS Op: inode=%lu/%u(%p), dir=%lu/%u(%p), target=%.*s\n",
|
||||
src->i_ino, src->i_generation, src, dir->i_ino,
|
||||
dir->i_generation, dir, name->len, name->name);
|
||||
|
||||
op_data = ll_prep_md_op_data(NULL, src, dir, name->name, name->len,
|
||||
0, LUSTRE_OPC_ANY, NULL);
|
||||
if (IS_ERR(op_data))
|
||||
return PTR_ERR(op_data);
|
||||
|
||||
err = md_link(sbi->ll_md_exp, op_data, &request);
|
||||
ll_finish_md_op_data(op_data);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
ll_update_times(request, dir);
|
||||
ll_stats_ops_tally(sbi, LPROC_LL_LINK, 1);
|
||||
out:
|
||||
ptlrpc_req_finished(request);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ll_mkdir_generic(struct inode *dir, struct qstr *name,
|
||||
int mode, struct dentry *dchild)
|
||||
|
||||
{
|
||||
int err;
|
||||
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p)\n",
|
||||
name->len, name->name, dir->i_ino, dir->i_generation, dir);
|
||||
|
||||
if (!IS_POSIXACL(dir) || !exp_connect_umask(ll_i2mdexp(dir)))
|
||||
mode &= ~current_umask();
|
||||
mode = (mode & (S_IRWXUGO|S_ISVTX)) | S_IFDIR;
|
||||
err = ll_new_node(dir, name, NULL, mode, 0, dchild, LUSTRE_OPC_MKDIR);
|
||||
|
||||
if (!err)
|
||||
ll_stats_ops_tally(ll_i2sbi(dir), LPROC_LL_MKDIR, 1);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Try to find the child dentry by its name.
|
||||
If found, put the result fid into @fid. */
|
||||
static void ll_get_child_fid(struct inode * dir, struct qstr *name,
|
||||
struct lu_fid *fid)
|
||||
{
|
||||
struct dentry *parent, *child;
|
||||
|
||||
parent = ll_d_hlist_entry(dir->i_dentry, struct dentry, d_u.d_alias);
|
||||
child = d_lookup(parent, name);
|
||||
if (child) {
|
||||
if (child->d_inode)
|
||||
*fid = *ll_inode2fid(child->d_inode);
|
||||
dput(child);
|
||||
}
|
||||
}
|
||||
|
||||
static int ll_rmdir_generic(struct inode *dir, struct dentry *dparent,
|
||||
struct dentry *dchild, struct qstr *name)
|
||||
{
|
||||
struct ptlrpc_request *request = NULL;
|
||||
struct md_op_data *op_data;
|
||||
int rc;
|
||||
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p)\n",
|
||||
name->len, name->name, dir->i_ino, dir->i_generation, dir);
|
||||
|
||||
if (unlikely(ll_d_mountpoint(dparent, dchild, name)))
|
||||
return -EBUSY;
|
||||
|
||||
op_data = ll_prep_md_op_data(NULL, dir, NULL, name->name, name->len,
|
||||
S_IFDIR, LUSTRE_OPC_ANY, NULL);
|
||||
if (IS_ERR(op_data))
|
||||
return PTR_ERR(op_data);
|
||||
|
||||
ll_get_child_fid(dir, name, &op_data->op_fid3);
|
||||
op_data->op_fid2 = op_data->op_fid3;
|
||||
rc = md_unlink(ll_i2sbi(dir)->ll_md_exp, op_data, &request);
|
||||
ll_finish_md_op_data(op_data);
|
||||
if (rc == 0) {
|
||||
ll_update_times(request, dir);
|
||||
ll_stats_ops_tally(ll_i2sbi(dir), LPROC_LL_RMDIR, 1);
|
||||
}
|
||||
|
||||
ptlrpc_req_finished(request);
|
||||
return rc;
|
||||
if (child->d_inode)
|
||||
*fid = *ll_inode2fid(child->d_inode);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1099,32 +970,26 @@ out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* ll_unlink_generic() doesn't update the inode with the new link count.
|
||||
/* ll_unlink() doesn't update the inode with the new link count.
|
||||
* Instead, ll_ddelete() and ll_d_iput() will update it based upon if there
|
||||
* is any lock existing. They will recycle dentries and inodes based upon locks
|
||||
* too. b=20433 */
|
||||
static int ll_unlink_generic(struct inode *dir, struct dentry *dparent,
|
||||
struct dentry *dchild, struct qstr *name)
|
||||
static int ll_unlink(struct inode * dir, struct dentry *dentry)
|
||||
{
|
||||
struct ptlrpc_request *request = NULL;
|
||||
struct md_op_data *op_data;
|
||||
int rc;
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p)\n",
|
||||
name->len, name->name, dir->i_ino, dir->i_generation, dir);
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:name=%pd,dir=%lu/%u(%p)\n",
|
||||
dentry, dir->i_ino, dir->i_generation, dir);
|
||||
|
||||
/*
|
||||
* XXX: unlink bind mountpoint maybe call to here,
|
||||
* just check it as vfs_unlink does.
|
||||
*/
|
||||
if (unlikely(ll_d_mountpoint(dparent, dchild, name)))
|
||||
return -EBUSY;
|
||||
|
||||
op_data = ll_prep_md_op_data(NULL, dir, NULL, name->name,
|
||||
name->len, 0, LUSTRE_OPC_ANY, NULL);
|
||||
op_data = ll_prep_md_op_data(NULL, dir, NULL,
|
||||
dentry->d_name.name,
|
||||
dentry->d_name.len,
|
||||
0, LUSTRE_OPC_ANY, NULL);
|
||||
if (IS_ERR(op_data))
|
||||
return PTR_ERR(op_data);
|
||||
|
||||
ll_get_child_fid(dir, name, &op_data->op_fid3);
|
||||
ll_get_child_fid(dentry, &op_data->op_fid3);
|
||||
op_data->op_fid2 = op_data->op_fid3;
|
||||
rc = md_unlink(ll_i2sbi(dir)->ll_md_exp, op_data, &request);
|
||||
ll_finish_md_op_data(op_data);
|
||||
@ -1140,95 +1005,140 @@ static int ll_unlink_generic(struct inode *dir, struct dentry *dparent,
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int ll_rename_generic(struct inode *src, struct dentry *src_dparent,
|
||||
struct dentry *src_dchild, struct qstr *src_name,
|
||||
struct inode *tgt, struct dentry *tgt_dparent,
|
||||
struct dentry *tgt_dchild, struct qstr *tgt_name)
|
||||
static int ll_mkdir(struct inode *dir, struct dentry *dentry, ll_umode_t mode)
|
||||
{
|
||||
struct ptlrpc_request *request = NULL;
|
||||
struct ll_sb_info *sbi = ll_i2sbi(src);
|
||||
struct md_op_data *op_data;
|
||||
int err;
|
||||
|
||||
CDEBUG(D_VFSTRACE,
|
||||
"VFS Op:oldname=%.*s,src_dir=%lu/%u(%p),newname=%.*s,"
|
||||
"tgt_dir=%lu/%u(%p)\n", src_name->len, src_name->name,
|
||||
src->i_ino, src->i_generation, src, tgt_name->len,
|
||||
tgt_name->name, tgt->i_ino, tgt->i_generation, tgt);
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:name=%pd,dir=%lu/%u(%p)\n",
|
||||
dentry, dir->i_ino, dir->i_generation, dir);
|
||||
|
||||
if (unlikely(ll_d_mountpoint(src_dparent, src_dchild, src_name) ||
|
||||
ll_d_mountpoint(tgt_dparent, tgt_dchild, tgt_name)))
|
||||
return -EBUSY;
|
||||
if (!IS_POSIXACL(dir) || !exp_connect_umask(ll_i2mdexp(dir)))
|
||||
mode &= ~current_umask();
|
||||
mode = (mode & (S_IRWXUGO|S_ISVTX)) | S_IFDIR;
|
||||
err = ll_new_node(dir, dentry, NULL, mode, 0, LUSTRE_OPC_MKDIR);
|
||||
|
||||
op_data = ll_prep_md_op_data(NULL, src, tgt, NULL, 0, 0,
|
||||
LUSTRE_OPC_ANY, NULL);
|
||||
if (IS_ERR(op_data))
|
||||
return PTR_ERR(op_data);
|
||||
|
||||
ll_get_child_fid(src, src_name, &op_data->op_fid3);
|
||||
ll_get_child_fid(tgt, tgt_name, &op_data->op_fid4);
|
||||
err = md_rename(sbi->ll_md_exp, op_data,
|
||||
src_name->name, src_name->len,
|
||||
tgt_name->name, tgt_name->len, &request);
|
||||
ll_finish_md_op_data(op_data);
|
||||
if (!err) {
|
||||
ll_update_times(request, src);
|
||||
ll_update_times(request, tgt);
|
||||
ll_stats_ops_tally(sbi, LPROC_LL_RENAME, 1);
|
||||
err = ll_objects_destroy(request, src);
|
||||
}
|
||||
|
||||
ptlrpc_req_finished(request);
|
||||
if (!err)
|
||||
ll_stats_ops_tally(ll_i2sbi(dir), LPROC_LL_MKDIR, 1);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ll_mknod(struct inode *dir, struct dentry *dchild, ll_umode_t mode,
|
||||
dev_t rdev)
|
||||
{
|
||||
return ll_mknod_generic(dir, &dchild->d_name, mode,
|
||||
old_encode_dev(rdev), dchild);
|
||||
}
|
||||
|
||||
static int ll_unlink(struct inode * dir, struct dentry *dentry)
|
||||
{
|
||||
return ll_unlink_generic(dir, NULL, dentry, &dentry->d_name);
|
||||
}
|
||||
|
||||
static int ll_mkdir(struct inode *dir, struct dentry *dentry, ll_umode_t mode)
|
||||
{
|
||||
return ll_mkdir_generic(dir, &dentry->d_name, mode, dentry);
|
||||
}
|
||||
|
||||
static int ll_rmdir(struct inode *dir, struct dentry *dentry)
|
||||
{
|
||||
return ll_rmdir_generic(dir, NULL, dentry, &dentry->d_name);
|
||||
struct ptlrpc_request *request = NULL;
|
||||
struct md_op_data *op_data;
|
||||
int rc;
|
||||
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:name=%pd,dir=%lu/%u(%p)\n",
|
||||
dentry, dir->i_ino, dir->i_generation, dir);
|
||||
|
||||
op_data = ll_prep_md_op_data(NULL, dir, NULL,
|
||||
dentry->d_name.name,
|
||||
dentry->d_name.len,
|
||||
S_IFDIR, LUSTRE_OPC_ANY, NULL);
|
||||
if (IS_ERR(op_data))
|
||||
return PTR_ERR(op_data);
|
||||
|
||||
ll_get_child_fid(dentry, &op_data->op_fid3);
|
||||
op_data->op_fid2 = op_data->op_fid3;
|
||||
rc = md_unlink(ll_i2sbi(dir)->ll_md_exp, op_data, &request);
|
||||
ll_finish_md_op_data(op_data);
|
||||
if (rc == 0) {
|
||||
ll_update_times(request, dir);
|
||||
ll_stats_ops_tally(ll_i2sbi(dir), LPROC_LL_RMDIR, 1);
|
||||
}
|
||||
|
||||
ptlrpc_req_finished(request);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int ll_symlink(struct inode *dir, struct dentry *dentry,
|
||||
const char *oldname)
|
||||
{
|
||||
return ll_symlink_generic(dir, &dentry->d_name, oldname, dentry);
|
||||
int err;
|
||||
|
||||
CDEBUG(D_VFSTRACE, "VFS Op:name=%pd,dir=%lu/%u(%p),target=%.*s\n",
|
||||
dentry, dir->i_ino, dir->i_generation,
|
||||
dir, 3000, oldname);
|
||||
|
||||
err = ll_new_node(dir, dentry, oldname, S_IFLNK | S_IRWXUGO,
|
||||
0, LUSTRE_OPC_SYMLINK);
|
||||
|
||||
if (!err)
|
||||
ll_stats_ops_tally(ll_i2sbi(dir), LPROC_LL_SYMLINK, 1);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ll_link(struct dentry *old_dentry, struct inode *dir,
|
||||
struct dentry *new_dentry)
|
||||
{
|
||||
return ll_link_generic(old_dentry->d_inode, dir, &new_dentry->d_name,
|
||||
new_dentry);
|
||||
struct inode *src = old_dentry->d_inode;
|
||||
struct ll_sb_info *sbi = ll_i2sbi(dir);
|
||||
struct ptlrpc_request *request = NULL;
|
||||
struct md_op_data *op_data;
|
||||
int err;
|
||||
|
||||
CDEBUG(D_VFSTRACE,
|
||||
"VFS Op: inode=%lu/%u(%p), dir=%lu/%u(%p), target=%pd\n",
|
||||
src->i_ino, src->i_generation, src, dir->i_ino,
|
||||
dir->i_generation, dir, new_dentry);
|
||||
|
||||
op_data = ll_prep_md_op_data(NULL, src, dir, new_dentry->d_name.name,
|
||||
new_dentry->d_name.len,
|
||||
0, LUSTRE_OPC_ANY, NULL);
|
||||
if (IS_ERR(op_data))
|
||||
return PTR_ERR(op_data);
|
||||
|
||||
err = md_link(sbi->ll_md_exp, op_data, &request);
|
||||
ll_finish_md_op_data(op_data);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
ll_update_times(request, dir);
|
||||
ll_stats_ops_tally(sbi, LPROC_LL_LINK, 1);
|
||||
out:
|
||||
ptlrpc_req_finished(request);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ll_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||
struct inode *new_dir, struct dentry *new_dentry)
|
||||
{
|
||||
struct ptlrpc_request *request = NULL;
|
||||
struct ll_sb_info *sbi = ll_i2sbi(old_dir);
|
||||
struct md_op_data *op_data;
|
||||
int err;
|
||||
err = ll_rename_generic(old_dir, NULL,
|
||||
old_dentry, &old_dentry->d_name,
|
||||
new_dir, NULL, new_dentry,
|
||||
&new_dentry->d_name);
|
||||
|
||||
CDEBUG(D_VFSTRACE,
|
||||
"VFS Op:oldname=%pd,src_dir=%lu/%u(%p),newname=%pd,"
|
||||
"tgt_dir=%lu/%u(%p)\n", old_dentry,
|
||||
old_dir->i_ino, old_dir->i_generation, old_dir, new_dentry,
|
||||
new_dir->i_ino, new_dir->i_generation, new_dir);
|
||||
|
||||
op_data = ll_prep_md_op_data(NULL, old_dir, new_dir, NULL, 0, 0,
|
||||
LUSTRE_OPC_ANY, NULL);
|
||||
if (IS_ERR(op_data))
|
||||
return PTR_ERR(op_data);
|
||||
|
||||
ll_get_child_fid(old_dentry, &op_data->op_fid3);
|
||||
ll_get_child_fid(new_dentry, &op_data->op_fid4);
|
||||
err = md_rename(sbi->ll_md_exp, op_data,
|
||||
old_dentry->d_name.name,
|
||||
old_dentry->d_name.len,
|
||||
new_dentry->d_name.name,
|
||||
new_dentry->d_name.len, &request);
|
||||
ll_finish_md_op_data(op_data);
|
||||
if (!err) {
|
||||
d_move(old_dentry, new_dentry);
|
||||
ll_update_times(request, old_dir);
|
||||
ll_update_times(request, new_dir);
|
||||
ll_stats_ops_tally(sbi, LPROC_LL_RENAME, 1);
|
||||
err = ll_objects_destroy(request, old_dir);
|
||||
}
|
||||
|
||||
ptlrpc_req_finished(request);
|
||||
if (!err)
|
||||
d_move(old_dentry, new_dentry);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -969,8 +969,8 @@ static int ll_agl_thread(void *arg)
|
||||
struct l_wait_info lwi = { 0 };
|
||||
|
||||
thread->t_pid = current_pid();
|
||||
CDEBUG(D_READA, "agl thread started: sai %p, parent %.*s\n",
|
||||
sai, parent->d_name.len, parent->d_name.name);
|
||||
CDEBUG(D_READA, "agl thread started: sai %p, parent %pd\n",
|
||||
sai, parent);
|
||||
|
||||
atomic_inc(&sbi->ll_agl_total);
|
||||
spin_lock(&plli->lli_agl_lock);
|
||||
@ -1019,8 +1019,8 @@ static int ll_agl_thread(void *arg)
|
||||
spin_unlock(&plli->lli_agl_lock);
|
||||
wake_up(&thread->t_ctl_waitq);
|
||||
ll_sai_put(sai);
|
||||
CDEBUG(D_READA, "agl thread stopped: sai %p, parent %.*s\n",
|
||||
sai, parent->d_name.len, parent->d_name.name);
|
||||
CDEBUG(D_READA, "agl thread stopped: sai %p, parent %pd\n",
|
||||
sai, parent);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1031,8 +1031,8 @@ static void ll_start_agl(struct dentry *parent, struct ll_statahead_info *sai)
|
||||
struct ll_inode_info *plli;
|
||||
struct task_struct *task;
|
||||
|
||||
CDEBUG(D_READA, "start agl thread: sai %p, parent %.*s\n",
|
||||
sai, parent->d_name.len, parent->d_name.name);
|
||||
CDEBUG(D_READA, "start agl thread: sai %p, parent %pd\n",
|
||||
sai, parent);
|
||||
|
||||
plli = ll_i2info(parent->d_inode);
|
||||
task = kthread_run(ll_agl_thread, parent,
|
||||
@ -1066,8 +1066,8 @@ static int ll_statahead_thread(void *arg)
|
||||
struct l_wait_info lwi = { 0 };
|
||||
|
||||
thread->t_pid = current_pid();
|
||||
CDEBUG(D_READA, "statahead thread starting: sai %p, parent %.*s\n",
|
||||
sai, parent->d_name.len, parent->d_name.name);
|
||||
CDEBUG(D_READA, "statahead thread starting: sai %p, parent %pd\n",
|
||||
sai, parent);
|
||||
|
||||
if (sbi->ll_flags & LL_SBI_AGL_ENABLED)
|
||||
ll_start_agl(parent, sai);
|
||||
@ -1288,8 +1288,8 @@ out:
|
||||
wake_up(&thread->t_ctl_waitq);
|
||||
ll_sai_put(sai);
|
||||
dput(parent);
|
||||
CDEBUG(D_READA, "statahead thread stopped: sai %p, parent %.*s\n",
|
||||
sai, parent->d_name.len, parent->d_name.name);
|
||||
CDEBUG(D_READA, "statahead thread stopped: sai %p, parent %pd\n",
|
||||
sai, parent);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -1612,10 +1612,9 @@ int do_statahead_enter(struct inode *dir, struct dentry **dentryp,
|
||||
} else if ((*dentryp)->d_inode != inode) {
|
||||
/* revalidate, but inode is recreated */
|
||||
CDEBUG(D_READA,
|
||||
"stale dentry %.*s inode %lu/%u, "
|
||||
"stale dentry %pd inode %lu/%u, "
|
||||
"statahead inode %lu/%u\n",
|
||||
(*dentryp)->d_name.len,
|
||||
(*dentryp)->d_name.name,
|
||||
*dentryp,
|
||||
(*dentryp)->d_inode->i_ino,
|
||||
(*dentryp)->d_inode->i_generation,
|
||||
inode->i_ino,
|
||||
@ -1666,9 +1665,9 @@ int do_statahead_enter(struct inode *dir, struct dentry **dentryp,
|
||||
if (unlikely(sai->sai_inode != parent->d_inode)) {
|
||||
struct ll_inode_info *nlli = ll_i2info(parent->d_inode);
|
||||
|
||||
CWARN("Race condition, someone changed %.*s just now: "
|
||||
CWARN("Race condition, someone changed %pd just now: "
|
||||
"old parent "DFID", new parent "DFID"\n",
|
||||
(*dentryp)->d_name.len, (*dentryp)->d_name.name,
|
||||
*dentryp,
|
||||
PFID(&lli->lli_fid), PFID(&nlli->lli_fid));
|
||||
dput(parent);
|
||||
iput(sai->sai_inode);
|
||||
@ -1676,8 +1675,8 @@ int do_statahead_enter(struct inode *dir, struct dentry **dentryp,
|
||||
goto out;
|
||||
}
|
||||
|
||||
CDEBUG(D_READA, "start statahead thread: sai %p, parent %.*s\n",
|
||||
sai, parent->d_name.len, parent->d_name.name);
|
||||
CDEBUG(D_READA, "start statahead thread: sai %p, parent %pd\n",
|
||||
sai, parent);
|
||||
|
||||
/* The sai buffer already has one reference taken at allocation time,
|
||||
* but as soon as we expose the sai by attaching it to the lli that
|
||||
|
@ -108,7 +108,7 @@ static int vvp_io_fault_iter_init(const struct lu_env *env,
|
||||
struct inode *inode = ccc_object_inode(ios->cis_obj);
|
||||
|
||||
LASSERT(inode ==
|
||||
cl2ccc_io(env, ios)->cui_fd->fd_file->f_dentry->d_inode);
|
||||
file_inode(cl2ccc_io(env, ios)->cui_fd->fd_file));
|
||||
vio->u.fault.ft_mtime = LTIME_S(inode->i_mtime);
|
||||
return 0;
|
||||
}
|
||||
@ -239,7 +239,7 @@ static int vvp_mmap_locks(const struct lu_env *env,
|
||||
|
||||
down_read(&mm->mmap_sem);
|
||||
while ((vma = our_vma(mm, addr, count)) != NULL) {
|
||||
struct inode *inode = vma->vm_file->f_dentry->d_inode;
|
||||
struct inode *inode = file_inode(vma->vm_file);
|
||||
int flags = CEF_MUST;
|
||||
|
||||
if (ll_file_nolock(vma->vm_file)) {
|
||||
|
@ -241,14 +241,11 @@ int ll_setxattr(struct dentry *dentry, const char *name,
|
||||
lump->lmm_stripe_offset = -1;
|
||||
|
||||
if (lump != NULL && S_ISREG(inode->i_mode)) {
|
||||
struct file f;
|
||||
int flags = FMODE_WRITE;
|
||||
int lum_size = (lump->lmm_magic == LOV_USER_MAGIC_V1) ?
|
||||
sizeof(*lump) : sizeof(struct lov_user_md_v3);
|
||||
|
||||
memset(&f, 0, sizeof(f)); /* f.f_flags is used below */
|
||||
f.f_dentry = dentry;
|
||||
rc = ll_lov_setstripe_ea_info(inode, &f, flags, lump,
|
||||
rc = ll_lov_setstripe_ea_info(inode, dentry, flags, lump,
|
||||
lum_size);
|
||||
/* b10667: rc always be 0 here for now */
|
||||
rc = 0;
|
||||
@ -519,8 +516,8 @@ ssize_t ll_getxattr(struct dentry *dentry, const char *name,
|
||||
}
|
||||
|
||||
if (size < lmmsize) {
|
||||
CERROR("server bug: replied size %d > %d for %s (%s)\n",
|
||||
lmmsize, (int)size, dentry->d_name.name, name);
|
||||
CERROR("server bug: replied size %d > %d for %pd (%s)\n",
|
||||
lmmsize, (int)size, dentry, name);
|
||||
rc = -ERANGE;
|
||||
goto out;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user