Whamcloud - gitweb
LU-4429 llite: fix open lock matching in ll_md_blocking_ast()
[fs/lustre-release.git] / lustre / llite / file.c
index c98ead8..f726ff2 100644 (file)
@@ -162,14 +162,17 @@ static int ll_close_inode_openhandle(struct obd_export *md_exp,
                  * OSTs and send setattr to back to MDS. */
                 rc = ll_som_update(inode, op_data);
                 if (rc) {
-                        CERROR("inode %lu mdc Size-on-MDS update failed: "
-                               "rc = %d\n", inode->i_ino, rc);
-                        rc = 0;
-                }
-        } else if (rc) {
-                CERROR("inode %lu mdc close failed: rc = %d\n",
-                       inode->i_ino, rc);
-        }
+                       CERROR("%s: inode "DFID" mdc Size-on-MDS update"
+                              " failed: rc = %d\n",
+                              ll_i2mdexp(inode)->exp_obd->obd_name,
+                              PFID(ll_inode2fid(inode)), rc);
+                       rc = 0;
+               }
+       } else if (rc) {
+               CERROR("%s: inode "DFID" mdc close failed: rc = %d\n",
+                      ll_i2mdexp(inode)->exp_obd->obd_name,
+                      PFID(ll_inode2fid(inode)), rc);
+       }
 
        /* DATA_MODIFIED flag was successfully sent on close, cancel data
         * modification flag. */
@@ -184,8 +187,10 @@ static int ll_close_inode_openhandle(struct obd_export *md_exp,
         if (rc == 0) {
                 rc = ll_objects_destroy(req, inode);
                 if (rc)
-                        CERROR("inode %lu ll_objects destroy: rc = %d\n",
-                               inode->i_ino, rc);
+                       CERROR("%s: inode "DFID
+                              " ll_objects destroy: rc = %d\n",
+                              ll_i2mdexp(inode)->exp_obd->obd_name,
+                              PFID(ll_inode2fid(inode)), rc);
         }
 
        if (rc == 0 && op_data->op_bias & MDS_HSM_RELEASE) {
@@ -213,44 +218,47 @@ 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;
-        struct obd_client_handle *och;
-        __u64 *och_usecount;
-        int rc = 0;
-        ENTRY;
+       struct ll_inode_info *lli = ll_i2info(inode);
+       struct obd_client_handle **och_p;
+       struct obd_client_handle *och;
+       __u64 *och_usecount;
+       int rc = 0;
+       ENTRY;
 
-        if (flags & FMODE_WRITE) {
-                och_p = &lli->lli_mds_write_och;
-                och_usecount = &lli->lli_open_fd_write_count;
-        } else if (flags & FMODE_EXEC) {
-                och_p = &lli->lli_mds_exec_och;
-                och_usecount = &lli->lli_open_fd_exec_count;
-        } else {
-                LASSERT(flags & FMODE_READ);
-                och_p = &lli->lli_mds_read_och;
-                och_usecount = &lli->lli_open_fd_read_count;
-        }
+       if (fmode & FMODE_WRITE) {
+               och_p = &lli->lli_mds_write_och;
+               och_usecount = &lli->lli_open_fd_write_count;
+       } else if (fmode & FMODE_EXEC) {
+               och_p = &lli->lli_mds_exec_och;
+               och_usecount = &lli->lli_open_fd_exec_count;
+       } else {
+               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;
+               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 */
-                rc = ll_close_inode_openhandle(ll_i2sbi(inode)->ll_md_exp,
+       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);
-        }
+       }
 
-        RETURN(rc);
+       RETURN(rc);
 }
 
 int ll_md_close(struct obd_export *md_exp, struct inode *inode,
@@ -340,8 +348,8 @@ int ll_file_release(struct inode *inode, struct file *file)
         int rc;
         ENTRY;
 
-        CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p)\n", inode->i_ino,
-               inode->i_generation, inode);
+       CDEBUG(D_VFSTRACE, "VFS Op:inode="DFID"(%p)\n",
+              PFID(ll_inode2fid(inode)), inode);
 
 #ifdef CONFIG_FS_POSIX_ACL
        if (sbi->ll_flags & LL_SBI_RMT_CLIENT &&
@@ -455,8 +463,7 @@ static int ll_intent_file_open(struct file *file, void *lmm,
                                  itp, NULL);
 
 out:
-        ptlrpc_req_finished(itp->d.lustre.it_data);
-        it_clear_disposition(itp, DISP_ENQ_COMPLETE);
+       ptlrpc_req_finished(req);
         ll_intent_drop_lock(itp);
 
         RETURN(rc);
@@ -489,7 +496,7 @@ static int ll_och_fill(struct obd_export *md_exp, struct lookup_intent *it,
        och->och_magic = OBD_CLIENT_HANDLE_MAGIC;
        och->och_flags = it->it_flags;
 
-       return md_set_open_replay_data(md_exp, och, req);
+       return md_set_open_replay_data(md_exp, och, it);
 }
 
 int ll_local_open(struct file *file, struct lookup_intent *it,
@@ -547,8 +554,8 @@ int ll_file_open(struct inode *inode, struct file *file)
         int rc = 0, opendir_set = 0;
         ENTRY;
 
-        CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p), flags %o\n", inode->i_ino,
-               inode->i_generation, inode, file->f_flags);
+       CDEBUG(D_VFSTRACE, "VFS Op:inode="DFID"(%p), flags %o\n",
+              PFID(ll_inode2fid(inode)), inode, file->f_flags);
 
         it = file->private_data; /* XXX: compat macro */
         file->private_data = NULL; /* prevent ll_local_open assertion */
