]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/hfs/hfs_vnops.c
xnu-792.21.3.tar.gz
[apple/xnu.git] / bsd / hfs / hfs_vnops.c
index e510c619c98195f3a8afeb2270f668e270324f04..614fde16a962469e8634373ca9d4ee9fca067b74 100644 (file)
@@ -1571,17 +1571,18 @@ hfs_removefile(struct vnode *dvp, struct vnode *vp, struct componentname *cnp,
        if ((cp->c_flag & C_HARDLINK) == 0 &&
            (!dataforkbusy || !rsrcforkbusy)) {
                /*
-                * A ubc_setsize can cause a pagein so defer it
-                * until after the cnode lock is dropped.  The
-                * cnode lock cannot be dropped/reacquired here
-                * since we might already hold the journal lock.
+                * A ubc_setsize can cause a pagein here 
+                * so we need to the drop cnode lock. Note
+                * that we still hold the truncate lock.
                 */
+               hfs_unlock(cp);
                if (!dataforkbusy && cp->c_datafork->ff_blocks && !isbigfile) {
-                       cp->c_flag |= C_NEED_DATA_SETSIZE;
+                       ubc_setsize(vp, 0);
                }
                if (!rsrcforkbusy && rvp) {
-                       cp->c_flag |= C_NEED_RSRC_SETSIZE;
+                       ubc_setsize(rvp, 0);
                }
+               hfs_lock(cp, HFS_FORCE_LOCK);
        } else {
            struct cat_desc cndesc;
 
@@ -1895,10 +1896,10 @@ out:
 __private_extern__ void
 replace_desc(struct cnode *cp, struct cat_desc *cdp)
 {
-       if (&cp->c_desc == cdp) {
-               return;
-       }
-
+    if (&cp->c_desc == cdp) {
+        return;
+    }
+         
        /* First release allocated name buffer */
        if (cp->c_desc.cd_flags & CD_HASBUF && cp->c_desc.cd_nameptr != 0) {
                char *name = cp->c_desc.cd_nameptr;
@@ -2834,7 +2835,7 @@ hfs_update(struct vnode *vp, __unused int waitfor)
         * we have to do the update.
         */
        if (ISSET(cp->c_flag, C_FORCEUPDATE) == 0 &&
-           (ISSET(cp->c_flag, C_DELETED) ||
+           (ISSET(cp->c_flag, C_DELETED) || 
            (dataforkp && cp->c_datafork->ff_unallocblocks) ||
            (rsrcforkp && cp->c_rsrcfork->ff_unallocblocks))) {
        //      cp->c_flag &= ~(C_ACCESS | C_CHANGE | C_UPDATE);
@@ -3718,6 +3719,7 @@ struct vnodeopv_entry_desc hfs_specop_entries[] = {
        { &vnop_pathconf_desc, (VOPFUNC)spec_pathconf },                /* pathconf */
        { &vnop_advlock_desc, (VOPFUNC)err_advlock },           /* advlock */
        { &vnop_bwrite_desc, (VOPFUNC)hfs_vnop_bwrite },
+       { &vnop_devblocksize_desc, (VOPFUNC)spec_devblocksize }, /* devblocksize */
        { &vnop_pagein_desc, (VOPFUNC)hfs_vnop_pagein },                /* Pagein */
        { &vnop_pageout_desc, (VOPFUNC)hfs_vnop_pageout },      /* Pageout */
         { &vnop_copyfile_desc, (VOPFUNC)err_copyfile },                /* copyfile */