staging/lustre/llite: fix open lock matching in ll_md_blocking_ast()
[deliverable/linux.git] / drivers / staging / lustre / lustre / llite / file.c
index c12821aedc2fd6f76d6f7db2c2ee8945f54bf8ca..c9ee57473416548d7c20152d553ee8d449ea9e05 100644 (file)
@@ -205,7 +205,7 @@ out:
        return rc;
 }
 
-int ll_md_real_close(struct inode *inode, int flags)
+int ll_md_real_close(struct inode *inode, fmode_t fmode)
 {
        struct ll_inode_info *lli = ll_i2info(inode);
        struct obd_client_handle **och_p;
@@ -213,30 +213,33 @@ int ll_md_real_close(struct inode *inode, int flags)
        __u64 *och_usecount;
        int rc = 0;
 
-       if (flags & FMODE_WRITE) {
+       if (fmode & FMODE_WRITE) {
                och_p = &lli->lli_mds_write_och;
                och_usecount = &lli->lli_open_fd_write_count;
-       } else if (flags & FMODE_EXEC) {
+       } else if (fmode & FMODE_EXEC) {
                och_p = &lli->lli_mds_exec_och;
                och_usecount = &lli->lli_open_fd_exec_count;
        } else {
-               LASSERT(flags & FMODE_READ);
+               LASSERT(fmode & FMODE_READ);
                och_p = &lli->lli_mds_read_och;
                och_usecount = &lli->lli_open_fd_read_count;
        }
 
        mutex_lock(&lli->lli_och_mutex);
-       if (*och_usecount) { /* There are still users of this handle, so
-                               skip freeing it. */
+       if (*och_usecount > 0) {
+               /* There are still users of this handle, so skip
+                * freeing it. */
                mutex_unlock(&lli->lli_och_mutex);
                return 0;
        }
+
        och=*och_p;
        *och_p = NULL;
        mutex_unlock(&lli->lli_och_mutex);
 
-       if (och) { /* There might be a race and somebody have freed this och
-                     already */
+       if (och != NULL) {
+               /* There might be a race and this handle may already
+                  be closed. */
                rc = ll_close_inode_openhandle(ll_i2sbi(inode)->ll_md_exp,
                                               inode, och, NULL);
        }
@@ -671,14 +674,13 @@ restart:
 
        ll_capa_open(inode);
 
-       if (!lli->lli_has_smd) {
-               if (file->f_flags & O_LOV_DELAY_CREATE ||
-                   !(file->f_mode & FMODE_WRITE)) {
-                       CDEBUG(D_INODE, "object creation was delayed\n");
-                       GOTO(out_och_free, rc);
-               }
+       if (!lli->lli_has_smd &&
+           (cl_is_lov_delay_create(file->f_flags) ||
+            (file->f_mode & FMODE_WRITE) == 0)) {
+               CDEBUG(D_INODE, "object creation was delayed\n");
+               GOTO(out_och_free, rc);
        }
-       file->f_flags &= ~O_LOV_DELAY_CREATE;
+       cl_lov_delay_create_clear(&file->f_flags);
        GOTO(out_och_free, rc);
 
 out_och_free:
@@ -1092,10 +1094,6 @@ restart:
                                down_read(&lli->lli_trunc_sem);
                        }
                        break;
-               case IO_SENDFILE:
-                       vio->u.sendfile.cui_actor = args->u.sendfile.via_actor;
-                       vio->u.sendfile.cui_target = args->u.sendfile.via_target;
-                       break;
                case IO_SPLICE:
                        vio->u.splice.cui_pipe = args->u.splice.via_pipe;
                        vio->u.splice.cui_flags = args->u.splice.via_flags;
@@ -1340,7 +1338,7 @@ static int ll_lov_recreate_obj(struct inode *inode, unsigned long arg)
        struct ll_recreate_obj ucreat;
        struct ost_id           oi;
 
-       if (!cfs_capable(CFS_CAP_SYS_ADMIN))
+       if (!capable(CFS_CAP_SYS_ADMIN))
                return -EPERM;
 
        if (copy_from_user(&ucreat, (struct ll_recreate_obj *)arg,
@@ -1358,7 +1356,7 @@ static int ll_lov_recreate_fid(struct inode *inode, unsigned long arg)
        struct ost_id   oi;
        obd_count       ost_idx;
 
-       if (!cfs_capable(CFS_CAP_SYS_ADMIN))
+       if (!capable(CFS_CAP_SYS_ADMIN))
                return -EPERM;
 
        if (copy_from_user(&fid, (struct lu_fid *)arg, sizeof(fid)))
@@ -1381,23 +1379,25 @@ int ll_lov_setstripe_ea_info(struct inode *inode, struct file *file,
                ccc_inode_lsm_put(inode, lsm);
                CDEBUG(D_IOCTL, "stripe already exists for ino %lu\n",
                       inode->i_ino);
-               return -EEXIST;
+               GOTO(out, rc = -EEXIST);
        }
 
        ll_inode_size_lock(inode);
        rc = ll_intent_file_open(file, lum, lum_size, &oit);
        if (rc)
-               GOTO(out, rc);
+               GOTO(out_unlock, rc);
        rc = oit.d.lustre.it_status;
        if (rc < 0)
                GOTO(out_req_free, rc);
 
        ll_release_openhandle(file->f_dentry, &oit);
 
- out:
+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);
@@ -1497,7 +1497,7 @@ static int ll_lov_setea(struct inode *inode, struct file *file,
                                            sizeof(struct lov_user_ost_data);
        int                      rc;
 
-       if (!cfs_capable(CFS_CAP_SYS_ADMIN))
+       if (!capable(CFS_CAP_SYS_ADMIN))
                return -EPERM;
 
        OBD_ALLOC_LARGE(lump, lum_size);
@@ -1747,7 +1747,7 @@ int ll_fid2path(struct inode *inode, void *arg)
        struct getinfo_fid2path *gfout, *gfin;
        int                      outsize, rc;
 
-       if (!cfs_capable(CFS_CAP_DAC_READ_SEARCH) &&
+       if (!capable(CFS_CAP_DAC_READ_SEARCH) &&
            !(ll_i2sbi(inode)->ll_flags & LL_SBI_USER_FID2PATH))
                return -EPERM;
 
@@ -2093,7 +2093,7 @@ static int ll_hsm_state_set(struct inode *inode, struct hsm_state_set *hss)
        /* Non-root users are forbidden to set or clear flags which are
         * NOT defined in HSM_USER_MASK. */
        if (((hss->hss_setmask | hss->hss_clearmask) & ~HSM_USER_MASK) &&
-           !cfs_capable(CFS_CAP_SYS_ADMIN))
+           !capable(CFS_CAP_SYS_ADMIN))
                return -EPERM;
 
        op_data = ll_prep_md_op_data(NULL, inode, NULL, NULL, 0, 0,
This page took 0.027422 seconds and 5 git commands to generate.