@@ -665,16 +672,18 @@ restart:
                  * (bug 3430) */
                 /* XXX (green): Should not we bail out on any error here, not
                  * just open error? */
-                rc = it_open_error(DISP_OPEN_OPEN, it);
-                if (rc)
-                        GOTO(out_och_free, rc);
+               rc = it_open_error(DISP_OPEN_OPEN, it);
+               if (rc != 0)
+                       GOTO(out_och_free, rc);
 
-                LASSERT(it_disposition(it, DISP_ENQ_OPEN_REF));
+               LASSERTF(it_disposition(it, DISP_ENQ_OPEN_REF),
+                        "inode %p: disposition %x, status %d\n", inode,
+                        it_disposition(it, ~0), it->d.lustre.it_status);
 
-                rc = ll_local_open(file, it, fd, *och_p);
-                if (rc)
-                        GOTO(out_och_free, rc);
-        }
+               rc = ll_local_open(file, it, fd, *och_p);
+               if (rc)
+                       GOTO(out_och_free, rc);
+       }
        mutex_unlock(&lli->lli_och_mutex);
         fd = NULL;
 
@@ -830,10 +839,7 @@ struct obd_client_handle *ll_lease_open(struct inode *inode, struct file *file,
         * doesn't deal with openhandle, so normal openhandle will be leaked. */
                                LDLM_FL_NO_LRU | LDLM_FL_EXCL);
        ll_finish_md_op_data(op_data);
-       if (req != NULL) {
-               ptlrpc_req_finished(req);
-               it_clear_disposition(&it, DISP_ENQ_COMPLETE);
-       }
+       ptlrpc_req_finished(req);
        if (rc < 0)
                GOTO(out_release_it, rc);
 
@@ -1124,9 +1130,12 @@ ll_file_io_generic(const struct lu_env *env, struct vvp_io_args *args,
 {
        struct ll_inode_info *lli = ll_i2info(file->f_dentry->d_inode);
        struct ll_file_data  *fd  = LUSTRE_FPRIVATE(file);
-        struct cl_io         *io;
-        ssize_t               result;
-        ENTRY;
+       struct cl_io         *io;
+       ssize_t               result;
+       ENTRY;
+
+       CDEBUG(D_VFSTRACE, "file: %s, type: %d ppos: "LPU64", count: %zd\n",
+               file->f_dentry->d_name.name, iot, *ppos, count);
 
 restart:
         io = ccc_env_thread_io(env);
@@ -1149,12 +1158,11 @@ restart:
                         if ((iot == CIT_WRITE) &&
                             !(cio->cui_fd->fd_flags & LL_FILE_GROUP_LOCKED)) {
                                if (mutex_lock_interruptible(&lli->
-                                                               lli_write_mutex))
-                                        GOTO(out, result = -ERESTARTSYS);
-                                write_mutex_locked = 1;
-                        } else if (iot == CIT_READ) {
-                               down_read(&lli->lli_trunc_sem);
-                        }
+                                                       lli_write_mutex))
+                                       GOTO(out, result = -ERESTARTSYS);
+                               write_mutex_locked = 1;
+                       }
+                       down_read(&lli->lli_trunc_sem);
                         break;
                 case IO_SENDFILE:
                         vio->u.sendfile.cui_actor = args->u.sendfile.via_actor;
