Whamcloud - gitweb
LU-15217 pcc: disable PCC for encrypted files
[fs/lustre-release.git] / lustre / llite / file.c
index a611212..c87deda 100644 (file)
@@ -318,28 +318,39 @@ static int ll_md_close(struct inode *inode, struct file *file)
        if (unlikely(fd->fd_flags & LL_FILE_GROUP_LOCKED))
                ll_put_grouplock(inode, file, fd->fd_grouplock.lg_gid);
 
+       mutex_lock(&lli->lli_och_mutex);
        if (fd->fd_lease_och != NULL) {
                bool lease_broken;
+               struct obd_client_handle *lease_och;
+
+               lease_och = fd->fd_lease_och;
+               fd->fd_lease_och = NULL;
+               mutex_unlock(&lli->lli_och_mutex);
 
                /* Usually the lease is not released when the
                 * application crashed, we need to release here. */
-               rc = ll_lease_close(fd->fd_lease_och, inode, &lease_broken);
+               rc = ll_lease_close(lease_och, inode, &lease_broken);
+
+               mutex_lock(&lli->lli_och_mutex);
+
                CDEBUG_LIMIT(rc ? D_ERROR : D_INODE,
                             "Clean up lease "DFID" %d/%d\n",
                             PFID(&lli->lli_fid), rc, lease_broken);
-
-               fd->fd_lease_och = NULL;
        }
 
        if (fd->fd_och != NULL) {
-               rc = ll_close_inode_openhandle(inode, fd->fd_och, 0, NULL);
+               struct obd_client_handle *och;
+
+               och = fd->fd_och;
                fd->fd_och = NULL;
+               mutex_unlock(&lli->lli_och_mutex);
+
+               rc = ll_close_inode_openhandle(inode, och, 0, NULL);
                GOTO(out, rc);
        }
 
         /* Let's see if we have good enough OPEN lock on the file and if
            we can skip talking to MDS */
-       mutex_lock(&lli->lli_och_mutex);
        if (fd->fd_omode & FMODE_WRITE) {
                lockmode = LCK_CW;
                LASSERT(lli->lli_open_fd_write_count);
@@ -747,10 +758,6 @@ static int ll_local_open(struct file *file, struct lookup_intent *it,
        /* turn off the kernel's read-ahead */
        file->f_ra.ra_pages = 0;
 
-       /* ll_cl_context initialize */
-       rwlock_init(&fd->fd_lock);
-       INIT_LIST_HEAD(&fd->fd_lccs);
-
        RETURN(0);
 }
 
@@ -1695,9 +1702,9 @@ restart:
                        range_locked = true;
                }
 
-               ll_cl_add(file, env, io, LCC_RW);
+               ll_cl_add(inode, env, io, LCC_RW);
                rc = cl_io_loop(env, io);
-               ll_cl_remove(file, env);
+               ll_cl_remove(inode, env);
 
                if (range_locked && !is_parallel_dio) {
                        CDEBUG(D_VFSTRACE, "Range unlock "RL_FMT"\n",
@@ -2014,8 +2021,6 @@ static ssize_t ll_do_tiny_write(struct kiocb *iocb, struct iov_iter *iter)
 
        if (result > 0) {
                ll_heat_add(inode, CIT_WRITE, result);
-               ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_WRITE_BYTES,
-                                  result);
                set_bit(LLIF_DATA_MODIFIED, &ll_i2info(inode)->lli_flags);
        }
 
@@ -2745,7 +2750,7 @@ int ll_fid2path(struct inode *inode, void __user *arg)
        ENTRY;
 
        if (!capable(CAP_DAC_READ_SEARCH) &&
-           !(ll_i2sbi(inode)->ll_flags & LL_SBI_USER_FID2PATH))
+           !test_bit(LL_SBI_USER_FID2PATH, ll_i2sbi(inode)->ll_flags))
                RETURN(-EPERM);
 
        /* Only need to get the buflen */