@@ -1169,10 +1177,10 @@ restart:
                         LBUG();
                 }
                 result = cl_io_loop(env, io);
-                if (write_mutex_locked)
-                       mutex_unlock(&lli->lli_write_mutex);
-                else if (args->via_io_subtype == IO_NORMAL && iot == CIT_READ)
+               if (args->via_io_subtype == IO_NORMAL)
                        up_read(&lli->lli_trunc_sem);
+               if (write_mutex_locked)
+                       mutex_unlock(&lli->lli_write_mutex);
         } else {
                 /* cl_io_rw_init() handled IO */
                 result = io->ci_result;
@@ -1208,6 +1216,7 @@ out:
                        fd->fd_write_failed = true;
                }
        }
+       CDEBUG(D_VFSTRACE, "iot: %d, result: %zd\n", iot, result);
 
        return result;
 }
@@ -1484,8 +1493,8 @@ int ll_lov_setstripe_ea_info(struct inode *inode, struct file *file,
        lsm = ccc_inode_lsm_get(inode);
        if (lsm != NULL) {
                ccc_inode_lsm_put(inode, lsm);
-               CDEBUG(D_IOCTL, "stripe already exists for ino %lu\n",
-                      inode->i_ino);
+               CDEBUG(D_IOCTL, "stripe already exists for inode "DFID"\n",
+                      PFID(ll_inode2fid(inode)));
                RETURN(-EEXIST);
        }
 
@@ -2288,8 +2297,8 @@ long ll_file_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
        int                      flags, rc;
        ENTRY;
 
-        CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p),cmd=%x\n", inode->i_ino,
-               inode->i_generation, inode, cmd);
+       CDEBUG(D_VFSTRACE, "VFS Op:inode="DFID"(%p), cmd=%x\n",
+              PFID(ll_inode2fid(inode)), inode, cmd);
         ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_IOCTL, 1);
 
         /* asm-ppc{,64} declares TCGETS, et. al. as type 't' not 'T' */
@@ -2674,8 +2683,8 @@ loff_t ll_file_seek(struct file *file, loff_t offset, int origin)
        ENTRY;
        retval = offset + ((origin == SEEK_END) ? i_size_read(inode) :
                           (origin == SEEK_CUR) ? file->f_pos : 0);
-       CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p), to=%llu=%#llx(%d)\n",
-              inode->i_ino, inode->i_generation, inode, retval, retval,
+       CDEBUG(D_VFSTRACE, "VFS Op:inode="DFID"(%p), to=%llu=%#llx(%d)\n",
+              PFID(ll_inode2fid(inode)), inode, retval, retval,
               origin);
        ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_LLSEEK, 1);
 
@@ -2794,8 +2803,8 @@ int ll_fsync(struct file *file, struct dentry *dentry, int datasync)
         int rc, err;
         ENTRY;
 
-        CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p)\n", inode->i_ino,
-               inode->i_generation, inode);
+       CDEBUG(D_VFSTRACE, "VFS Op:inode="DFID"(%p)\n",
+              PFID(ll_inode2fid(inode)), inode);
         ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_FSYNC, 1);
 
 #ifdef HAVE_FILE_FSYNC_4ARGS
@@ -2864,8 +2873,8 @@ int ll_file_flock(struct file *file, int cmd, struct file_lock *file_lock)
        int rc2 = 0;
        ENTRY;
 
-        CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu file_lock=%p\n",
-               inode->i_ino, file_lock);
+       CDEBUG(D_VFSTRACE, "VFS Op:inode="DFID" file_lock=%p\n",
+              PFID(ll_inode2fid(inode)), file_lock);
 
         ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_FLOCK, 1);
 
@@ -2950,9 +2959,10 @@ int ll_file_flock(struct file *file, int cmd, struct file_lock *file_lock)
         if (IS_ERR(op_data))
                 RETURN(PTR_ERR(op_data));
 
-       CDEBUG(D_DLMTRACE, "inode=%lu, pid=%u, flags="LPX64", mode=%u, "
-              "start="LPU64", end="LPU64"\n", inode->i_ino, flock.l_flock.pid,
-              flags, einfo.ei_mode, flock.l_flock.start, flock.l_flock.end);
+       CDEBUG(D_DLMTRACE, "inode="DFID", pid=%u, flags="LPX64", mode=%u, "
+              "start="LPU64", end="LPU64"\n", PFID(ll_inode2fid(inode)),
+              flock.l_flock.pid, flags, einfo.ei_mode,
+              flock.l_flock.start, flock.l_flock.end);
 
         rc = md_enqueue(sbi->ll_md_exp, &einfo, NULL,
                         op_data, &lockh, &flock, 0, NULL /* req */, flags);
@@ -3083,8 +3093,8 @@ int __ll_inode_revalidate_it(struct dentry *dentry, struct lookup_intent *it,
 
         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="DFID"(%p),name=%s\n",
+              PFID(ll_inode2fid(inode)), inode, dentry->d_name.name);
 
         exp = ll_i2mdexp(inode);
 
@@ -3353,8 +3363,8 @@ int ll_inode_permission(struct inode *inode, int mask, struct nameidata *nd)
                         RETURN(rc);
         }
 
-       CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p), inode mode %x mask %o\n",
-              inode->i_ino, inode->i_generation, inode, inode->i_mode, mask);
+       CDEBUG(D_VFSTRACE, "VFS Op:inode="DFID"(%p), inode mode %x mask %o\n",
+              PFID(ll_inode2fid(inode)), inode, inode->i_mode, mask);
 
        if (ll_i2sbi(inode)->ll_flags & LL_SBI_RMT_CLIENT)
                return lustre_check_remote_perm(inode, mask);
@@ -3655,8 +3665,8 @@ static int ll_layout_lock_set(struct lustre_handle *lockh, ldlm_mode_t mode,
        LASSERT(lock != NULL);
        LASSERT(ldlm_has_layout(lock));
 
-       LDLM_DEBUG(lock, "File %p/"DFID" being reconfigured: %d.\n",
-                  inode, PFID(&lli->lli_fid), reconf);
+       LDLM_DEBUG(lock, "file "DFID"(%p) being reconfigured: %d\n",
+                  PFID(&lli->lli_fid), inode, reconf);
 
        /* in case this is a caching lock and reinstate with new inode */
        md_set_lock_data(sbi->ll_md_exp, &lockh->cookie, inode, NULL);
@@ -3725,9 +3735,9 @@ out:
 
        /* wait for IO to complete if it's still being used. */
        if (wait_layout) {
-               CDEBUG(D_INODE, "%s: %p/"DFID" wait for layout reconf.\n",
-                       ll_get_fsname(inode->i_sb, NULL, 0),
-                       inode, PFID(&lli->lli_fid));
+               CDEBUG(D_INODE, "%s: "DFID"(%p) wait for layout reconf\n",
+                      ll_get_fsname(inode->i_sb, NULL, 0),
+                      PFID(&lli->lli_fid), inode);
 
                memset(&conf, 0, sizeof conf);
                conf.coc_opc = OBJECT_CONF_WAIT;
@@ -3736,8 +3746,9 @@ out:
                if (rc == 0)
                        rc = -EAGAIN;
 
-               CDEBUG(D_INODE, "file: "DFID" waiting layout return: %d.\n",
-                       PFID(&lli->lli_fid), rc);
+               CDEBUG(D_INODE, "%s file="DFID" waiting layout return: %d\n",
+                      ll_get_fsname(inode->i_sb, NULL, 0),
+                      PFID(&lli->lli_fid), rc);
        }
        RETURN(rc);
 }
@@ -3810,7 +3821,7 @@ again:
        }
 
        op_data = ll_prep_md_op_data(NULL, inode, inode, NULL,
-                       0, 0, LUSTRE_OPC_ANY, NULL);
+                                    0, 0, LUSTRE_OPC_ANY, NULL);
        if (IS_ERR(op_data)) {
                mutex_unlock(&lli->lli_layout_mutex);
                RETURN(PTR_ERR(op_data));
@@ -3821,9 +3832,9 @@ again:
        it.it_op = IT_LAYOUT;
        lockh.cookie = 0ULL;
 
-       LDLM_DEBUG_NOLOCK("%s: requeue layout lock for file %p/"DFID".\n",
-                       ll_get_fsname(inode->i_sb, NULL, 0), inode,
-                       PFID(&lli->lli_fid));
+       LDLM_DEBUG_NOLOCK("%s: requeue layout lock for file "DFID"(%p)\n",
+                         ll_get_fsname(inode->i_sb, NULL, 0),
+                         PFID(&lli->lli_fid), inode);
 
        rc = md_enqueue(sbi->ll_md_exp, &einfo, &it, op_data, &lockh,
                        NULL, 0, NULL, 0);