@@ -3675,6 +3680,9 @@ static long ll_file_unlock_lease(struct file *file, struct ll_ioc_lease *ioc,
                if (ioc->lil_count != 1)
                        RETURN(-EINVAL);
 
+               if (IS_ENCRYPTED(inode))
+                       RETURN(-EOPNOTSUPP);
+
                arg += sizeof(*ioc);
                if (copy_from_user(&param.pa_archive_id, (void __user *)arg,
                                   sizeof(__u32)))
@@ -4047,9 +4055,10 @@ out:
                RETURN(rc);
        }
        case LL_IOC_HSM_ACTION: {
-               struct md_op_data               *op_data;
-               struct hsm_current_action       *hca;
-               int                              rc;
+               struct md_op_data *op_data;
+               struct hsm_current_action *hca;
+               const char *action;
+               int rc;
 
                OBD_ALLOC_PTR(hca);
                if (hca == NULL)
@@ -4064,10 +4073,26 @@ out:
 
                rc = obd_iocontrol(cmd, ll_i2mdexp(inode), sizeof(*op_data),
                                   op_data, NULL);
+               if (rc < 0)
+                       GOTO(skip_copy, rc);
+
+               /* The hsm_current_action retreived from the server could
+                * contain corrupt information. If it is incorrect data collect
+                * debug information. We still send the data even if incorrect
+                * to user land to handle.
+                */
+               action = hsm_user_action2name(hca->hca_action);
+               if (strcmp(action, "UNKNOWN") == 0 ||
+                   hca->hca_state > HPS_DONE) {
+                       CDEBUG(D_HSM,
+                              "HSM current state %s action %s, offset = %llu, length %llu\n",
+                              hsm_progress_state2name(hca->hca_state), action,
+                              hca->hca_location.offset, hca->hca_location.length);
+               }
 
                if (copy_to_user((char __user *)arg, hca, sizeof(*hca)))
                        rc = -EFAULT;
-
+skip_copy:
                ll_finish_md_op_data(op_data);
                OBD_FREE_PTR(hca);
                RETURN(rc);
@@ -5126,7 +5151,10 @@ static int ll_merge_md_attr(struct inode *inode)
        if (rc != 0)
                RETURN(rc);
 
+       spin_lock(&inode->i_lock);
        set_nlink(inode, attr.cat_nlink);
+       spin_unlock(&inode->i_lock);
+
        inode->i_blocks = attr.cat_blocks;
        i_size_write(inode, attr.cat_size);
 
@@ -5307,7 +5335,8 @@ int ll_getattr(struct vfsmount *mnt, struct dentry *de, struct kstat *stat)
 }
 #endif
 
-int cl_falloc(struct inode *inode, int mode, loff_t offset, loff_t len)
+int cl_falloc(struct file *file, struct inode *inode, int mode, loff_t offset,
+             loff_t len)
 {
        struct lu_env *env;
        struct cl_io *io;
@@ -5323,6 +5352,8 @@ int cl_falloc(struct inode *inode, int mode, loff_t offset, loff_t len)
 
        io = vvp_env_thread_io(env);
        io->ci_obj = ll_i2info(inode)->lli_clob;
+       ll_io_set_mirror(io, file);
+
        io->ci_verify_layout = 1;
        io->u.ci_setattr.sa_parent_fid = lu_object_fid(&io->ci_obj->co_lu);
        io->u.ci_setattr.sa_falloc_mode = mode;
@@ -5361,7 +5392,7 @@ out:
 
 long ll_fallocate(struct file *filp, int mode, loff_t offset, loff_t len)
 {
-       struct inode *inode = filp->f_path.dentry->d_inode;
+       struct inode *inode = file_inode(filp);
        int rc;
 
        if (offset < 0 || len <= 0)
@@ -5386,7 +5417,7 @@ long ll_fallocate(struct file *filp, int mode, loff_t offset, loff_t len)
 
        ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_FALLOCATE, 1);
 
-       rc = cl_falloc(inode, mode, offset, len);
+       rc = cl_falloc(filp, inode, mode, offset, len);
        /*
         * ENOTSUPP (524) is an NFSv3 specific error code erroneously
         * used by Lustre in several places. Retuning it here would
@@ -5480,7 +5511,7 @@ int ll_inode_permission(struct inode *inode, int mask)
        squash = &sbi->ll_squash;
        if (unlikely(squash->rsi_uid != 0 &&
                     uid_eq(current_fsuid(), GLOBAL_ROOT_UID) &&
-                    !(sbi->ll_flags & LL_SBI_NOROOTSQUASH))) {
+                    !test_bit(LL_SBI_NOROOTSQUASH, sbi->ll_flags))) {
                        squash_id = true;
        }
        if (squash_id) {
@@ -5630,9 +5661,9 @@ const struct file_operations *ll_select_file_operations(struct ll_sb_info *sbi)
 {
        const struct file_operations *fops = &ll_file_operations_noflock;
 
-       if (sbi->ll_flags & LL_SBI_FLOCK)
+       if (test_bit(LL_SBI_FLOCK, sbi->ll_flags))
                fops = &ll_file_operations_flock;
-       else if (sbi->ll_flags & LL_SBI_LOCALFLOCK)
+       else if (test_bit(LL_SBI_LOCALFLOCK, sbi->ll_flags))
                fops = &ll_file_operations;
 
        return fops;
@@ -5920,7 +5951,8 @@ int ll_layout_refresh(struct inode *inode, __u32 *gen)
        ENTRY;
 
        *gen = ll_layout_version_get(lli);
-       if (!(sbi->ll_flags & LL_SBI_LAYOUT_LOCK) || *gen != CL_LAYOUT_GEN_NONE)
+       if (!test_bit(LL_SBI_LAYOUT_LOCK, sbi->ll_flags) ||
+           *gen != CL_LAYOUT_GEN_NONE)
                RETURN(0);
 
        /* sanity checks */