[XFS] Lazy Superblock Counters
[linux-2.6] / fs / xfs / xfs_vnodeops.c
1 /*
2  * Copyright (c) 2000-2006 Silicon Graphics, Inc.
3  * All Rights Reserved.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it would be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write the Free Software Foundation,
16  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18
19 #include "xfs.h"
20 #include "xfs_fs.h"
21 #include "xfs_types.h"
22 #include "xfs_bit.h"
23 #include "xfs_log.h"
24 #include "xfs_inum.h"
25 #include "xfs_trans.h"
26 #include "xfs_sb.h"
27 #include "xfs_ag.h"
28 #include "xfs_dir2.h"
29 #include "xfs_dmapi.h"
30 #include "xfs_mount.h"
31 #include "xfs_da_btree.h"
32 #include "xfs_bmap_btree.h"
33 #include "xfs_alloc_btree.h"
34 #include "xfs_ialloc_btree.h"
35 #include "xfs_dir2_sf.h"
36 #include "xfs_attr_sf.h"
37 #include "xfs_dinode.h"
38 #include "xfs_inode.h"
39 #include "xfs_inode_item.h"
40 #include "xfs_itable.h"
41 #include "xfs_btree.h"
42 #include "xfs_ialloc.h"
43 #include "xfs_alloc.h"
44 #include "xfs_bmap.h"
45 #include "xfs_attr.h"
46 #include "xfs_rw.h"
47 #include "xfs_error.h"
48 #include "xfs_quota.h"
49 #include "xfs_utils.h"
50 #include "xfs_rtalloc.h"
51 #include "xfs_refcache.h"
52 #include "xfs_trans_space.h"
53 #include "xfs_log_priv.h"
54
55 STATIC int
56 xfs_open(
57         bhv_desc_t      *bdp,
58         cred_t          *credp)
59 {
60         int             mode;
61         bhv_vnode_t     *vp = BHV_TO_VNODE(bdp);
62         xfs_inode_t     *ip = XFS_BHVTOI(bdp);
63
64         if (XFS_FORCED_SHUTDOWN(ip->i_mount))
65                 return XFS_ERROR(EIO);
66
67         /*
68          * If it's a directory with any blocks, read-ahead block 0
69          * as we're almost certain to have the next operation be a read there.
70          */
71         if (VN_ISDIR(vp) && ip->i_d.di_nextents > 0) {
72                 mode = xfs_ilock_map_shared(ip);
73                 if (ip->i_d.di_nextents > 0)
74                         (void)xfs_da_reada_buf(NULL, ip, 0, XFS_DATA_FORK);
75                 xfs_iunlock(ip, mode);
76         }
77         return 0;
78 }
79
80 STATIC int
81 xfs_close(
82         bhv_desc_t      *bdp,
83         int             flags,
84         lastclose_t     lastclose,
85         cred_t          *credp)
86 {
87         bhv_vnode_t     *vp = BHV_TO_VNODE(bdp);
88         xfs_inode_t     *ip = XFS_BHVTOI(bdp);
89
90         if (XFS_FORCED_SHUTDOWN(ip->i_mount))
91                 return XFS_ERROR(EIO);
92
93         if (lastclose != L_TRUE || !VN_ISREG(vp))
94                 return 0;
95
96         /*
97          * If we previously truncated this file and removed old data in
98          * the process, we want to initiate "early" writeout on the last
99          * close.  This is an attempt to combat the notorious NULL files
100          * problem which is particularly noticable from a truncate down,
101          * buffered (re-)write (delalloc), followed by a crash.  What we
102          * are effectively doing here is significantly reducing the time
103          * window where we'd otherwise be exposed to that problem.
104          */
105         if (VUNTRUNCATE(vp) && VN_DIRTY(vp) && ip->i_delayed_blks > 0)
106                 return bhv_vop_flush_pages(vp, 0, -1, XFS_B_ASYNC, FI_NONE);
107         return 0;
108 }
109
110 /*
111  * xfs_getattr
112  */
113 STATIC int
114 xfs_getattr(
115         bhv_desc_t      *bdp,
116         bhv_vattr_t     *vap,
117         int             flags,
118         cred_t          *credp)
119 {
120         xfs_inode_t     *ip;
121         xfs_mount_t     *mp;
122         bhv_vnode_t     *vp;
123
124         vp  = BHV_TO_VNODE(bdp);
125         vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address);
126
127         ip = XFS_BHVTOI(bdp);
128         mp = ip->i_mount;
129
130         if (XFS_FORCED_SHUTDOWN(mp))
131                 return XFS_ERROR(EIO);
132
133         if (!(flags & ATTR_LAZY))
134                 xfs_ilock(ip, XFS_ILOCK_SHARED);
135
136         vap->va_size = XFS_ISIZE(ip);
137         if (vap->va_mask == XFS_AT_SIZE)
138                 goto all_done;
139
140         vap->va_nblocks =
141                 XFS_FSB_TO_BB(mp, ip->i_d.di_nblocks + ip->i_delayed_blks);
142         vap->va_nodeid = ip->i_ino;
143 #if XFS_BIG_INUMS
144         vap->va_nodeid += mp->m_inoadd;
145 #endif
146         vap->va_nlink = ip->i_d.di_nlink;
147
148         /*
149          * Quick exit for non-stat callers
150          */
151         if ((vap->va_mask &
152             ~(XFS_AT_SIZE|XFS_AT_FSID|XFS_AT_NODEID|
153               XFS_AT_NLINK|XFS_AT_BLKSIZE)) == 0)
154                 goto all_done;
155
156         /*
157          * Copy from in-core inode.
158          */
159         vap->va_mode = ip->i_d.di_mode;
160         vap->va_uid = ip->i_d.di_uid;
161         vap->va_gid = ip->i_d.di_gid;
162         vap->va_projid = ip->i_d.di_projid;
163
164         /*
165          * Check vnode type block/char vs. everything else.
166          */
167         switch (ip->i_d.di_mode & S_IFMT) {
168         case S_IFBLK:
169         case S_IFCHR:
170                 vap->va_rdev = ip->i_df.if_u2.if_rdev;
171                 vap->va_blocksize = BLKDEV_IOSIZE;
172                 break;
173         default:
174                 vap->va_rdev = 0;
175
176                 if (!(ip->i_d.di_flags & XFS_DIFLAG_REALTIME)) {
177                         vap->va_blocksize = xfs_preferred_iosize(mp);
178                 } else {
179
180                         /*
181                          * If the file blocks are being allocated from a
182                          * realtime partition, then return the inode's
183                          * realtime extent size or the realtime volume's
184                          * extent size.
185                          */
186                         vap->va_blocksize = ip->i_d.di_extsize ?
187                                 (ip->i_d.di_extsize << mp->m_sb.sb_blocklog) :
188                                 (mp->m_sb.sb_rextsize << mp->m_sb.sb_blocklog);
189                 }
190                 break;
191         }
192
193         vn_atime_to_timespec(vp, &vap->va_atime);
194         vap->va_mtime.tv_sec = ip->i_d.di_mtime.t_sec;
195         vap->va_mtime.tv_nsec = ip->i_d.di_mtime.t_nsec;
196         vap->va_ctime.tv_sec = ip->i_d.di_ctime.t_sec;
197         vap->va_ctime.tv_nsec = ip->i_d.di_ctime.t_nsec;
198
199         /*
200          * Exit for stat callers.  See if any of the rest of the fields
201          * to be filled in are needed.
202          */
203         if ((vap->va_mask &
204              (XFS_AT_XFLAGS|XFS_AT_EXTSIZE|XFS_AT_NEXTENTS|XFS_AT_ANEXTENTS|
205               XFS_AT_GENCOUNT|XFS_AT_VCODE)) == 0)
206                 goto all_done;
207
208         /*
209          * Convert di_flags to xflags.
210          */
211         vap->va_xflags = xfs_ip2xflags(ip);
212
213         /*
214          * Exit for inode revalidate.  See if any of the rest of
215          * the fields to be filled in are needed.
216          */
217         if ((vap->va_mask &
218              (XFS_AT_EXTSIZE|XFS_AT_NEXTENTS|XFS_AT_ANEXTENTS|
219               XFS_AT_GENCOUNT|XFS_AT_VCODE)) == 0)
220                 goto all_done;
221
222         vap->va_extsize = ip->i_d.di_extsize << mp->m_sb.sb_blocklog;
223         vap->va_nextents =
224                 (ip->i_df.if_flags & XFS_IFEXTENTS) ?
225                         ip->i_df.if_bytes / sizeof(xfs_bmbt_rec_t) :
226                         ip->i_d.di_nextents;
227         if (ip->i_afp)
228                 vap->va_anextents =
229                         (ip->i_afp->if_flags & XFS_IFEXTENTS) ?
230                                 ip->i_afp->if_bytes / sizeof(xfs_bmbt_rec_t) :
231                                  ip->i_d.di_anextents;
232         else
233                 vap->va_anextents = 0;
234         vap->va_gen = ip->i_d.di_gen;
235
236  all_done:
237         if (!(flags & ATTR_LAZY))
238                 xfs_iunlock(ip, XFS_ILOCK_SHARED);
239         return 0;
240 }
241
242
243 /*
244  * xfs_setattr
245  */
246 int
247 xfs_setattr(
248         bhv_desc_t              *bdp,
249         bhv_vattr_t             *vap,
250         int                     flags,
251         cred_t                  *credp)
252 {
253         xfs_inode_t             *ip;
254         xfs_trans_t             *tp;
255         xfs_mount_t             *mp;
256         int                     mask;
257         int                     code;
258         uint                    lock_flags;
259         uint                    commit_flags=0;
260         uid_t                   uid=0, iuid=0;
261         gid_t                   gid=0, igid=0;
262         int                     timeflags = 0;
263         bhv_vnode_t             *vp;
264         xfs_prid_t              projid=0, iprojid=0;
265         int                     mandlock_before, mandlock_after;
266         struct xfs_dquot        *udqp, *gdqp, *olddquot1, *olddquot2;
267         int                     file_owner;
268         int                     need_iolock = 1;
269
270         vp = BHV_TO_VNODE(bdp);
271         vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address);
272
273         if (vp->v_vfsp->vfs_flag & VFS_RDONLY)
274                 return XFS_ERROR(EROFS);
275
276         /*
277          * Cannot set certain attributes.
278          */
279         mask = vap->va_mask;
280         if (mask & XFS_AT_NOSET) {
281                 return XFS_ERROR(EINVAL);
282         }
283
284         ip = XFS_BHVTOI(bdp);
285         mp = ip->i_mount;
286
287         if (XFS_FORCED_SHUTDOWN(mp))
288                 return XFS_ERROR(EIO);
289
290         /*
291          * Timestamps do not need to be logged and hence do not
292          * need to be done within a transaction.
293          */
294         if (mask & XFS_AT_UPDTIMES) {
295                 ASSERT((mask & ~XFS_AT_UPDTIMES) == 0);
296                 timeflags = ((mask & XFS_AT_UPDATIME) ? XFS_ICHGTIME_ACC : 0) |
297                             ((mask & XFS_AT_UPDCTIME) ? XFS_ICHGTIME_CHG : 0) |
298                             ((mask & XFS_AT_UPDMTIME) ? XFS_ICHGTIME_MOD : 0);
299                 xfs_ichgtime(ip, timeflags);
300                 return 0;
301         }
302
303         olddquot1 = olddquot2 = NULL;
304         udqp = gdqp = NULL;
305
306         /*
307          * If disk quotas is on, we make sure that the dquots do exist on disk,
308          * before we start any other transactions. Trying to do this later
309          * is messy. We don't care to take a readlock to look at the ids
310          * in inode here, because we can't hold it across the trans_reserve.
311          * If the IDs do change before we take the ilock, we're covered
312          * because the i_*dquot fields will get updated anyway.
313          */
314         if (XFS_IS_QUOTA_ON(mp) &&
315             (mask & (XFS_AT_UID|XFS_AT_GID|XFS_AT_PROJID))) {
316                 uint    qflags = 0;
317
318                 if ((mask & XFS_AT_UID) && XFS_IS_UQUOTA_ON(mp)) {
319                         uid = vap->va_uid;
320                         qflags |= XFS_QMOPT_UQUOTA;
321                 } else {
322                         uid = ip->i_d.di_uid;
323                 }
324                 if ((mask & XFS_AT_GID) && XFS_IS_GQUOTA_ON(mp)) {
325                         gid = vap->va_gid;
326                         qflags |= XFS_QMOPT_GQUOTA;
327                 }  else {
328                         gid = ip->i_d.di_gid;
329                 }
330                 if ((mask & XFS_AT_PROJID) && XFS_IS_PQUOTA_ON(mp)) {
331                         projid = vap->va_projid;
332                         qflags |= XFS_QMOPT_PQUOTA;
333                 }  else {
334                         projid = ip->i_d.di_projid;
335                 }
336                 /*
337                  * We take a reference when we initialize udqp and gdqp,
338                  * so it is important that we never blindly double trip on
339                  * the same variable. See xfs_create() for an example.
340                  */
341                 ASSERT(udqp == NULL);
342                 ASSERT(gdqp == NULL);
343                 code = XFS_QM_DQVOPALLOC(mp, ip, uid, gid, projid, qflags,
344                                          &udqp, &gdqp);
345                 if (code)
346                         return code;
347         }
348
349         /*
350          * For the other attributes, we acquire the inode lock and
351          * first do an error checking pass.
352          */
353         tp = NULL;
354         lock_flags = XFS_ILOCK_EXCL;
355         if (flags & ATTR_NOLOCK)
356                 need_iolock = 0;
357         if (!(mask & XFS_AT_SIZE)) {
358                 if ((mask != (XFS_AT_CTIME|XFS_AT_ATIME|XFS_AT_MTIME)) ||
359                     (mp->m_flags & XFS_MOUNT_WSYNC)) {
360                         tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_NOT_SIZE);
361                         commit_flags = 0;
362                         if ((code = xfs_trans_reserve(tp, 0,
363                                                      XFS_ICHANGE_LOG_RES(mp), 0,
364                                                      0, 0))) {
365                                 lock_flags = 0;
366                                 goto error_return;
367                         }
368                 }
369         } else {
370                 if (DM_EVENT_ENABLED (vp->v_vfsp, ip, DM_EVENT_TRUNCATE) &&
371                     !(flags & ATTR_DMI)) {
372                         int dmflags = AT_DELAY_FLAG(flags) | DM_SEM_FLAG_WR;
373                         code = XFS_SEND_DATA(mp, DM_EVENT_TRUNCATE, vp,
374                                 vap->va_size, 0, dmflags, NULL);
375                         if (code) {
376                                 lock_flags = 0;
377                                 goto error_return;
378                         }
379                 }
380                 if (need_iolock)
381                         lock_flags |= XFS_IOLOCK_EXCL;
382         }
383
384         xfs_ilock(ip, lock_flags);
385
386         /* boolean: are we the file owner? */
387         file_owner = (current_fsuid(credp) == ip->i_d.di_uid);
388
389         /*
390          * Change various properties of a file.
391          * Only the owner or users with CAP_FOWNER
392          * capability may do these things.
393          */
394         if (mask &
395             (XFS_AT_MODE|XFS_AT_XFLAGS|XFS_AT_EXTSIZE|XFS_AT_UID|
396              XFS_AT_GID|XFS_AT_PROJID)) {
397                 /*
398                  * CAP_FOWNER overrides the following restrictions:
399                  *
400                  * The user ID of the calling process must be equal
401                  * to the file owner ID, except in cases where the
402                  * CAP_FSETID capability is applicable.
403                  */
404                 if (!file_owner && !capable(CAP_FOWNER)) {
405                         code = XFS_ERROR(EPERM);
406                         goto error_return;
407                 }
408
409                 /*
410                  * CAP_FSETID overrides the following restrictions:
411                  *
412                  * The effective user ID of the calling process shall match
413                  * the file owner when setting the set-user-ID and
414                  * set-group-ID bits on that file.
415                  *
416                  * The effective group ID or one of the supplementary group
417                  * IDs of the calling process shall match the group owner of
418                  * the file when setting the set-group-ID bit on that file
419                  */
420                 if (mask & XFS_AT_MODE) {
421                         mode_t m = 0;
422
423                         if ((vap->va_mode & S_ISUID) && !file_owner)
424                                 m |= S_ISUID;
425                         if ((vap->va_mode & S_ISGID) &&
426                             !in_group_p((gid_t)ip->i_d.di_gid))
427                                 m |= S_ISGID;
428 #if 0
429                         /* Linux allows this, Irix doesn't. */
430                         if ((vap->va_mode & S_ISVTX) && !VN_ISDIR(vp))
431                                 m |= S_ISVTX;
432 #endif
433                         if (m && !capable(CAP_FSETID))
434                                 vap->va_mode &= ~m;
435                 }
436         }
437
438         /*
439          * Change file ownership.  Must be the owner or privileged.
440          * If the system was configured with the "restricted_chown"
441          * option, the owner is not permitted to give away the file,
442          * and can change the group id only to a group of which he
443          * or she is a member.
444          */
445         if (mask & (XFS_AT_UID|XFS_AT_GID|XFS_AT_PROJID)) {
446                 /*
447                  * These IDs could have changed since we last looked at them.
448                  * But, we're assured that if the ownership did change
449                  * while we didn't have the inode locked, inode's dquot(s)
450                  * would have changed also.
451                  */
452                 iuid = ip->i_d.di_uid;
453                 iprojid = ip->i_d.di_projid;
454                 igid = ip->i_d.di_gid;
455                 gid = (mask & XFS_AT_GID) ? vap->va_gid : igid;
456                 uid = (mask & XFS_AT_UID) ? vap->va_uid : iuid;
457                 projid = (mask & XFS_AT_PROJID) ? (xfs_prid_t)vap->va_projid :
458                          iprojid;
459
460                 /*
461                  * CAP_CHOWN overrides the following restrictions:
462                  *
463                  * If _POSIX_CHOWN_RESTRICTED is defined, this capability
464                  * shall override the restriction that a process cannot
465                  * change the user ID of a file it owns and the restriction
466                  * that the group ID supplied to the chown() function
467                  * shall be equal to either the group ID or one of the
468                  * supplementary group IDs of the calling process.
469                  */
470                 if (restricted_chown &&
471                     (iuid != uid || (igid != gid &&
472                                      !in_group_p((gid_t)gid))) &&
473                     !capable(CAP_CHOWN)) {
474                         code = XFS_ERROR(EPERM);
475                         goto error_return;
476                 }
477                 /*
478                  * Do a quota reservation only if uid/projid/gid is actually
479                  * going to change.
480                  */
481                 if ((XFS_IS_UQUOTA_ON(mp) && iuid != uid) ||
482                     (XFS_IS_PQUOTA_ON(mp) && iprojid != projid) ||
483                     (XFS_IS_GQUOTA_ON(mp) && igid != gid)) {
484                         ASSERT(tp);
485                         code = XFS_QM_DQVOPCHOWNRESV(mp, tp, ip, udqp, gdqp,
486                                                 capable(CAP_FOWNER) ?
487                                                 XFS_QMOPT_FORCE_RES : 0);
488                         if (code)       /* out of quota */
489                                 goto error_return;
490                 }
491         }
492
493         /*
494          * Truncate file.  Must have write permission and not be a directory.
495          */
496         if (mask & XFS_AT_SIZE) {
497                 /* Short circuit the truncate case for zero length files */
498                 if ((vap->va_size == 0) &&
499                    (ip->i_size == 0) && (ip->i_d.di_nextents == 0)) {
500                         xfs_iunlock(ip, XFS_ILOCK_EXCL);
501                         lock_flags &= ~XFS_ILOCK_EXCL;
502                         if (mask & XFS_AT_CTIME)
503                                 xfs_ichgtime(ip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
504                         code = 0;
505                         goto error_return;
506                 }
507
508                 if (VN_ISDIR(vp)) {
509                         code = XFS_ERROR(EISDIR);
510                         goto error_return;
511                 } else if (!VN_ISREG(vp)) {
512                         code = XFS_ERROR(EINVAL);
513                         goto error_return;
514                 }
515                 /*
516                  * Make sure that the dquots are attached to the inode.
517                  */
518                 if ((code = XFS_QM_DQATTACH(mp, ip, XFS_QMOPT_ILOCKED)))
519                         goto error_return;
520         }
521
522         /*
523          * Change file access or modified times.
524          */
525         if (mask & (XFS_AT_ATIME|XFS_AT_MTIME)) {
526                 if (!file_owner) {
527                         if ((flags & ATTR_UTIME) &&
528                             !capable(CAP_FOWNER)) {
529                                 code = XFS_ERROR(EPERM);
530                                 goto error_return;
531                         }
532                 }
533         }
534
535         /*
536          * Change extent size or realtime flag.
537          */
538         if (mask & (XFS_AT_EXTSIZE|XFS_AT_XFLAGS)) {
539                 /*
540                  * Can't change extent size if any extents are allocated.
541                  */
542                 if (ip->i_d.di_nextents && (mask & XFS_AT_EXTSIZE) &&
543                     ((ip->i_d.di_extsize << mp->m_sb.sb_blocklog) !=
544                      vap->va_extsize) ) {
545                         code = XFS_ERROR(EINVAL);       /* EFBIG? */
546                         goto error_return;
547                 }
548
549                 /*
550                  * Can't change realtime flag if any extents are allocated.
551                  */
552                 if ((ip->i_d.di_nextents || ip->i_delayed_blks) &&
553                     (mask & XFS_AT_XFLAGS) &&
554                     (ip->i_d.di_flags & XFS_DIFLAG_REALTIME) !=
555                     (vap->va_xflags & XFS_XFLAG_REALTIME)) {
556                         code = XFS_ERROR(EINVAL);       /* EFBIG? */
557                         goto error_return;
558                 }
559                 /*
560                  * Extent size must be a multiple of the appropriate block
561                  * size, if set at all.
562                  */
563                 if ((mask & XFS_AT_EXTSIZE) && vap->va_extsize != 0) {
564                         xfs_extlen_t    size;
565
566                         if ((ip->i_d.di_flags & XFS_DIFLAG_REALTIME) ||
567                             ((mask & XFS_AT_XFLAGS) &&
568                             (vap->va_xflags & XFS_XFLAG_REALTIME))) {
569                                 size = mp->m_sb.sb_rextsize <<
570                                        mp->m_sb.sb_blocklog;
571                         } else {
572                                 size = mp->m_sb.sb_blocksize;
573                         }
574                         if (vap->va_extsize % size) {
575                                 code = XFS_ERROR(EINVAL);
576                                 goto error_return;
577                         }
578                 }
579                 /*
580                  * If realtime flag is set then must have realtime data.
581                  */
582                 if ((mask & XFS_AT_XFLAGS) &&
583                     (vap->va_xflags & XFS_XFLAG_REALTIME)) {
584                         if ((mp->m_sb.sb_rblocks == 0) ||
585                             (mp->m_sb.sb_rextsize == 0) ||
586                             (ip->i_d.di_extsize % mp->m_sb.sb_rextsize)) {
587                                 code = XFS_ERROR(EINVAL);
588                                 goto error_return;
589                         }
590                 }
591
592                 /*
593                  * Can't modify an immutable/append-only file unless
594                  * we have appropriate permission.
595                  */
596                 if ((mask & XFS_AT_XFLAGS) &&
597                     (ip->i_d.di_flags &
598                                 (XFS_DIFLAG_IMMUTABLE|XFS_DIFLAG_APPEND) ||
599                      (vap->va_xflags &
600                                 (XFS_XFLAG_IMMUTABLE | XFS_XFLAG_APPEND))) &&
601                     !capable(CAP_LINUX_IMMUTABLE)) {
602                         code = XFS_ERROR(EPERM);
603                         goto error_return;
604                 }
605         }
606
607         /*
608          * Now we can make the changes.  Before we join the inode
609          * to the transaction, if XFS_AT_SIZE is set then take care of
610          * the part of the truncation that must be done without the
611          * inode lock.  This needs to be done before joining the inode
612          * to the transaction, because the inode cannot be unlocked
613          * once it is a part of the transaction.
614          */
615         if (mask & XFS_AT_SIZE) {
616                 code = 0;
617                 if ((vap->va_size > ip->i_size) &&
618                     (flags & ATTR_NOSIZETOK) == 0) {
619                         code = xfs_igrow_start(ip, vap->va_size, credp);
620                 }
621                 xfs_iunlock(ip, XFS_ILOCK_EXCL);
622                 vn_iowait(vp); /* wait for the completion of any pending DIOs */
623                 if (!code)
624                         code = xfs_itruncate_data(ip, vap->va_size);
625                 if (code) {
626                         ASSERT(tp == NULL);
627                         lock_flags &= ~XFS_ILOCK_EXCL;
628                         ASSERT(lock_flags == XFS_IOLOCK_EXCL);
629                         goto error_return;
630                 }
631                 tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_SIZE);
632                 if ((code = xfs_trans_reserve(tp, 0,
633                                              XFS_ITRUNCATE_LOG_RES(mp), 0,
634                                              XFS_TRANS_PERM_LOG_RES,
635                                              XFS_ITRUNCATE_LOG_COUNT))) {
636                         xfs_trans_cancel(tp, 0);
637                         if (need_iolock)
638                                 xfs_iunlock(ip, XFS_IOLOCK_EXCL);
639                         return code;
640                 }
641                 commit_flags = XFS_TRANS_RELEASE_LOG_RES;
642                 xfs_ilock(ip, XFS_ILOCK_EXCL);
643         }
644
645         if (tp) {
646                 xfs_trans_ijoin(tp, ip, lock_flags);
647                 xfs_trans_ihold(tp, ip);
648         }
649
650         /* determine whether mandatory locking mode changes */
651         mandlock_before = MANDLOCK(vp, ip->i_d.di_mode);
652
653         /*
654          * Truncate file.  Must have write permission and not be a directory.
655          */
656         if (mask & XFS_AT_SIZE) {
657                 if (vap->va_size > ip->i_size) {
658                         xfs_igrow_finish(tp, ip, vap->va_size,
659                             !(flags & ATTR_DMI));
660                 } else if ((vap->va_size <= ip->i_size) ||
661                            ((vap->va_size == 0) && ip->i_d.di_nextents)) {
662                         /*
663                          * signal a sync transaction unless
664                          * we're truncating an already unlinked
665                          * file on a wsync filesystem
666                          */
667                         code = xfs_itruncate_finish(&tp, ip,
668                                             (xfs_fsize_t)vap->va_size,
669                                             XFS_DATA_FORK,
670                                             ((ip->i_d.di_nlink != 0 ||
671                                               !(mp->m_flags & XFS_MOUNT_WSYNC))
672                                              ? 1 : 0));
673                         if (code)
674                                 goto abort_return;
675                         /*
676                          * Truncated "down", so we're removing references
677                          * to old data here - if we now delay flushing for
678                          * a long time, we expose ourselves unduly to the
679                          * notorious NULL files problem.  So, we mark this
680                          * vnode and flush it when the file is closed, and
681                          * do not wait the usual (long) time for writeout.
682                          */
683                         VTRUNCATE(vp);
684                 }
685                 /*
686                  * Have to do this even if the file's size doesn't change.
687                  */
688                 timeflags |= XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG;
689         }
690
691         /*
692          * Change file access modes.
693          */
694         if (mask & XFS_AT_MODE) {
695                 ip->i_d.di_mode &= S_IFMT;
696                 ip->i_d.di_mode |= vap->va_mode & ~S_IFMT;
697
698                 xfs_trans_log_inode (tp, ip, XFS_ILOG_CORE);
699                 timeflags |= XFS_ICHGTIME_CHG;
700         }
701
702         /*
703          * Change file ownership.  Must be the owner or privileged.
704          * If the system was configured with the "restricted_chown"
705          * option, the owner is not permitted to give away the file,
706          * and can change the group id only to a group of which he
707          * or she is a member.
708          */
709         if (mask & (XFS_AT_UID|XFS_AT_GID|XFS_AT_PROJID)) {
710                 /*
711                  * CAP_FSETID overrides the following restrictions:
712                  *
713                  * The set-user-ID and set-group-ID bits of a file will be
714                  * cleared upon successful return from chown()
715                  */
716                 if ((ip->i_d.di_mode & (S_ISUID|S_ISGID)) &&
717                     !capable(CAP_FSETID)) {
718                         ip->i_d.di_mode &= ~(S_ISUID|S_ISGID);
719                 }
720
721                 /*
722                  * Change the ownerships and register quota modifications
723                  * in the transaction.
724                  */
725                 if (iuid != uid) {
726                         if (XFS_IS_UQUOTA_ON(mp)) {
727                                 ASSERT(mask & XFS_AT_UID);
728                                 ASSERT(udqp);
729                                 olddquot1 = XFS_QM_DQVOPCHOWN(mp, tp, ip,
730                                                         &ip->i_udquot, udqp);
731                         }
732                         ip->i_d.di_uid = uid;
733                 }
734                 if (igid != gid) {
735                         if (XFS_IS_GQUOTA_ON(mp)) {
736                                 ASSERT(!XFS_IS_PQUOTA_ON(mp));
737                                 ASSERT(mask & XFS_AT_GID);
738                                 ASSERT(gdqp);
739                                 olddquot2 = XFS_QM_DQVOPCHOWN(mp, tp, ip,
740                                                         &ip->i_gdquot, gdqp);
741                         }
742                         ip->i_d.di_gid = gid;
743                 }
744                 if (iprojid != projid) {
745                         if (XFS_IS_PQUOTA_ON(mp)) {
746                                 ASSERT(!XFS_IS_GQUOTA_ON(mp));
747                                 ASSERT(mask & XFS_AT_PROJID);
748                                 ASSERT(gdqp);
749                                 olddquot2 = XFS_QM_DQVOPCHOWN(mp, tp, ip,
750                                                         &ip->i_gdquot, gdqp);
751                         }
752                         ip->i_d.di_projid = projid;
753                         /*
754                          * We may have to rev the inode as well as
755                          * the superblock version number since projids didn't
756                          * exist before DINODE_VERSION_2 and SB_VERSION_NLINK.
757                          */
758                         if (ip->i_d.di_version == XFS_DINODE_VERSION_1)
759                                 xfs_bump_ino_vers2(tp, ip);
760                 }
761
762                 xfs_trans_log_inode (tp, ip, XFS_ILOG_CORE);
763                 timeflags |= XFS_ICHGTIME_CHG;
764         }
765
766
767         /*
768          * Change file access or modified times.
769          */
770         if (mask & (XFS_AT_ATIME|XFS_AT_MTIME)) {
771                 if (mask & XFS_AT_ATIME) {
772                         ip->i_d.di_atime.t_sec = vap->va_atime.tv_sec;
773                         ip->i_d.di_atime.t_nsec = vap->va_atime.tv_nsec;
774                         ip->i_update_core = 1;
775                         timeflags &= ~XFS_ICHGTIME_ACC;
776                 }
777                 if (mask & XFS_AT_MTIME) {
778                         ip->i_d.di_mtime.t_sec = vap->va_mtime.tv_sec;
779                         ip->i_d.di_mtime.t_nsec = vap->va_mtime.tv_nsec;
780                         timeflags &= ~XFS_ICHGTIME_MOD;
781                         timeflags |= XFS_ICHGTIME_CHG;
782                 }
783                 if (tp && (flags & ATTR_UTIME))
784                         xfs_trans_log_inode (tp, ip, XFS_ILOG_CORE);
785         }
786
787         /*
788          * Change XFS-added attributes.
789          */
790         if (mask & (XFS_AT_EXTSIZE|XFS_AT_XFLAGS)) {
791                 if (mask & XFS_AT_EXTSIZE) {
792                         /*
793                          * Converting bytes to fs blocks.
794                          */
795                         ip->i_d.di_extsize = vap->va_extsize >>
796                                 mp->m_sb.sb_blocklog;
797                 }
798                 if (mask & XFS_AT_XFLAGS) {
799                         uint    di_flags;
800
801                         /* can't set PREALLOC this way, just preserve it */
802                         di_flags = (ip->i_d.di_flags & XFS_DIFLAG_PREALLOC);
803                         if (vap->va_xflags & XFS_XFLAG_IMMUTABLE)
804                                 di_flags |= XFS_DIFLAG_IMMUTABLE;
805                         if (vap->va_xflags & XFS_XFLAG_APPEND)
806                                 di_flags |= XFS_DIFLAG_APPEND;
807                         if (vap->va_xflags & XFS_XFLAG_SYNC)
808                                 di_flags |= XFS_DIFLAG_SYNC;
809                         if (vap->va_xflags & XFS_XFLAG_NOATIME)
810                                 di_flags |= XFS_DIFLAG_NOATIME;
811                         if (vap->va_xflags & XFS_XFLAG_NODUMP)
812                                 di_flags |= XFS_DIFLAG_NODUMP;
813                         if (vap->va_xflags & XFS_XFLAG_PROJINHERIT)
814                                 di_flags |= XFS_DIFLAG_PROJINHERIT;
815                         if (vap->va_xflags & XFS_XFLAG_NODEFRAG)
816                                 di_flags |= XFS_DIFLAG_NODEFRAG;
817                         if ((ip->i_d.di_mode & S_IFMT) == S_IFDIR) {
818                                 if (vap->va_xflags & XFS_XFLAG_RTINHERIT)
819                                         di_flags |= XFS_DIFLAG_RTINHERIT;
820                                 if (vap->va_xflags & XFS_XFLAG_NOSYMLINKS)
821                                         di_flags |= XFS_DIFLAG_NOSYMLINKS;
822                                 if (vap->va_xflags & XFS_XFLAG_EXTSZINHERIT)
823                                         di_flags |= XFS_DIFLAG_EXTSZINHERIT;
824                         } else if ((ip->i_d.di_mode & S_IFMT) == S_IFREG) {
825                                 if (vap->va_xflags & XFS_XFLAG_REALTIME) {
826                                         di_flags |= XFS_DIFLAG_REALTIME;
827                                         ip->i_iocore.io_flags |= XFS_IOCORE_RT;
828                                 } else {
829                                         ip->i_iocore.io_flags &= ~XFS_IOCORE_RT;
830                                 }
831                                 if (vap->va_xflags & XFS_XFLAG_EXTSIZE)
832                                         di_flags |= XFS_DIFLAG_EXTSIZE;
833                         }
834                         ip->i_d.di_flags = di_flags;
835                 }
836                 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
837                 timeflags |= XFS_ICHGTIME_CHG;
838         }
839
840         /*
841          * Change file inode change time only if XFS_AT_CTIME set
842          * AND we have been called by a DMI function.
843          */
844
845         if ( (flags & ATTR_DMI) && (mask & XFS_AT_CTIME) ) {
846                 ip->i_d.di_ctime.t_sec = vap->va_ctime.tv_sec;
847                 ip->i_d.di_ctime.t_nsec = vap->va_ctime.tv_nsec;
848                 ip->i_update_core = 1;
849                 timeflags &= ~XFS_ICHGTIME_CHG;
850         }
851
852         /*
853          * Send out timestamp changes that need to be set to the
854          * current time.  Not done when called by a DMI function.
855          */
856         if (timeflags && !(flags & ATTR_DMI))
857                 xfs_ichgtime(ip, timeflags);
858
859         XFS_STATS_INC(xs_ig_attrchg);
860
861         /*
862          * If this is a synchronous mount, make sure that the
863          * transaction goes to disk before returning to the user.
864          * This is slightly sub-optimal in that truncates require
865          * two sync transactions instead of one for wsync filesystems.
866          * One for the truncate and one for the timestamps since we
867          * don't want to change the timestamps unless we're sure the
868          * truncate worked.  Truncates are less than 1% of the laddis
869          * mix so this probably isn't worth the trouble to optimize.
870          */
871         code = 0;
872         if (tp) {
873                 if (mp->m_flags & XFS_MOUNT_WSYNC)
874                         xfs_trans_set_sync(tp);
875
876                 code = xfs_trans_commit(tp, commit_flags);
877         }
878
879         /*
880          * If the (regular) file's mandatory locking mode changed, then
881          * notify the vnode.  We do this under the inode lock to prevent
882          * racing calls to vop_vnode_change.
883          */
884         mandlock_after = MANDLOCK(vp, ip->i_d.di_mode);
885         if (mandlock_before != mandlock_after) {
886                 bhv_vop_vnode_change(vp, VCHANGE_FLAGS_ENF_LOCKING,
887                                  mandlock_after);
888         }
889
890         xfs_iunlock(ip, lock_flags);
891
892         /*
893          * Release any dquot(s) the inode had kept before chown.
894          */
895         XFS_QM_DQRELE(mp, olddquot1);
896         XFS_QM_DQRELE(mp, olddquot2);
897         XFS_QM_DQRELE(mp, udqp);
898         XFS_QM_DQRELE(mp, gdqp);
899
900         if (code) {
901                 return code;
902         }
903
904         if (DM_EVENT_ENABLED(vp->v_vfsp, ip, DM_EVENT_ATTRIBUTE) &&
905             !(flags & ATTR_DMI)) {
906                 (void) XFS_SEND_NAMESP(mp, DM_EVENT_ATTRIBUTE, vp, DM_RIGHT_NULL,
907                                         NULL, DM_RIGHT_NULL, NULL, NULL,
908                                         0, 0, AT_DELAY_FLAG(flags));
909         }
910         return 0;
911
912  abort_return:
913         commit_flags |= XFS_TRANS_ABORT;
914         /* FALLTHROUGH */
915  error_return:
916         XFS_QM_DQRELE(mp, udqp);
917         XFS_QM_DQRELE(mp, gdqp);
918         if (tp) {
919                 xfs_trans_cancel(tp, commit_flags);
920         }
921         if (lock_flags != 0) {
922                 xfs_iunlock(ip, lock_flags);
923         }
924         return code;
925 }
926
927
928 /*
929  * xfs_access
930  * Null conversion from vnode mode bits to inode mode bits, as in efs.
931  */
932 STATIC int
933 xfs_access(
934         bhv_desc_t      *bdp,
935         int             mode,
936         cred_t          *credp)
937 {
938         xfs_inode_t     *ip;
939         int             error;
940
941         vn_trace_entry(BHV_TO_VNODE(bdp), __FUNCTION__,
942                                                (inst_t *)__return_address);
943
944         ip = XFS_BHVTOI(bdp);
945         xfs_ilock(ip, XFS_ILOCK_SHARED);
946         error = xfs_iaccess(ip, mode, credp);
947         xfs_iunlock(ip, XFS_ILOCK_SHARED);
948         return error;
949 }
950
951
952 /*
953  * The maximum pathlen is 1024 bytes. Since the minimum file system
954  * blocksize is 512 bytes, we can get a max of 2 extents back from
955  * bmapi.
956  */
957 #define SYMLINK_MAPS 2
958
959 /*
960  * xfs_readlink
961  *
962  */
963 STATIC int
964 xfs_readlink(
965         bhv_desc_t      *bdp,
966         uio_t           *uiop,
967         int             ioflags,
968         cred_t          *credp)
969 {
970         xfs_inode_t     *ip;
971         int             count;
972         xfs_off_t       offset;
973         int             pathlen;
974         bhv_vnode_t     *vp;
975         int             error = 0;
976         xfs_mount_t     *mp;
977         int             nmaps;
978         xfs_bmbt_irec_t mval[SYMLINK_MAPS];
979         xfs_daddr_t     d;
980         int             byte_cnt;
981         int             n;
982         xfs_buf_t       *bp;
983
984         vp = BHV_TO_VNODE(bdp);
985         vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address);
986
987         ip = XFS_BHVTOI(bdp);
988         mp = ip->i_mount;
989
990         if (XFS_FORCED_SHUTDOWN(mp))
991                 return XFS_ERROR(EIO);
992
993         xfs_ilock(ip, XFS_ILOCK_SHARED);
994
995         ASSERT((ip->i_d.di_mode & S_IFMT) == S_IFLNK);
996
997         offset = uiop->uio_offset;
998         count = uiop->uio_resid;
999
1000         if (offset < 0) {
1001                 error = XFS_ERROR(EINVAL);
1002                 goto error_return;
1003         }
1004         if (count <= 0) {
1005                 error = 0;
1006                 goto error_return;
1007         }
1008
1009         /*
1010          * See if the symlink is stored inline.
1011          */
1012         pathlen = (int)ip->i_d.di_size;
1013
1014         if (ip->i_df.if_flags & XFS_IFINLINE) {
1015                 error = xfs_uio_read(ip->i_df.if_u1.if_data, pathlen, uiop);
1016         }
1017         else {
1018                 /*
1019                  * Symlink not inline.  Call bmap to get it in.
1020                  */
1021                 nmaps = SYMLINK_MAPS;
1022
1023                 error = xfs_bmapi(NULL, ip, 0, XFS_B_TO_FSB(mp, pathlen),
1024                                   0, NULL, 0, mval, &nmaps, NULL, NULL);
1025
1026                 if (error) {
1027                         goto error_return;
1028                 }
1029
1030                 for (n = 0; n < nmaps; n++) {
1031                         d = XFS_FSB_TO_DADDR(mp, mval[n].br_startblock);
1032                         byte_cnt = XFS_FSB_TO_B(mp, mval[n].br_blockcount);
1033                         bp = xfs_buf_read(mp->m_ddev_targp, d,
1034                                       BTOBB(byte_cnt), 0);
1035                         error = XFS_BUF_GETERROR(bp);
1036                         if (error) {
1037                                 xfs_ioerror_alert("xfs_readlink",
1038                                           ip->i_mount, bp, XFS_BUF_ADDR(bp));
1039                                 xfs_buf_relse(bp);
1040                                 goto error_return;
1041                         }
1042                         if (pathlen < byte_cnt)
1043                                 byte_cnt = pathlen;
1044                         pathlen -= byte_cnt;
1045
1046                         error = xfs_uio_read(XFS_BUF_PTR(bp), byte_cnt, uiop);
1047                         xfs_buf_relse (bp);
1048                 }
1049
1050         }
1051
1052 error_return:
1053         xfs_iunlock(ip, XFS_ILOCK_SHARED);
1054         return error;
1055 }
1056
1057
1058 /*
1059  * xfs_fsync
1060  *
1061  * This is called to sync the inode and its data out to disk.
1062  * We need to hold the I/O lock while flushing the data, and
1063  * the inode lock while flushing the inode.  The inode lock CANNOT
1064  * be held while flushing the data, so acquire after we're done
1065  * with that.
1066  */
1067 STATIC int
1068 xfs_fsync(
1069         bhv_desc_t      *bdp,
1070         int             flag,
1071         cred_t          *credp,
1072         xfs_off_t       start,
1073         xfs_off_t       stop)
1074 {
1075         xfs_inode_t     *ip;
1076         xfs_trans_t     *tp;
1077         int             error;
1078         int             log_flushed = 0, changed = 1;
1079
1080         vn_trace_entry(BHV_TO_VNODE(bdp),
1081                         __FUNCTION__, (inst_t *)__return_address);
1082
1083         ip = XFS_BHVTOI(bdp);
1084
1085         ASSERT(start >= 0 && stop >= -1);
1086
1087         if (XFS_FORCED_SHUTDOWN(ip->i_mount))
1088                 return XFS_ERROR(EIO);
1089
1090         /*
1091          * We always need to make sure that the required inode state
1092          * is safe on disk.  The vnode might be clean but because
1093          * of committed transactions that haven't hit the disk yet.
1094          * Likewise, there could be unflushed non-transactional
1095          * changes to the inode core that have to go to disk.
1096          *
1097          * The following code depends on one assumption:  that
1098          * any transaction that changes an inode logs the core
1099          * because it has to change some field in the inode core
1100          * (typically nextents or nblocks).  That assumption
1101          * implies that any transactions against an inode will
1102          * catch any non-transactional updates.  If inode-altering
1103          * transactions exist that violate this assumption, the
1104          * code breaks.  Right now, it figures that if the involved
1105          * update_* field is clear and the inode is unpinned, the
1106          * inode is clean.  Either it's been flushed or it's been
1107          * committed and the commit has hit the disk unpinning the inode.
1108          * (Note that xfs_inode_item_format() called at commit clears
1109          * the update_* fields.)
1110          */
1111         xfs_ilock(ip, XFS_ILOCK_SHARED);
1112
1113         /* If we are flushing data then we care about update_size
1114          * being set, otherwise we care about update_core
1115          */
1116         if ((flag & FSYNC_DATA) ?
1117                         (ip->i_update_size == 0) :
1118                         (ip->i_update_core == 0)) {
1119                 /*
1120                  * Timestamps/size haven't changed since last inode
1121                  * flush or inode transaction commit.  That means
1122                  * either nothing got written or a transaction
1123                  * committed which caught the updates.  If the
1124                  * latter happened and the transaction hasn't
1125                  * hit the disk yet, the inode will be still
1126                  * be pinned.  If it is, force the log.
1127                  */
1128
1129                 xfs_iunlock(ip, XFS_ILOCK_SHARED);
1130
1131                 if (xfs_ipincount(ip)) {
1132                         _xfs_log_force(ip->i_mount, (xfs_lsn_t)0,
1133                                       XFS_LOG_FORCE |
1134                                       ((flag & FSYNC_WAIT)
1135                                        ? XFS_LOG_SYNC : 0),
1136                                       &log_flushed);
1137                 } else {
1138                         /*
1139                          * If the inode is not pinned and nothing
1140                          * has changed we don't need to flush the
1141                          * cache.
1142                          */
1143                         changed = 0;
1144                 }
1145                 error = 0;
1146         } else  {
1147                 /*
1148                  * Kick off a transaction to log the inode
1149                  * core to get the updates.  Make it
1150                  * sync if FSYNC_WAIT is passed in (which
1151                  * is done by everybody but specfs).  The
1152                  * sync transaction will also force the log.
1153                  */
1154                 xfs_iunlock(ip, XFS_ILOCK_SHARED);
1155                 tp = xfs_trans_alloc(ip->i_mount, XFS_TRANS_FSYNC_TS);
1156                 if ((error = xfs_trans_reserve(tp, 0,
1157                                 XFS_FSYNC_TS_LOG_RES(ip->i_mount),
1158                                 0, 0, 0)))  {
1159                         xfs_trans_cancel(tp, 0);
1160                         return error;
1161                 }
1162                 xfs_ilock(ip, XFS_ILOCK_EXCL);
1163
1164                 /*
1165                  * Note - it's possible that we might have pushed
1166                  * ourselves out of the way during trans_reserve
1167                  * which would flush the inode.  But there's no
1168                  * guarantee that the inode buffer has actually
1169                  * gone out yet (it's delwri).  Plus the buffer
1170                  * could be pinned anyway if it's part of an
1171                  * inode in another recent transaction.  So we
1172                  * play it safe and fire off the transaction anyway.
1173                  */
1174                 xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
1175                 xfs_trans_ihold(tp, ip);
1176                 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
1177                 if (flag & FSYNC_WAIT)
1178                         xfs_trans_set_sync(tp);
1179                 error = _xfs_trans_commit(tp, 0, &log_flushed);
1180
1181                 xfs_iunlock(ip, XFS_ILOCK_EXCL);
1182         }
1183
1184         if ((ip->i_mount->m_flags & XFS_MOUNT_BARRIER) && changed) {
1185                 /*
1186                  * If the log write didn't issue an ordered tag we need
1187                  * to flush the disk cache for the data device now.
1188                  */
1189                 if (!log_flushed)
1190                         xfs_blkdev_issue_flush(ip->i_mount->m_ddev_targp);
1191
1192                 /*
1193                  * If this inode is on the RT dev we need to flush that
1194                  * cache as well.
1195                  */
1196                 if (ip->i_d.di_flags & XFS_DIFLAG_REALTIME)
1197                         xfs_blkdev_issue_flush(ip->i_mount->m_rtdev_targp);
1198         }
1199
1200         return error;
1201 }
1202
1203 /*
1204  * This is called by xfs_inactive to free any blocks beyond eof
1205  * when the link count isn't zero and by xfs_dm_punch_hole() when
1206  * punching a hole to EOF.
1207  */
1208 int
1209 xfs_free_eofblocks(
1210         xfs_mount_t     *mp,
1211         xfs_inode_t     *ip,
1212         int             flags)
1213 {
1214         xfs_trans_t     *tp;
1215         int             error;
1216         xfs_fileoff_t   end_fsb;
1217         xfs_fileoff_t   last_fsb;
1218         xfs_filblks_t   map_len;
1219         int             nimaps;
1220         xfs_bmbt_irec_t imap;
1221         int             use_iolock = (flags & XFS_FREE_EOF_LOCK);
1222
1223         /*
1224          * Figure out if there are any blocks beyond the end
1225          * of the file.  If not, then there is nothing to do.
1226          */
1227         end_fsb = XFS_B_TO_FSB(mp, ((xfs_ufsize_t)ip->i_size));
1228         last_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)XFS_MAXIOFFSET(mp));
1229         map_len = last_fsb - end_fsb;
1230         if (map_len <= 0)
1231                 return 0;
1232
1233         nimaps = 1;
1234         xfs_ilock(ip, XFS_ILOCK_SHARED);
1235         error = XFS_BMAPI(mp, NULL, &ip->i_iocore, end_fsb, map_len, 0,
1236                           NULL, 0, &imap, &nimaps, NULL, NULL);
1237         xfs_iunlock(ip, XFS_ILOCK_SHARED);
1238
1239         if (!error && (nimaps != 0) &&
1240             (imap.br_startblock != HOLESTARTBLOCK ||
1241              ip->i_delayed_blks)) {
1242                 /*
1243                  * Attach the dquots to the inode up front.
1244                  */
1245                 if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
1246                         return error;
1247
1248                 /*
1249                  * There are blocks after the end of file.
1250                  * Free them up now by truncating the file to
1251                  * its current size.
1252                  */
1253                 tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE);
1254
1255                 /*
1256                  * Do the xfs_itruncate_start() call before
1257                  * reserving any log space because
1258                  * itruncate_start will call into the buffer
1259                  * cache and we can't
1260                  * do that within a transaction.
1261                  */
1262                 if (use_iolock)
1263                         xfs_ilock(ip, XFS_IOLOCK_EXCL);
1264                 error = xfs_itruncate_start(ip, XFS_ITRUNC_DEFINITE,
1265                                     ip->i_size);
1266                 if (error) {
1267                         if (use_iolock)
1268                                 xfs_iunlock(ip, XFS_IOLOCK_EXCL);
1269                         return error;
1270                 }
1271
1272                 error = xfs_trans_reserve(tp, 0,
1273                                           XFS_ITRUNCATE_LOG_RES(mp),
1274                                           0, XFS_TRANS_PERM_LOG_RES,
1275                                           XFS_ITRUNCATE_LOG_COUNT);
1276                 if (error) {
1277                         ASSERT(XFS_FORCED_SHUTDOWN(mp));
1278                         xfs_trans_cancel(tp, 0);
1279                         xfs_iunlock(ip, XFS_IOLOCK_EXCL);
1280                         return error;
1281                 }
1282
1283                 xfs_ilock(ip, XFS_ILOCK_EXCL);
1284                 xfs_trans_ijoin(tp, ip,
1285                                 XFS_IOLOCK_EXCL |
1286                                 XFS_ILOCK_EXCL);
1287                 xfs_trans_ihold(tp, ip);
1288
1289                 error = xfs_itruncate_finish(&tp, ip,
1290                                              ip->i_size,
1291                                              XFS_DATA_FORK,
1292                                              0);
1293                 /*
1294                  * If we get an error at this point we
1295                  * simply don't bother truncating the file.
1296                  */
1297                 if (error) {
1298                         xfs_trans_cancel(tp,
1299                                          (XFS_TRANS_RELEASE_LOG_RES |
1300                                           XFS_TRANS_ABORT));
1301                 } else {
1302                         error = xfs_trans_commit(tp,
1303                                                 XFS_TRANS_RELEASE_LOG_RES);
1304                 }
1305                 xfs_iunlock(ip, (use_iolock ? (XFS_IOLOCK_EXCL|XFS_ILOCK_EXCL)
1306                                             : XFS_ILOCK_EXCL));
1307         }
1308         return error;
1309 }
1310
1311 /*
1312  * Free a symlink that has blocks associated with it.
1313  */
1314 STATIC int
1315 xfs_inactive_symlink_rmt(
1316         xfs_inode_t     *ip,
1317         xfs_trans_t     **tpp)
1318 {
1319         xfs_buf_t       *bp;
1320         int             committed;
1321         int             done;
1322         int             error;
1323         xfs_fsblock_t   first_block;
1324         xfs_bmap_free_t free_list;
1325         int             i;
1326         xfs_mount_t     *mp;
1327         xfs_bmbt_irec_t mval[SYMLINK_MAPS];
1328         int             nmaps;
1329         xfs_trans_t     *ntp;
1330         int             size;
1331         xfs_trans_t     *tp;
1332
1333         tp = *tpp;
1334         mp = ip->i_mount;
1335         ASSERT(ip->i_d.di_size > XFS_IFORK_DSIZE(ip));
1336         /*
1337          * We're freeing a symlink that has some
1338          * blocks allocated to it.  Free the
1339          * blocks here.  We know that we've got
1340          * either 1 or 2 extents and that we can
1341          * free them all in one bunmapi call.
1342          */
1343         ASSERT(ip->i_d.di_nextents > 0 && ip->i_d.di_nextents <= 2);
1344         if ((error = xfs_trans_reserve(tp, 0, XFS_ITRUNCATE_LOG_RES(mp), 0,
1345                         XFS_TRANS_PERM_LOG_RES, XFS_ITRUNCATE_LOG_COUNT))) {
1346                 ASSERT(XFS_FORCED_SHUTDOWN(mp));
1347                 xfs_trans_cancel(tp, 0);
1348                 *tpp = NULL;
1349                 return error;
1350         }
1351         /*
1352          * Lock the inode, fix the size, and join it to the transaction.
1353          * Hold it so in the normal path, we still have it locked for
1354          * the second transaction.  In the error paths we need it
1355          * held so the cancel won't rele it, see below.
1356          */
1357         xfs_ilock(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
1358         size = (int)ip->i_d.di_size;
1359         ip->i_d.di_size = 0;
1360         xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL);
1361         xfs_trans_ihold(tp, ip);
1362         xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
1363         /*
1364          * Find the block(s) so we can inval and unmap them.
1365          */
1366         done = 0;
1367         XFS_BMAP_INIT(&free_list, &first_block);
1368         nmaps = ARRAY_SIZE(mval);
1369         if ((error = xfs_bmapi(tp, ip, 0, XFS_B_TO_FSB(mp, size),
1370                         XFS_BMAPI_METADATA, &first_block, 0, mval, &nmaps,
1371                         &free_list, NULL)))
1372                 goto error0;
1373         /*
1374          * Invalidate the block(s).
1375          */
1376         for (i = 0; i < nmaps; i++) {
1377                 bp = xfs_trans_get_buf(tp, mp->m_ddev_targp,
1378                         XFS_FSB_TO_DADDR(mp, mval[i].br_startblock),
1379                         XFS_FSB_TO_BB(mp, mval[i].br_blockcount), 0);
1380                 xfs_trans_binval(tp, bp);
1381         }
1382         /*
1383          * Unmap the dead block(s) to the free_list.
1384          */
1385         if ((error = xfs_bunmapi(tp, ip, 0, size, XFS_BMAPI_METADATA, nmaps,
1386                         &first_block, &free_list, NULL, &done)))
1387                 goto error1;
1388         ASSERT(done);
1389         /*
1390          * Commit the first transaction.  This logs the EFI and the inode.
1391          */
1392         if ((error = xfs_bmap_finish(&tp, &free_list, &committed)))
1393                 goto error1;
1394         /*
1395          * The transaction must have been committed, since there were
1396          * actually extents freed by xfs_bunmapi.  See xfs_bmap_finish.
1397          * The new tp has the extent freeing and EFDs.
1398          */
1399         ASSERT(committed);
1400         /*
1401          * The first xact was committed, so add the inode to the new one.
1402          * Mark it dirty so it will be logged and moved forward in the log as
1403          * part of every commit.
1404          */
1405         xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL);
1406         xfs_trans_ihold(tp, ip);
1407         xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
1408         /*
1409          * Get a new, empty transaction to return to our caller.
1410          */
1411         ntp = xfs_trans_dup(tp);
1412         /*
1413          * Commit the transaction containing extent freeing and EFDs.
1414          * If we get an error on the commit here or on the reserve below,
1415          * we need to unlock the inode since the new transaction doesn't
1416          * have the inode attached.
1417          */
1418         error = xfs_trans_commit(tp, 0);
1419         tp = ntp;
1420         if (error) {
1421                 ASSERT(XFS_FORCED_SHUTDOWN(mp));
1422                 goto error0;
1423         }
1424         /*
1425          * Remove the memory for extent descriptions (just bookkeeping).
1426          */
1427         if (ip->i_df.if_bytes)
1428                 xfs_idata_realloc(ip, -ip->i_df.if_bytes, XFS_DATA_FORK);
1429         ASSERT(ip->i_df.if_bytes == 0);
1430         /*
1431          * Put an itruncate log reservation in the new transaction
1432          * for our caller.
1433          */
1434         if ((error = xfs_trans_reserve(tp, 0, XFS_ITRUNCATE_LOG_RES(mp), 0,
1435                         XFS_TRANS_PERM_LOG_RES, XFS_ITRUNCATE_LOG_COUNT))) {
1436                 ASSERT(XFS_FORCED_SHUTDOWN(mp));
1437                 goto error0;
1438         }
1439         /*
1440          * Return with the inode locked but not joined to the transaction.
1441          */
1442         *tpp = tp;
1443         return 0;
1444
1445  error1:
1446         xfs_bmap_cancel(&free_list);
1447  error0:
1448         /*
1449          * Have to come here with the inode locked and either
1450          * (held and in the transaction) or (not in the transaction).
1451          * If the inode isn't held then cancel would iput it, but
1452          * that's wrong since this is inactive and the vnode ref
1453          * count is 0 already.
1454          * Cancel won't do anything to the inode if held, but it still
1455          * needs to be locked until the cancel is done, if it was
1456          * joined to the transaction.
1457          */
1458         xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT);
1459         xfs_iunlock(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
1460         *tpp = NULL;
1461         return error;
1462
1463 }
1464
1465 STATIC int
1466 xfs_inactive_symlink_local(
1467         xfs_inode_t     *ip,
1468         xfs_trans_t     **tpp)
1469 {
1470         int             error;
1471
1472         ASSERT(ip->i_d.di_size <= XFS_IFORK_DSIZE(ip));
1473         /*
1474          * We're freeing a symlink which fit into
1475          * the inode.  Just free the memory used
1476          * to hold the old symlink.
1477          */
1478         error = xfs_trans_reserve(*tpp, 0,
1479                                   XFS_ITRUNCATE_LOG_RES(ip->i_mount),
1480                                   0, XFS_TRANS_PERM_LOG_RES,
1481                                   XFS_ITRUNCATE_LOG_COUNT);
1482
1483         if (error) {
1484                 xfs_trans_cancel(*tpp, 0);
1485                 *tpp = NULL;
1486                 return error;
1487         }
1488         xfs_ilock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL);
1489
1490         /*
1491          * Zero length symlinks _can_ exist.
1492          */
1493         if (ip->i_df.if_bytes > 0) {
1494                 xfs_idata_realloc(ip,
1495                                   -(ip->i_df.if_bytes),
1496                                   XFS_DATA_FORK);
1497                 ASSERT(ip->i_df.if_bytes == 0);
1498         }
1499         return 0;
1500 }
1501
1502 STATIC int
1503 xfs_inactive_attrs(
1504         xfs_inode_t     *ip,
1505         xfs_trans_t     **tpp)
1506 {
1507         xfs_trans_t     *tp;
1508         int             error;
1509         xfs_mount_t     *mp;
1510
1511         ASSERT(ismrlocked(&ip->i_iolock, MR_UPDATE));
1512         tp = *tpp;
1513         mp = ip->i_mount;
1514         ASSERT(ip->i_d.di_forkoff != 0);
1515         xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES);
1516         xfs_iunlock(ip, XFS_ILOCK_EXCL);
1517
1518         error = xfs_attr_inactive(ip);
1519         if (error) {
1520                 *tpp = NULL;
1521                 xfs_iunlock(ip, XFS_IOLOCK_EXCL);
1522                 return error; /* goto out */
1523         }
1524
1525         tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE);
1526         error = xfs_trans_reserve(tp, 0,
1527                                   XFS_IFREE_LOG_RES(mp),
1528                                   0, XFS_TRANS_PERM_LOG_RES,
1529                                   XFS_INACTIVE_LOG_COUNT);
1530         if (error) {
1531                 ASSERT(XFS_FORCED_SHUTDOWN(mp));
1532                 xfs_trans_cancel(tp, 0);
1533                 *tpp = NULL;
1534                 xfs_iunlock(ip, XFS_IOLOCK_EXCL);
1535                 return error;
1536         }
1537
1538         xfs_ilock(ip, XFS_ILOCK_EXCL);
1539         xfs_trans_ijoin(tp, ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
1540         xfs_trans_ihold(tp, ip);
1541         xfs_idestroy_fork(ip, XFS_ATTR_FORK);
1542
1543         ASSERT(ip->i_d.di_anextents == 0);
1544
1545         *tpp = tp;
1546         return 0;
1547 }
1548
1549 STATIC int
1550 xfs_release(
1551         bhv_desc_t      *bdp)
1552 {
1553         xfs_inode_t     *ip;
1554         bhv_vnode_t     *vp;
1555         xfs_mount_t     *mp;
1556         int             error;
1557
1558         vp = BHV_TO_VNODE(bdp);
1559         ip = XFS_BHVTOI(bdp);
1560         mp = ip->i_mount;
1561
1562         if (!VN_ISREG(vp) || (ip->i_d.di_mode == 0))
1563                 return 0;
1564
1565         /* If this is a read-only mount, don't do this (would generate I/O) */
1566         if (vp->v_vfsp->vfs_flag & VFS_RDONLY)
1567                 return 0;
1568
1569 #ifdef HAVE_REFCACHE
1570         /* If we are in the NFS reference cache then don't do this now */
1571         if (ip->i_refcache)
1572                 return 0;
1573 #endif
1574
1575         if (ip->i_d.di_nlink != 0) {
1576                 if ((((ip->i_d.di_mode & S_IFMT) == S_IFREG) &&
1577                      ((ip->i_size > 0) || (VN_CACHED(vp) > 0 ||
1578                        ip->i_delayed_blks > 0)) &&
1579                      (ip->i_df.if_flags & XFS_IFEXTENTS))  &&
1580                     (!(ip->i_d.di_flags &
1581                                 (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)))) {
1582                         error = xfs_free_eofblocks(mp, ip, XFS_FREE_EOF_LOCK);
1583                         if (error)
1584                                 return error;
1585                         /* Update linux inode block count after free above */
1586                         vn_to_inode(vp)->i_blocks = XFS_FSB_TO_BB(mp,
1587                                 ip->i_d.di_nblocks + ip->i_delayed_blks);
1588                 }
1589         }
1590
1591         return 0;
1592 }
1593
1594 /*
1595  * xfs_inactive
1596  *
1597  * This is called when the vnode reference count for the vnode
1598  * goes to zero.  If the file has been unlinked, then it must
1599  * now be truncated.  Also, we clear all of the read-ahead state
1600  * kept for the inode here since the file is now closed.
1601  */
1602 STATIC int
1603 xfs_inactive(
1604         bhv_desc_t      *bdp,
1605         cred_t          *credp)
1606 {
1607         xfs_inode_t     *ip;
1608         bhv_vnode_t     *vp;
1609         xfs_bmap_free_t free_list;
1610         xfs_fsblock_t   first_block;
1611         int             committed;
1612         xfs_trans_t     *tp;
1613         xfs_mount_t     *mp;
1614         int             error;
1615         int             truncate;
1616
1617         vp = BHV_TO_VNODE(bdp);
1618         vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address);
1619
1620         ip = XFS_BHVTOI(bdp);
1621
1622         /*
1623          * If the inode is already free, then there can be nothing
1624          * to clean up here.
1625          */
1626         if (ip->i_d.di_mode == 0 || VN_BAD(vp)) {
1627                 ASSERT(ip->i_df.if_real_bytes == 0);
1628                 ASSERT(ip->i_df.if_broot_bytes == 0);
1629                 return VN_INACTIVE_CACHE;
1630         }
1631
1632         /*
1633          * Only do a truncate if it's a regular file with
1634          * some actual space in it.  It's OK to look at the
1635          * inode's fields without the lock because we're the
1636          * only one with a reference to the inode.
1637          */
1638         truncate = ((ip->i_d.di_nlink == 0) &&
1639             ((ip->i_d.di_size != 0) || (ip->i_size != 0) ||
1640              (ip->i_d.di_nextents > 0) || (ip->i_delayed_blks > 0)) &&
1641             ((ip->i_d.di_mode & S_IFMT) == S_IFREG));
1642
1643         mp = ip->i_mount;
1644
1645         if (ip->i_d.di_nlink == 0 &&
1646             DM_EVENT_ENABLED(vp->v_vfsp, ip, DM_EVENT_DESTROY)) {
1647                 (void) XFS_SEND_DESTROY(mp, vp, DM_RIGHT_NULL);
1648         }
1649
1650         error = 0;
1651
1652         /* If this is a read-only mount, don't do this (would generate I/O) */
1653         if (vp->v_vfsp->vfs_flag & VFS_RDONLY)
1654                 goto out;
1655
1656         if (ip->i_d.di_nlink != 0) {
1657                 if ((((ip->i_d.di_mode & S_IFMT) == S_IFREG) &&
1658                      ((ip->i_size > 0) || (VN_CACHED(vp) > 0 ||
1659                        ip->i_delayed_blks > 0)) &&
1660                       (ip->i_df.if_flags & XFS_IFEXTENTS) &&
1661                      (!(ip->i_d.di_flags &
1662                                 (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)) ||
1663                       (ip->i_delayed_blks != 0)))) {
1664                         error = xfs_free_eofblocks(mp, ip, XFS_FREE_EOF_LOCK);
1665                         if (error)
1666                                 return VN_INACTIVE_CACHE;
1667                         /* Update linux inode block count after free above */
1668                         vn_to_inode(vp)->i_blocks = XFS_FSB_TO_BB(mp,
1669                                 ip->i_d.di_nblocks + ip->i_delayed_blks);
1670                 }
1671                 goto out;
1672         }
1673
1674         ASSERT(ip->i_d.di_nlink == 0);
1675
1676         if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
1677                 return VN_INACTIVE_CACHE;
1678
1679         tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE);
1680         if (truncate) {
1681                 /*
1682                  * Do the xfs_itruncate_start() call before
1683                  * reserving any log space because itruncate_start
1684                  * will call into the buffer cache and we can't
1685                  * do that within a transaction.
1686                  */
1687                 xfs_ilock(ip, XFS_IOLOCK_EXCL);
1688
1689                 error = xfs_itruncate_start(ip, XFS_ITRUNC_DEFINITE, 0);
1690                 if (error) {
1691                         xfs_iunlock(ip, XFS_IOLOCK_EXCL);
1692                         return VN_INACTIVE_CACHE;
1693                 }
1694
1695                 error = xfs_trans_reserve(tp, 0,
1696                                           XFS_ITRUNCATE_LOG_RES(mp),
1697                                           0, XFS_TRANS_PERM_LOG_RES,
1698                                           XFS_ITRUNCATE_LOG_COUNT);
1699                 if (error) {
1700                         /* Don't call itruncate_cleanup */
1701                         ASSERT(XFS_FORCED_SHUTDOWN(mp));
1702                         xfs_trans_cancel(tp, 0);
1703                         xfs_iunlock(ip, XFS_IOLOCK_EXCL);
1704                         return VN_INACTIVE_CACHE;
1705                 }
1706
1707                 xfs_ilock(ip, XFS_ILOCK_EXCL);
1708                 xfs_trans_ijoin(tp, ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
1709                 xfs_trans_ihold(tp, ip);
1710
1711                 /*
1712                  * normally, we have to run xfs_itruncate_finish sync.
1713                  * But if filesystem is wsync and we're in the inactive
1714                  * path, then we know that nlink == 0, and that the
1715                  * xaction that made nlink == 0 is permanently committed
1716                  * since xfs_remove runs as a synchronous transaction.
1717                  */
1718                 error = xfs_itruncate_finish(&tp, ip, 0, XFS_DATA_FORK,
1719                                 (!(mp->m_flags & XFS_MOUNT_WSYNC) ? 1 : 0));
1720
1721                 if (error) {
1722                         xfs_trans_cancel(tp,
1723                                 XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT);
1724                         xfs_iunlock(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
1725                         return VN_INACTIVE_CACHE;
1726                 }
1727         } else if ((ip->i_d.di_mode & S_IFMT) == S_IFLNK) {
1728
1729                 /*
1730                  * If we get an error while cleaning up a
1731                  * symlink we bail out.
1732                  */
1733                 error = (ip->i_d.di_size > XFS_IFORK_DSIZE(ip)) ?
1734                         xfs_inactive_symlink_rmt(ip, &tp) :
1735                         xfs_inactive_symlink_local(ip, &tp);
1736
1737                 if (error) {
1738                         ASSERT(tp == NULL);
1739                         return VN_INACTIVE_CACHE;
1740                 }
1741
1742                 xfs_trans_ijoin(tp, ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
1743                 xfs_trans_ihold(tp, ip);
1744         } else {
1745                 error = xfs_trans_reserve(tp, 0,
1746                                           XFS_IFREE_LOG_RES(mp),
1747                                           0, XFS_TRANS_PERM_LOG_RES,
1748                                           XFS_INACTIVE_LOG_COUNT);
1749                 if (error) {
1750                         ASSERT(XFS_FORCED_SHUTDOWN(mp));
1751                         xfs_trans_cancel(tp, 0);
1752                         return VN_INACTIVE_CACHE;
1753                 }
1754
1755                 xfs_ilock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL);
1756                 xfs_trans_ijoin(tp, ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
1757                 xfs_trans_ihold(tp, ip);
1758         }
1759
1760         /*
1761          * If there are attributes associated with the file
1762          * then blow them away now.  The code calls a routine
1763          * that recursively deconstructs the attribute fork.
1764          * We need to just commit the current transaction
1765          * because we can't use it for xfs_attr_inactive().
1766          */
1767         if (ip->i_d.di_anextents > 0) {
1768                 error = xfs_inactive_attrs(ip, &tp);
1769                 /*
1770                  * If we got an error, the transaction is already
1771                  * cancelled, and the inode is unlocked. Just get out.
1772                  */
1773                  if (error)
1774                          return VN_INACTIVE_CACHE;
1775         } else if (ip->i_afp) {
1776                 xfs_idestroy_fork(ip, XFS_ATTR_FORK);
1777         }
1778
1779         /*
1780          * Free the inode.
1781          */
1782         XFS_BMAP_INIT(&free_list, &first_block);
1783         error = xfs_ifree(tp, ip, &free_list);
1784         if (error) {
1785                 /*
1786                  * If we fail to free the inode, shut down.  The cancel
1787                  * might do that, we need to make sure.  Otherwise the
1788                  * inode might be lost for a long time or forever.
1789                  */
1790                 if (!XFS_FORCED_SHUTDOWN(mp)) {
1791                         cmn_err(CE_NOTE,
1792                 "xfs_inactive:  xfs_ifree() returned an error = %d on %s",
1793                                 error, mp->m_fsname);
1794                         xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR);
1795                 }
1796                 xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT);
1797         } else {
1798                 /*
1799                  * Credit the quota account(s). The inode is gone.
1800                  */
1801                 XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, XFS_TRANS_DQ_ICOUNT, -1);
1802
1803                 /*
1804                  * Just ignore errors at this point.  There is
1805                  * nothing we can do except to try to keep going.
1806                  */
1807                 (void) xfs_bmap_finish(&tp,  &free_list, &committed);
1808                 (void) xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES);
1809         }
1810         /*
1811          * Release the dquots held by inode, if any.
1812          */
1813         XFS_QM_DQDETACH(mp, ip);
1814
1815         xfs_iunlock(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
1816
1817  out:
1818         return VN_INACTIVE_CACHE;
1819 }
1820
1821
1822 /*
1823  * xfs_lookup
1824  */
1825 STATIC int
1826 xfs_lookup(
1827         bhv_desc_t              *dir_bdp,
1828         bhv_vname_t             *dentry,
1829         bhv_vnode_t             **vpp,
1830         int                     flags,
1831         bhv_vnode_t             *rdir,
1832         cred_t                  *credp)
1833 {
1834         xfs_inode_t             *dp, *ip;
1835         xfs_ino_t               e_inum;
1836         int                     error;
1837         uint                    lock_mode;
1838         bhv_vnode_t             *dir_vp;
1839
1840         dir_vp = BHV_TO_VNODE(dir_bdp);
1841         vn_trace_entry(dir_vp, __FUNCTION__, (inst_t *)__return_address);
1842
1843         dp = XFS_BHVTOI(dir_bdp);
1844
1845         if (XFS_FORCED_SHUTDOWN(dp->i_mount))
1846                 return XFS_ERROR(EIO);
1847
1848         lock_mode = xfs_ilock_map_shared(dp);
1849         error = xfs_dir_lookup_int(dir_bdp, lock_mode, dentry, &e_inum, &ip);
1850         if (!error) {
1851                 *vpp = XFS_ITOV(ip);
1852                 ITRACE(ip);
1853         }
1854         xfs_iunlock_map_shared(dp, lock_mode);
1855         return error;
1856 }
1857
1858
1859 /*
1860  * xfs_create (create a new file).
1861  */
1862 STATIC int
1863 xfs_create(
1864         bhv_desc_t              *dir_bdp,
1865         bhv_vname_t             *dentry,
1866         bhv_vattr_t             *vap,
1867         bhv_vnode_t             **vpp,
1868         cred_t                  *credp)
1869 {
1870         char                    *name = VNAME(dentry);
1871         bhv_vnode_t             *dir_vp;
1872         xfs_inode_t             *dp, *ip;
1873         bhv_vnode_t             *vp = NULL;
1874         xfs_trans_t             *tp;
1875         xfs_mount_t             *mp;
1876         xfs_dev_t               rdev;
1877         int                     error;
1878         xfs_bmap_free_t         free_list;
1879         xfs_fsblock_t           first_block;
1880         boolean_t               dp_joined_to_trans;
1881         int                     dm_event_sent = 0;
1882         uint                    cancel_flags;
1883         int                     committed;
1884         xfs_prid_t              prid;
1885         struct xfs_dquot        *udqp, *gdqp;
1886         uint                    resblks;
1887         int                     dm_di_mode;
1888         int                     namelen;
1889
1890         ASSERT(!*vpp);
1891         dir_vp = BHV_TO_VNODE(dir_bdp);
1892         vn_trace_entry(dir_vp, __FUNCTION__, (inst_t *)__return_address);
1893
1894         dp = XFS_BHVTOI(dir_bdp);
1895         mp = dp->i_mount;
1896
1897         dm_di_mode = vap->va_mode;
1898         namelen = VNAMELEN(dentry);
1899
1900         if (DM_EVENT_ENABLED(dir_vp->v_vfsp, dp, DM_EVENT_CREATE)) {
1901                 error = XFS_SEND_NAMESP(mp, DM_EVENT_CREATE,
1902                                 dir_vp, DM_RIGHT_NULL, NULL,
1903                                 DM_RIGHT_NULL, name, NULL,
1904                                 dm_di_mode, 0, 0);
1905
1906                 if (error)
1907                         return error;
1908                 dm_event_sent = 1;
1909         }
1910
1911         if (XFS_FORCED_SHUTDOWN(mp))
1912                 return XFS_ERROR(EIO);
1913
1914         /* Return through std_return after this point. */
1915
1916         udqp = gdqp = NULL;
1917         if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT)
1918                 prid = dp->i_d.di_projid;
1919         else if (vap->va_mask & XFS_AT_PROJID)
1920                 prid = (xfs_prid_t)vap->va_projid;
1921         else
1922                 prid = (xfs_prid_t)dfltprid;
1923
1924         /*
1925          * Make sure that we have allocated dquot(s) on disk.
1926          */
1927         error = XFS_QM_DQVOPALLOC(mp, dp,
1928                         current_fsuid(credp), current_fsgid(credp), prid,
1929                         XFS_QMOPT_QUOTALL|XFS_QMOPT_INHERIT, &udqp, &gdqp);
1930         if (error)
1931                 goto std_return;
1932
1933         ip = NULL;
1934         dp_joined_to_trans = B_FALSE;
1935
1936         tp = xfs_trans_alloc(mp, XFS_TRANS_CREATE);
1937         cancel_flags = XFS_TRANS_RELEASE_LOG_RES;
1938         resblks = XFS_CREATE_SPACE_RES(mp, namelen);
1939         /*
1940          * Initially assume that the file does not exist and
1941          * reserve the resources for that case.  If that is not
1942          * the case we'll drop the one we have and get a more
1943          * appropriate transaction later.
1944          */
1945         error = xfs_trans_reserve(tp, resblks, XFS_CREATE_LOG_RES(mp), 0,
1946                         XFS_TRANS_PERM_LOG_RES, XFS_CREATE_LOG_COUNT);
1947         if (error == ENOSPC) {
1948                 resblks = 0;
1949                 error = xfs_trans_reserve(tp, 0, XFS_CREATE_LOG_RES(mp), 0,
1950                                 XFS_TRANS_PERM_LOG_RES, XFS_CREATE_LOG_COUNT);
1951         }
1952         if (error) {
1953                 cancel_flags = 0;
1954                 dp = NULL;
1955                 goto error_return;
1956         }
1957
1958         xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT);
1959
1960         XFS_BMAP_INIT(&free_list, &first_block);
1961
1962         ASSERT(ip == NULL);
1963
1964         /*
1965          * Reserve disk quota and the inode.
1966          */
1967         error = XFS_TRANS_RESERVE_QUOTA(mp, tp, udqp, gdqp, resblks, 1, 0);
1968         if (error)
1969                 goto error_return;
1970
1971         if (resblks == 0 && (error = xfs_dir_canenter(tp, dp, name, namelen)))
1972                 goto error_return;
1973         rdev = (vap->va_mask & XFS_AT_RDEV) ? vap->va_rdev : 0;
1974         error = xfs_dir_ialloc(&tp, dp, vap->va_mode, 1,
1975                         rdev, credp, prid, resblks > 0,
1976                         &ip, &committed);
1977         if (error) {
1978                 if (error == ENOSPC)
1979                         goto error_return;
1980                 goto abort_return;
1981         }
1982         ITRACE(ip);
1983
1984         /*
1985          * At this point, we've gotten a newly allocated inode.
1986          * It is locked (and joined to the transaction).
1987          */
1988
1989         ASSERT(ismrlocked (&ip->i_lock, MR_UPDATE));
1990
1991         /*
1992          * Now we join the directory inode to the transaction.
1993          * We do not do it earlier because xfs_dir_ialloc
1994          * might commit the previous transaction (and release
1995          * all the locks).
1996          */
1997
1998         VN_HOLD(dir_vp);
1999         xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL);
2000         dp_joined_to_trans = B_TRUE;
2001
2002         error = xfs_dir_createname(tp, dp, name, namelen, ip->i_ino,
2003                                         &first_block, &free_list, resblks ?
2004                                         resblks - XFS_IALLOC_SPACE_RES(mp) : 0);
2005         if (error) {
2006                 ASSERT(error != ENOSPC);
2007                 goto abort_return;
2008         }
2009         xfs_ichgtime(dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
2010         xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE);
2011
2012         /*
2013          * If this is a synchronous mount, make sure that the
2014          * create transaction goes to disk before returning to
2015          * the user.
2016          */
2017         if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) {
2018                 xfs_trans_set_sync(tp);
2019         }
2020
2021         dp->i_gen++;
2022
2023         /*
2024          * Attach the dquot(s) to the inodes and modify them incore.
2025          * These ids of the inode couldn't have changed since the new
2026          * inode has been locked ever since it was created.
2027          */
2028         XFS_QM_DQVOPCREATE(mp, tp, ip, udqp, gdqp);
2029
2030         /*
2031          * xfs_trans_commit normally decrements the vnode ref count
2032          * when it unlocks the inode. Since we want to return the
2033          * vnode to the caller, we bump the vnode ref count now.
2034          */
2035         IHOLD(ip);
2036         vp = XFS_ITOV(ip);
2037
2038         error = xfs_bmap_finish(&tp, &free_list, &committed);
2039         if (error) {
2040                 xfs_bmap_cancel(&free_list);
2041                 goto abort_rele;
2042         }
2043
2044         error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES);
2045         if (error) {
2046                 IRELE(ip);
2047                 tp = NULL;
2048                 goto error_return;
2049         }
2050
2051         XFS_QM_DQRELE(mp, udqp);
2052         XFS_QM_DQRELE(mp, gdqp);
2053
2054         /*
2055          * Propagate the fact that the vnode changed after the
2056          * xfs_inode locks have been released.
2057          */
2058         bhv_vop_vnode_change(vp, VCHANGE_FLAGS_TRUNCATED, 3);
2059
2060         *vpp = vp;
2061
2062         /* Fallthrough to std_return with error = 0  */
2063
2064 std_return:
2065         if ( (*vpp || (error != 0 && dm_event_sent != 0)) &&
2066                         DM_EVENT_ENABLED(dir_vp->v_vfsp, XFS_BHVTOI(dir_bdp),
2067                                                         DM_EVENT_POSTCREATE)) {
2068                 (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTCREATE,
2069                         dir_vp, DM_RIGHT_NULL,
2070                         *vpp ? vp:NULL,
2071                         DM_RIGHT_NULL, name, NULL,
2072                         dm_di_mode, error, 0);
2073         }
2074         return error;
2075
2076  abort_return:
2077         cancel_flags |= XFS_TRANS_ABORT;
2078         /* FALLTHROUGH */
2079
2080  error_return:
2081         if (tp != NULL)
2082                 xfs_trans_cancel(tp, cancel_flags);
2083
2084         if (!dp_joined_to_trans && (dp != NULL))
2085                 xfs_iunlock(dp, XFS_ILOCK_EXCL);
2086         XFS_QM_DQRELE(mp, udqp);
2087         XFS_QM_DQRELE(mp, gdqp);
2088
2089         goto std_return;
2090
2091  abort_rele:
2092         /*
2093          * Wait until after the current transaction is aborted to
2094          * release the inode.  This prevents recursive transactions
2095          * and deadlocks from xfs_inactive.
2096          */
2097         cancel_flags |= XFS_TRANS_ABORT;
2098         xfs_trans_cancel(tp, cancel_flags);
2099         IRELE(ip);
2100
2101         XFS_QM_DQRELE(mp, udqp);
2102         XFS_QM_DQRELE(mp, gdqp);
2103
2104         goto std_return;
2105 }
2106
2107 #ifdef DEBUG
2108 /*
2109  * Some counters to see if (and how often) we are hitting some deadlock
2110  * prevention code paths.
2111  */
2112
2113 int xfs_rm_locks;
2114 int xfs_rm_lock_delays;
2115 int xfs_rm_attempts;
2116 #endif
2117
2118 /*
2119  * The following routine will lock the inodes associated with the
2120  * directory and the named entry in the directory. The locks are
2121  * acquired in increasing inode number.
2122  *
2123  * If the entry is "..", then only the directory is locked. The
2124  * vnode ref count will still include that from the .. entry in
2125  * this case.
2126  *
2127  * There is a deadlock we need to worry about. If the locked directory is
2128  * in the AIL, it might be blocking up the log. The next inode we lock
2129  * could be already locked by another thread waiting for log space (e.g
2130  * a permanent log reservation with a long running transaction (see
2131  * xfs_itruncate_finish)). To solve this, we must check if the directory
2132  * is in the ail and use lock_nowait. If we can't lock, we need to
2133  * drop the inode lock on the directory and try again. xfs_iunlock will
2134  * potentially push the tail if we were holding up the log.
2135  */
2136 STATIC int
2137 xfs_lock_dir_and_entry(
2138         xfs_inode_t     *dp,
2139         xfs_inode_t     *ip)    /* inode of entry 'name' */
2140 {
2141         int             attempts;
2142         xfs_ino_t       e_inum;
2143         xfs_inode_t     *ips[2];
2144         xfs_log_item_t  *lp;
2145
2146 #ifdef DEBUG
2147         xfs_rm_locks++;
2148 #endif
2149         attempts = 0;
2150
2151 again:
2152         xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT);
2153
2154         e_inum = ip->i_ino;
2155
2156         ITRACE(ip);
2157
2158         /*
2159          * We want to lock in increasing inum. Since we've already
2160          * acquired the lock on the directory, we may need to release
2161          * if if the inum of the entry turns out to be less.
2162          */
2163         if (e_inum > dp->i_ino) {
2164                 /*
2165                  * We are already in the right order, so just
2166                  * lock on the inode of the entry.
2167                  * We need to use nowait if dp is in the AIL.
2168                  */
2169
2170                 lp = (xfs_log_item_t *)dp->i_itemp;
2171                 if (lp && (lp->li_flags & XFS_LI_IN_AIL)) {
2172                         if (!xfs_ilock_nowait(ip, XFS_ILOCK_EXCL)) {
2173                                 attempts++;
2174 #ifdef DEBUG
2175                                 xfs_rm_attempts++;
2176 #endif
2177
2178                                 /*
2179                                  * Unlock dp and try again.
2180                                  * xfs_iunlock will try to push the tail
2181                                  * if the inode is in the AIL.
2182                                  */
2183
2184                                 xfs_iunlock(dp, XFS_ILOCK_EXCL);
2185
2186                                 if ((attempts % 5) == 0) {
2187                                         delay(1); /* Don't just spin the CPU */
2188 #ifdef DEBUG
2189                                         xfs_rm_lock_delays++;
2190 #endif
2191                                 }
2192                                 goto again;
2193                         }
2194                 } else {
2195                         xfs_ilock(ip, XFS_ILOCK_EXCL);
2196                 }
2197         } else if (e_inum < dp->i_ino) {
2198                 xfs_iunlock(dp, XFS_ILOCK_EXCL);
2199
2200                 ips[0] = ip;
2201                 ips[1] = dp;
2202                 xfs_lock_inodes(ips, 2, 0, XFS_ILOCK_EXCL);
2203         }
2204         /* else  e_inum == dp->i_ino */
2205         /*     This can happen if we're asked to lock /x/..
2206          *     the entry is "..", which is also the parent directory.
2207          */
2208
2209         return 0;
2210 }
2211
2212 #ifdef DEBUG
2213 int xfs_locked_n;
2214 int xfs_small_retries;
2215 int xfs_middle_retries;
2216 int xfs_lots_retries;
2217 int xfs_lock_delays;
2218 #endif
2219
2220 /*
2221  * Bump the subclass so xfs_lock_inodes() acquires each lock with
2222  * a different value
2223  */
2224 static inline int
2225 xfs_lock_inumorder(int lock_mode, int subclass)
2226 {
2227         if (lock_mode & (XFS_IOLOCK_SHARED|XFS_IOLOCK_EXCL))
2228                 lock_mode |= (subclass + XFS_IOLOCK_INUMORDER) << XFS_IOLOCK_SHIFT;
2229         if (lock_mode & (XFS_ILOCK_SHARED|XFS_ILOCK_EXCL))
2230                 lock_mode |= (subclass + XFS_ILOCK_INUMORDER) << XFS_ILOCK_SHIFT;
2231
2232         return lock_mode;
2233 }
2234
2235 /*
2236  * The following routine will lock n inodes in exclusive mode.
2237  * We assume the caller calls us with the inodes in i_ino order.
2238  *
2239  * We need to detect deadlock where an inode that we lock
2240  * is in the AIL and we start waiting for another inode that is locked
2241  * by a thread in a long running transaction (such as truncate). This can
2242  * result in deadlock since the long running trans might need to wait
2243  * for the inode we just locked in order to push the tail and free space
2244  * in the log.
2245  */
2246 void
2247 xfs_lock_inodes(
2248         xfs_inode_t     **ips,
2249         int             inodes,
2250         int             first_locked,
2251         uint            lock_mode)
2252 {
2253         int             attempts = 0, i, j, try_lock;
2254         xfs_log_item_t  *lp;
2255
2256         ASSERT(ips && (inodes >= 2)); /* we need at least two */
2257
2258         if (first_locked) {
2259                 try_lock = 1;
2260                 i = 1;
2261         } else {
2262                 try_lock = 0;
2263                 i = 0;
2264         }
2265
2266 again:
2267         for (; i < inodes; i++) {
2268                 ASSERT(ips[i]);
2269
2270                 if (i && (ips[i] == ips[i-1]))  /* Already locked */
2271                         continue;
2272
2273                 /*
2274                  * If try_lock is not set yet, make sure all locked inodes
2275                  * are not in the AIL.
2276                  * If any are, set try_lock to be used later.
2277                  */
2278
2279                 if (!try_lock) {
2280                         for (j = (i - 1); j >= 0 && !try_lock; j--) {
2281                                 lp = (xfs_log_item_t *)ips[j]->i_itemp;
2282                                 if (lp && (lp->li_flags & XFS_LI_IN_AIL)) {
2283                                         try_lock++;
2284                                 }
2285                         }
2286                 }
2287
2288                 /*
2289                  * If any of the previous locks we have locked is in the AIL,
2290                  * we must TRY to get the second and subsequent locks. If
2291                  * we can't get any, we must release all we have
2292                  * and try again.
2293                  */
2294
2295                 if (try_lock) {
2296                         /* try_lock must be 0 if i is 0. */
2297                         /*
2298                          * try_lock means we have an inode locked
2299                          * that is in the AIL.
2300                          */
2301                         ASSERT(i != 0);
2302                         if (!xfs_ilock_nowait(ips[i], xfs_lock_inumorder(lock_mode, i))) {
2303                                 attempts++;
2304
2305                                 /*
2306                                  * Unlock all previous guys and try again.
2307                                  * xfs_iunlock will try to push the tail
2308                                  * if the inode is in the AIL.
2309                                  */
2310
2311                                 for(j = i - 1; j >= 0; j--) {
2312
2313                                         /*
2314                                          * Check to see if we've already
2315                                          * unlocked this one.
2316                                          * Not the first one going back,
2317                                          * and the inode ptr is the same.
2318                                          */
2319                                         if ((j != (i - 1)) && ips[j] ==
2320                                                                 ips[j+1])
2321                                                 continue;
2322
2323                                         xfs_iunlock(ips[j], lock_mode);
2324                                 }
2325
2326                                 if ((attempts % 5) == 0) {
2327                                         delay(1); /* Don't just spin the CPU */
2328 #ifdef DEBUG
2329                                         xfs_lock_delays++;
2330 #endif
2331                                 }
2332                                 i = 0;
2333                                 try_lock = 0;
2334                                 goto again;
2335                         }
2336                 } else {
2337                         xfs_ilock(ips[i], xfs_lock_inumorder(lock_mode, i));
2338                 }
2339         }
2340
2341 #ifdef DEBUG
2342         if (attempts) {
2343                 if (attempts < 5) xfs_small_retries++;
2344                 else if (attempts < 100) xfs_middle_retries++;
2345                 else xfs_lots_retries++;
2346         } else {
2347                 xfs_locked_n++;
2348         }
2349 #endif
2350 }
2351
2352 #ifdef  DEBUG
2353 #define REMOVE_DEBUG_TRACE(x)   {remove_which_error_return = (x);}
2354 int remove_which_error_return = 0;
2355 #else /* ! DEBUG */
2356 #define REMOVE_DEBUG_TRACE(x)
2357 #endif  /* ! DEBUG */
2358
2359
2360 /*
2361  * xfs_remove
2362  *
2363  */
2364 STATIC int
2365 xfs_remove(
2366         bhv_desc_t              *dir_bdp,
2367         bhv_vname_t             *dentry,
2368         cred_t                  *credp)
2369 {
2370         bhv_vnode_t             *dir_vp;
2371         char                    *name = VNAME(dentry);
2372         xfs_inode_t             *dp, *ip;
2373         xfs_trans_t             *tp = NULL;
2374         xfs_mount_t             *mp;
2375         int                     error = 0;
2376         xfs_bmap_free_t         free_list;
2377         xfs_fsblock_t           first_block;
2378         int                     cancel_flags;
2379         int                     committed;
2380         int                     dm_di_mode = 0;
2381         int                     link_zero;
2382         uint                    resblks;
2383         int                     namelen;
2384
2385         dir_vp = BHV_TO_VNODE(dir_bdp);
2386         vn_trace_entry(dir_vp, __FUNCTION__, (inst_t *)__return_address);
2387
2388         dp = XFS_BHVTOI(dir_bdp);
2389         mp = dp->i_mount;
2390
2391         if (XFS_FORCED_SHUTDOWN(mp))
2392                 return XFS_ERROR(EIO);
2393
2394         namelen = VNAMELEN(dentry);
2395
2396         if (!xfs_get_dir_entry(dentry, &ip)) {
2397                 dm_di_mode = ip->i_d.di_mode;
2398                 IRELE(ip);
2399         }
2400
2401         if (DM_EVENT_ENABLED(dir_vp->v_vfsp, dp, DM_EVENT_REMOVE)) {
2402                 error = XFS_SEND_NAMESP(mp, DM_EVENT_REMOVE, dir_vp,
2403                                         DM_RIGHT_NULL, NULL, DM_RIGHT_NULL,
2404                                         name, NULL, dm_di_mode, 0, 0);
2405                 if (error)
2406                         return error;
2407         }
2408
2409         /* From this point on, return through std_return */
2410         ip = NULL;
2411
2412         /*
2413          * We need to get a reference to ip before we get our log
2414          * reservation. The reason for this is that we cannot call
2415          * xfs_iget for an inode for which we do not have a reference
2416          * once we've acquired a log reservation. This is because the
2417          * inode we are trying to get might be in xfs_inactive going
2418          * for a log reservation. Since we'll have to wait for the
2419          * inactive code to complete before returning from xfs_iget,
2420          * we need to make sure that we don't have log space reserved
2421          * when we call xfs_iget.  Instead we get an unlocked reference
2422          * to the inode before getting our log reservation.
2423          */
2424         error = xfs_get_dir_entry(dentry, &ip);
2425         if (error) {
2426                 REMOVE_DEBUG_TRACE(__LINE__);
2427                 goto std_return;
2428         }
2429
2430         dm_di_mode = ip->i_d.di_mode;
2431
2432         vn_trace_entry(XFS_ITOV(ip), __FUNCTION__, (inst_t *)__return_address);
2433
2434         ITRACE(ip);
2435
2436         error = XFS_QM_DQATTACH(mp, dp, 0);
2437         if (!error && dp != ip)
2438                 error = XFS_QM_DQATTACH(mp, ip, 0);
2439         if (error) {
2440                 REMOVE_DEBUG_TRACE(__LINE__);
2441                 IRELE(ip);
2442                 goto std_return;
2443         }
2444
2445         tp = xfs_trans_alloc(mp, XFS_TRANS_REMOVE);
2446         cancel_flags = XFS_TRANS_RELEASE_LOG_RES;
2447         /*
2448          * We try to get the real space reservation first,
2449          * allowing for directory btree deletion(s) implying
2450          * possible bmap insert(s).  If we can't get the space
2451          * reservation then we use 0 instead, and avoid the bmap
2452          * btree insert(s) in the directory code by, if the bmap
2453          * insert tries to happen, instead trimming the LAST
2454          * block from the directory.
2455          */
2456         resblks = XFS_REMOVE_SPACE_RES(mp);
2457         error = xfs_trans_reserve(tp, resblks, XFS_REMOVE_LOG_RES(mp), 0,
2458                         XFS_TRANS_PERM_LOG_RES, XFS_REMOVE_LOG_COUNT);
2459         if (error == ENOSPC) {
2460                 resblks = 0;
2461                 error = xfs_trans_reserve(tp, 0, XFS_REMOVE_LOG_RES(mp), 0,
2462                                 XFS_TRANS_PERM_LOG_RES, XFS_REMOVE_LOG_COUNT);
2463         }
2464         if (error) {
2465                 ASSERT(error != ENOSPC);
2466                 REMOVE_DEBUG_TRACE(__LINE__);
2467                 xfs_trans_cancel(tp, 0);
2468                 IRELE(ip);
2469                 return error;
2470         }
2471
2472         error = xfs_lock_dir_and_entry(dp, ip);
2473         if (error) {
2474                 REMOVE_DEBUG_TRACE(__LINE__);
2475                 xfs_trans_cancel(tp, cancel_flags);
2476                 IRELE(ip);
2477                 goto std_return;
2478         }
2479
2480         /*
2481          * At this point, we've gotten both the directory and the entry
2482          * inodes locked.
2483          */
2484         xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL);
2485         if (dp != ip) {
2486                 /*
2487                  * Increment vnode ref count only in this case since
2488                  * there's an extra vnode reference in the case where
2489                  * dp == ip.
2490                  */
2491                 IHOLD(dp);
2492                 xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
2493         }
2494
2495         /*
2496          * Entry must exist since we did a lookup in xfs_lock_dir_and_entry.
2497          */
2498         XFS_BMAP_INIT(&free_list, &first_block);
2499         error = xfs_dir_removename(tp, dp, name, namelen, ip->i_ino,
2500                                         &first_block, &free_list, 0);
2501         if (error) {
2502                 ASSERT(error != ENOENT);
2503                 REMOVE_DEBUG_TRACE(__LINE__);
2504                 goto error1;
2505         }
2506         xfs_ichgtime(dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
2507
2508         dp->i_gen++;
2509         xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE);
2510
2511         error = xfs_droplink(tp, ip);
2512         if (error) {
2513                 REMOVE_DEBUG_TRACE(__LINE__);
2514                 goto error1;
2515         }
2516
2517         /* Determine if this is the last link while
2518          * we are in the transaction.
2519          */
2520         link_zero = (ip)->i_d.di_nlink==0;
2521
2522         /*
2523          * Take an extra ref on the inode so that it doesn't
2524          * go to xfs_inactive() from within the commit.
2525          */
2526         IHOLD(ip);
2527
2528         /*
2529          * If this is a synchronous mount, make sure that the
2530          * remove transaction goes to disk before returning to
2531          * the user.
2532          */
2533         if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) {
2534                 xfs_trans_set_sync(tp);
2535         }
2536
2537         error = xfs_bmap_finish(&tp, &free_list, &committed);
2538         if (error) {
2539                 REMOVE_DEBUG_TRACE(__LINE__);
2540                 goto error_rele;
2541         }
2542
2543         error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES);
2544         if (error) {
2545                 IRELE(ip);
2546                 goto std_return;
2547         }
2548
2549         /*
2550          * Before we drop our extra reference to the inode, purge it
2551          * from the refcache if it is there.  By waiting until afterwards
2552          * to do the IRELE, we ensure that we won't go inactive in the
2553          * xfs_refcache_purge_ip routine (although that would be OK).
2554          */
2555         xfs_refcache_purge_ip(ip);
2556
2557         vn_trace_exit(XFS_ITOV(ip), __FUNCTION__, (inst_t *)__return_address);
2558
2559         /*
2560          * Let interposed file systems know about removed links.
2561          */
2562         bhv_vop_link_removed(XFS_ITOV(ip), dir_vp, link_zero);
2563
2564         IRELE(ip);
2565
2566 /*      Fall through to std_return with error = 0 */
2567  std_return:
2568         if (DM_EVENT_ENABLED(dir_vp->v_vfsp, dp,
2569                                                 DM_EVENT_POSTREMOVE)) {
2570                 (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTREMOVE,
2571                                 dir_vp, DM_RIGHT_NULL,
2572                                 NULL, DM_RIGHT_NULL,
2573                                 name, NULL, dm_di_mode, error, 0);
2574         }
2575         return error;
2576
2577  error1:
2578         xfs_bmap_cancel(&free_list);
2579         cancel_flags |= XFS_TRANS_ABORT;
2580         xfs_trans_cancel(tp, cancel_flags);
2581         goto std_return;
2582
2583  error_rele:
2584         /*
2585          * In this case make sure to not release the inode until after
2586          * the current transaction is aborted.  Releasing it beforehand
2587          * can cause us to go to xfs_inactive and start a recursive
2588          * transaction which can easily deadlock with the current one.
2589          */
2590         xfs_bmap_cancel(&free_list);
2591         cancel_flags |= XFS_TRANS_ABORT;
2592         xfs_trans_cancel(tp, cancel_flags);
2593
2594         /*
2595          * Before we drop our extra reference to the inode, purge it
2596          * from the refcache if it is there.  By waiting until afterwards
2597          * to do the IRELE, we ensure that we won't go inactive in the
2598          * xfs_refcache_purge_ip routine (although that would be OK).
2599          */
2600         xfs_refcache_purge_ip(ip);
2601
2602         IRELE(ip);
2603
2604         goto std_return;
2605 }
2606
2607
2608 /*
2609  * xfs_link
2610  *
2611  */
2612 STATIC int
2613 xfs_link(
2614         bhv_desc_t              *target_dir_bdp,
2615         bhv_vnode_t             *src_vp,
2616         bhv_vname_t             *dentry,
2617         cred_t                  *credp)
2618 {
2619         xfs_inode_t             *tdp, *sip;
2620         xfs_trans_t             *tp;
2621         xfs_mount_t             *mp;
2622         xfs_inode_t             *ips[2];
2623         int                     error;
2624         xfs_bmap_free_t         free_list;
2625         xfs_fsblock_t           first_block;
2626         int                     cancel_flags;
2627         int                     committed;
2628         bhv_vnode_t             *target_dir_vp;
2629         int                     resblks;
2630         char                    *target_name = VNAME(dentry);
2631         int                     target_namelen;
2632
2633         target_dir_vp = BHV_TO_VNODE(target_dir_bdp);
2634         vn_trace_entry(target_dir_vp, __FUNCTION__, (inst_t *)__return_address);
2635         vn_trace_entry(src_vp, __FUNCTION__, (inst_t *)__return_address);
2636
2637         target_namelen = VNAMELEN(dentry);
2638         ASSERT(!VN_ISDIR(src_vp));
2639
2640         sip = xfs_vtoi(src_vp);
2641         tdp = XFS_BHVTOI(target_dir_bdp);
2642         mp = tdp->i_mount;
2643         if (XFS_FORCED_SHUTDOWN(mp))
2644                 return XFS_ERROR(EIO);
2645
2646         if (DM_EVENT_ENABLED(src_vp->v_vfsp, tdp, DM_EVENT_LINK)) {
2647                 error = XFS_SEND_NAMESP(mp, DM_EVENT_LINK,
2648                                         target_dir_vp, DM_RIGHT_NULL,
2649                                         src_vp, DM_RIGHT_NULL,
2650                                         target_name, NULL, 0, 0, 0);
2651                 if (error)
2652                         return error;
2653         }
2654
2655         /* Return through std_return after this point. */
2656
2657         error = XFS_QM_DQATTACH(mp, sip, 0);
2658         if (!error && sip != tdp)
2659                 error = XFS_QM_DQATTACH(mp, tdp, 0);
2660         if (error)
2661                 goto std_return;
2662
2663         tp = xfs_trans_alloc(mp, XFS_TRANS_LINK);
2664         cancel_flags = XFS_TRANS_RELEASE_LOG_RES;
2665         resblks = XFS_LINK_SPACE_RES(mp, target_namelen);
2666         error = xfs_trans_reserve(tp, resblks, XFS_LINK_LOG_RES(mp), 0,
2667                         XFS_TRANS_PERM_LOG_RES, XFS_LINK_LOG_COUNT);
2668         if (error == ENOSPC) {
2669                 resblks = 0;
2670                 error = xfs_trans_reserve(tp, 0, XFS_LINK_LOG_RES(mp), 0,
2671                                 XFS_TRANS_PERM_LOG_RES, XFS_LINK_LOG_COUNT);
2672         }
2673         if (error) {
2674                 cancel_flags = 0;
2675                 goto error_return;
2676         }
2677
2678         if (sip->i_ino < tdp->i_ino) {
2679                 ips[0] = sip;
2680                 ips[1] = tdp;
2681         } else {
2682                 ips[0] = tdp;
2683                 ips[1] = sip;
2684         }
2685
2686         xfs_lock_inodes(ips, 2, 0, XFS_ILOCK_EXCL);
2687
2688         /*
2689          * Increment vnode ref counts since xfs_trans_commit &
2690          * xfs_trans_cancel will both unlock the inodes and
2691          * decrement the associated ref counts.
2692          */
2693         VN_HOLD(src_vp);
2694         VN_HOLD(target_dir_vp);
2695         xfs_trans_ijoin(tp, sip, XFS_ILOCK_EXCL);
2696         xfs_trans_ijoin(tp, tdp, XFS_ILOCK_EXCL);
2697
2698         /*
2699          * If the source has too many links, we can't make any more to it.
2700          */
2701         if (sip->i_d.di_nlink >= XFS_MAXLINK) {
2702                 error = XFS_ERROR(EMLINK);
2703                 goto error_return;
2704         }
2705
2706         /*
2707          * If we are using project inheritance, we only allow hard link
2708          * creation in our tree when the project IDs are the same; else
2709          * the tree quota mechanism could be circumvented.
2710          */
2711         if (unlikely((tdp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) &&
2712                      (tdp->i_d.di_projid != sip->i_d.di_projid))) {
2713                 error = XFS_ERROR(EXDEV);
2714                 goto error_return;
2715         }
2716
2717         if (resblks == 0 &&
2718             (error = xfs_dir_canenter(tp, tdp, target_name, target_namelen)))
2719                 goto error_return;
2720
2721         XFS_BMAP_INIT(&free_list, &first_block);
2722
2723         error = xfs_dir_createname(tp, tdp, target_name, target_namelen,
2724                                    sip->i_ino, &first_block, &free_list,
2725                                    resblks);
2726         if (error)
2727                 goto abort_return;
2728         xfs_ichgtime(tdp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
2729         tdp->i_gen++;
2730         xfs_trans_log_inode(tp, tdp, XFS_ILOG_CORE);
2731
2732         error = xfs_bumplink(tp, sip);
2733         if (error)
2734                 goto abort_return;
2735
2736         /*
2737          * If this is a synchronous mount, make sure that the
2738          * link transaction goes to disk before returning to
2739          * the user.
2740          */
2741         if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) {
2742                 xfs_trans_set_sync(tp);
2743         }
2744
2745         error = xfs_bmap_finish (&tp, &free_list, &committed);
2746         if (error) {
2747                 xfs_bmap_cancel(&free_list);
2748                 goto abort_return;
2749         }
2750
2751         error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES);
2752         if (error)
2753                 goto std_return;
2754
2755         /* Fall through to std_return with error = 0. */
2756 std_return:
2757         if (DM_EVENT_ENABLED(src_vp->v_vfsp, sip,
2758                                                 DM_EVENT_POSTLINK)) {
2759                 (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTLINK,
2760                                 target_dir_vp, DM_RIGHT_NULL,
2761                                 src_vp, DM_RIGHT_NULL,
2762                                 target_name, NULL, 0, error, 0);
2763         }
2764         return error;
2765
2766  abort_return:
2767         cancel_flags |= XFS_TRANS_ABORT;
2768         /* FALLTHROUGH */
2769
2770  error_return:
2771         xfs_trans_cancel(tp, cancel_flags);
2772         goto std_return;
2773 }
2774
2775
2776 /*
2777  * xfs_mkdir
2778  *
2779  */
2780 STATIC int
2781 xfs_mkdir(
2782         bhv_desc_t              *dir_bdp,
2783         bhv_vname_t             *dentry,
2784         bhv_vattr_t             *vap,
2785         bhv_vnode_t             **vpp,
2786         cred_t                  *credp)
2787 {
2788         char                    *dir_name = VNAME(dentry);
2789         xfs_inode_t             *dp;
2790         xfs_inode_t             *cdp;   /* inode of created dir */
2791         bhv_vnode_t             *cvp;   /* vnode of created dir */
2792         xfs_trans_t             *tp;
2793         xfs_mount_t             *mp;
2794         int                     cancel_flags;
2795         int                     error;
2796         int                     committed;
2797         xfs_bmap_free_t         free_list;
2798         xfs_fsblock_t           first_block;
2799         bhv_vnode_t             *dir_vp;
2800         boolean_t               dp_joined_to_trans;
2801         boolean_t               created = B_FALSE;
2802         int                     dm_event_sent = 0;
2803         xfs_prid_t              prid;
2804         struct xfs_dquot        *udqp, *gdqp;
2805         uint                    resblks;
2806         int                     dm_di_mode;
2807         int                     dir_namelen;
2808
2809         dir_vp = BHV_TO_VNODE(dir_bdp);
2810         dp = XFS_BHVTOI(dir_bdp);
2811         mp = dp->i_mount;
2812
2813         if (XFS_FORCED_SHUTDOWN(mp))
2814                 return XFS_ERROR(EIO);
2815
2816         dir_namelen = VNAMELEN(dentry);
2817
2818         tp = NULL;
2819         dp_joined_to_trans = B_FALSE;
2820         dm_di_mode = vap->va_mode;
2821
2822         if (DM_EVENT_ENABLED(dir_vp->v_vfsp, dp, DM_EVENT_CREATE)) {
2823                 error = XFS_SEND_NAMESP(mp, DM_EVENT_CREATE,
2824                                         dir_vp, DM_RIGHT_NULL, NULL,
2825                                         DM_RIGHT_NULL, dir_name, NULL,
2826                                         dm_di_mode, 0, 0);
2827                 if (error)
2828                         return error;
2829                 dm_event_sent = 1;
2830         }
2831
2832         /* Return through std_return after this point. */
2833
2834         vn_trace_entry(dir_vp, __FUNCTION__, (inst_t *)__return_address);
2835
2836         mp = dp->i_mount;
2837         udqp = gdqp = NULL;
2838         if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT)
2839                 prid = dp->i_d.di_projid;
2840         else if (vap->va_mask & XFS_AT_PROJID)
2841                 prid = (xfs_prid_t)vap->va_projid;
2842         else
2843                 prid = (xfs_prid_t)dfltprid;
2844
2845         /*
2846          * Make sure that we have allocated dquot(s) on disk.
2847          */
2848         error = XFS_QM_DQVOPALLOC(mp, dp,
2849                         current_fsuid(credp), current_fsgid(credp), prid,
2850                         XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, &udqp, &gdqp);
2851         if (error)
2852                 goto std_return;
2853
2854         tp = xfs_trans_alloc(mp, XFS_TRANS_MKDIR);
2855         cancel_flags = XFS_TRANS_RELEASE_LOG_RES;
2856         resblks = XFS_MKDIR_SPACE_RES(mp, dir_namelen);
2857         error = xfs_trans_reserve(tp, resblks, XFS_MKDIR_LOG_RES(mp), 0,
2858                                   XFS_TRANS_PERM_LOG_RES, XFS_MKDIR_LOG_COUNT);
2859         if (error == ENOSPC) {
2860                 resblks = 0;
2861                 error = xfs_trans_reserve(tp, 0, XFS_MKDIR_LOG_RES(mp), 0,
2862                                           XFS_TRANS_PERM_LOG_RES,
2863                                           XFS_MKDIR_LOG_COUNT);
2864         }
2865         if (error) {
2866                 cancel_flags = 0;
2867                 dp = NULL;
2868                 goto error_return;
2869         }
2870
2871         xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT);
2872
2873         /*
2874          * Check for directory link count overflow.
2875          */
2876         if (dp->i_d.di_nlink >= XFS_MAXLINK) {
2877                 error = XFS_ERROR(EMLINK);
2878                 goto error_return;
2879         }
2880
2881         /*
2882          * Reserve disk quota and the inode.
2883          */
2884         error = XFS_TRANS_RESERVE_QUOTA(mp, tp, udqp, gdqp, resblks, 1, 0);
2885         if (error)
2886                 goto error_return;
2887
2888         if (resblks == 0 &&
2889             (error = xfs_dir_canenter(tp, dp, dir_name, dir_namelen)))
2890                 goto error_return;
2891         /*
2892          * create the directory inode.
2893          */
2894         error = xfs_dir_ialloc(&tp, dp, vap->va_mode, 2,
2895                         0, credp, prid, resblks > 0,
2896                 &cdp, NULL);
2897         if (error) {
2898                 if (error == ENOSPC)
2899                         goto error_return;
2900                 goto abort_return;
2901         }
2902         ITRACE(cdp);
2903
2904         /*
2905          * Now we add the directory inode to the transaction.
2906          * We waited until now since xfs_dir_ialloc might start
2907          * a new transaction.  Had we joined the transaction
2908          * earlier, the locks might have gotten released.
2909          */
2910         VN_HOLD(dir_vp);
2911         xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL);
2912         dp_joined_to_trans = B_TRUE;
2913
2914         XFS_BMAP_INIT(&free_list, &first_block);
2915
2916         error = xfs_dir_createname(tp, dp, dir_name, dir_namelen, cdp->i_ino,
2917                                    &first_block, &free_list, resblks ?
2918                                    resblks - XFS_IALLOC_SPACE_RES(mp) : 0);
2919         if (error) {
2920                 ASSERT(error != ENOSPC);
2921                 goto error1;
2922         }
2923         xfs_ichgtime(dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
2924
2925         /*
2926          * Bump the in memory version number of the parent directory
2927          * so that other processes accessing it will recognize that
2928          * the directory has changed.
2929          */
2930         dp->i_gen++;
2931
2932         error = xfs_dir_init(tp, cdp, dp);
2933         if (error)
2934                 goto error2;
2935
2936         cdp->i_gen = 1;
2937         error = xfs_bumplink(tp, dp);
2938         if (error)
2939                 goto error2;
2940
2941         cvp = XFS_ITOV(cdp);
2942
2943         created = B_TRUE;
2944
2945         *vpp = cvp;
2946         IHOLD(cdp);
2947
2948         /*
2949          * Attach the dquots to the new inode and modify the icount incore.
2950          */
2951         XFS_QM_DQVOPCREATE(mp, tp, cdp, udqp, gdqp);
2952
2953         /*
2954          * If this is a synchronous mount, make sure that the
2955          * mkdir transaction goes to disk before returning to
2956          * the user.
2957          */
2958         if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) {
2959                 xfs_trans_set_sync(tp);
2960         }
2961
2962         error = xfs_bmap_finish(&tp, &free_list, &committed);
2963         if (error) {
2964                 IRELE(cdp);
2965                 goto error2;
2966         }
2967
2968         error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES);
2969         XFS_QM_DQRELE(mp, udqp);
2970         XFS_QM_DQRELE(mp, gdqp);
2971         if (error) {
2972                 IRELE(cdp);
2973         }
2974
2975         /* Fall through to std_return with error = 0 or errno from
2976          * xfs_trans_commit. */
2977
2978 std_return:
2979         if ( (created || (error != 0 && dm_event_sent != 0)) &&
2980                         DM_EVENT_ENABLED(dir_vp->v_vfsp, XFS_BHVTOI(dir_bdp),
2981                                                 DM_EVENT_POSTCREATE)) {
2982                 (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTCREATE,
2983                                         dir_vp, DM_RIGHT_NULL,
2984                                         created ? XFS_ITOV(cdp):NULL,
2985                                         DM_RIGHT_NULL,
2986                                         dir_name, NULL,
2987                                         dm_di_mode, error, 0);
2988         }
2989         return error;
2990
2991  error2:
2992  error1:
2993         xfs_bmap_cancel(&free_list);
2994  abort_return:
2995         cancel_flags |= XFS_TRANS_ABORT;
2996  error_return:
2997         xfs_trans_cancel(tp, cancel_flags);
2998         XFS_QM_DQRELE(mp, udqp);
2999         XFS_QM_DQRELE(mp, gdqp);
3000
3001         if (!dp_joined_to_trans && (dp != NULL)) {
3002                 xfs_iunlock(dp, XFS_ILOCK_EXCL);
3003         }
3004
3005         goto std_return;
3006 }
3007
3008
3009 /*
3010  * xfs_rmdir
3011  *
3012  */
3013 STATIC int
3014 xfs_rmdir(
3015         bhv_desc_t              *dir_bdp,
3016         bhv_vname_t             *dentry,
3017         cred_t                  *credp)
3018 {
3019         char                    *name = VNAME(dentry);
3020         xfs_inode_t             *dp;
3021         xfs_inode_t             *cdp;   /* child directory */
3022         xfs_trans_t             *tp;
3023         xfs_mount_t             *mp;
3024         int                     error;
3025         xfs_bmap_free_t         free_list;
3026         xfs_fsblock_t           first_block;
3027         int                     cancel_flags;
3028         int                     committed;
3029         bhv_vnode_t             *dir_vp;
3030         int                     dm_di_mode = S_IFDIR;
3031         int                     last_cdp_link;
3032         int                     namelen;
3033         uint                    resblks;
3034
3035         dir_vp = BHV_TO_VNODE(dir_bdp);
3036         dp = XFS_BHVTOI(dir_bdp);
3037         mp = dp->i_mount;
3038
3039         vn_trace_entry(dir_vp, __FUNCTION__, (inst_t *)__return_address);
3040
3041         if (XFS_FORCED_SHUTDOWN(XFS_BHVTOI(dir_bdp)->i_mount))
3042                 return XFS_ERROR(EIO);
3043         namelen = VNAMELEN(dentry);
3044
3045         if (!xfs_get_dir_entry(dentry, &cdp)) {
3046                 dm_di_mode = cdp->i_d.di_mode;
3047                 IRELE(cdp);
3048         }
3049
3050         if (DM_EVENT_ENABLED(dir_vp->v_vfsp, dp, DM_EVENT_REMOVE)) {
3051                 error = XFS_SEND_NAMESP(mp, DM_EVENT_REMOVE,
3052                                         dir_vp, DM_RIGHT_NULL,
3053                                         NULL, DM_RIGHT_NULL,
3054                                         name, NULL, dm_di_mode, 0, 0);
3055                 if (error)
3056                         return XFS_ERROR(error);
3057         }
3058
3059         /* Return through std_return after this point. */
3060
3061         cdp = NULL;
3062
3063         /*
3064          * We need to get a reference to cdp before we get our log
3065          * reservation.  The reason for this is that we cannot call
3066          * xfs_iget for an inode for which we do not have a reference
3067          * once we've acquired a log reservation.  This is because the
3068          * inode we are trying to get might be in xfs_inactive going
3069          * for a log reservation.  Since we'll have to wait for the
3070          * inactive code to complete before returning from xfs_iget,
3071          * we need to make sure that we don't have log space reserved
3072          * when we call xfs_iget.  Instead we get an unlocked reference
3073          * to the inode before getting our log reservation.
3074          */
3075         error = xfs_get_dir_entry(dentry, &cdp);
3076         if (error) {
3077                 REMOVE_DEBUG_TRACE(__LINE__);
3078                 goto std_return;
3079         }
3080         mp = dp->i_mount;
3081         dm_di_mode = cdp->i_d.di_mode;
3082
3083         /*
3084          * Get the dquots for the inodes.
3085          */
3086         error = XFS_QM_DQATTACH(mp, dp, 0);
3087         if (!error && dp != cdp)
3088                 error = XFS_QM_DQATTACH(mp, cdp, 0);
3089         if (error) {
3090                 IRELE(cdp);
3091                 REMOVE_DEBUG_TRACE(__LINE__);
3092                 goto std_return;
3093         }
3094
3095         tp = xfs_trans_alloc(mp, XFS_TRANS_RMDIR);
3096         cancel_flags = XFS_TRANS_RELEASE_LOG_RES;
3097         /*
3098          * We try to get the real space reservation first,
3099          * allowing for directory btree deletion(s) implying
3100          * possible bmap insert(s).  If we can't get the space
3101          * reservation then we use 0 instead, and avoid the bmap
3102          * btree insert(s) in the directory code by, if the bmap
3103          * insert tries to happen, instead trimming the LAST
3104          * block from the directory.
3105          */
3106         resblks = XFS_REMOVE_SPACE_RES(mp);
3107         error = xfs_trans_reserve(tp, resblks, XFS_REMOVE_LOG_RES(mp), 0,
3108                         XFS_TRANS_PERM_LOG_RES, XFS_DEFAULT_LOG_COUNT);
3109         if (error == ENOSPC) {
3110                 resblks = 0;
3111                 error = xfs_trans_reserve(tp, 0, XFS_REMOVE_LOG_RES(mp), 0,
3112                                 XFS_TRANS_PERM_LOG_RES, XFS_DEFAULT_LOG_COUNT);
3113         }
3114         if (error) {
3115                 ASSERT(error != ENOSPC);
3116                 cancel_flags = 0;
3117                 IRELE(cdp);
3118                 goto error_return;
3119         }
3120         XFS_BMAP_INIT(&free_list, &first_block);
3121
3122         /*
3123          * Now lock the child directory inode and the parent directory
3124          * inode in the proper order.  This will take care of validating
3125          * that the directory entry for the child directory inode has
3126          * not changed while we were obtaining a log reservation.
3127          */
3128         error = xfs_lock_dir_and_entry(dp, cdp);
3129         if (error) {
3130                 xfs_trans_cancel(tp, cancel_flags);
3131                 IRELE(cdp);
3132                 goto std_return;
3133         }
3134
3135         xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL);
3136         if (dp != cdp) {
3137                 /*
3138                  * Only increment the parent directory vnode count if
3139                  * we didn't bump it in looking up cdp.  The only time
3140                  * we don't bump it is when we're looking up ".".
3141                  */
3142                 VN_HOLD(dir_vp);
3143         }
3144
3145         ITRACE(cdp);
3146         xfs_trans_ijoin(tp, cdp, XFS_ILOCK_EXCL);
3147
3148         ASSERT(cdp->i_d.di_nlink >= 2);
3149         if (cdp->i_d.di_nlink != 2) {
3150                 error = XFS_ERROR(ENOTEMPTY);
3151                 goto error_return;
3152         }
3153         if (!xfs_dir_isempty(cdp)) {
3154                 error = XFS_ERROR(ENOTEMPTY);
3155                 goto error_return;
3156         }
3157
3158         error = xfs_dir_removename(tp, dp, name, namelen, cdp->i_ino,
3159                                         &first_block, &free_list, resblks);
3160         if (error)
3161                 goto error1;
3162
3163         xfs_ichgtime(dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
3164
3165         /*
3166          * Bump the in memory generation count on the parent
3167          * directory so that other can know that it has changed.
3168          */
3169         dp->i_gen++;
3170
3171         /*
3172          * Drop the link from cdp's "..".
3173          */
3174         error = xfs_droplink(tp, dp);
3175         if (error) {
3176                 goto error1;
3177         }
3178
3179         /*
3180          * Drop the link from dp to cdp.
3181          */
3182         error = xfs_droplink(tp, cdp);
3183         if (error) {
3184                 goto error1;
3185         }
3186
3187         /*
3188          * Drop the "." link from cdp to self.
3189          */
3190         error = xfs_droplink(tp, cdp);
3191         if (error) {
3192                 goto error1;
3193         }
3194
3195         /* Determine these before committing transaction */
3196         last_cdp_link = (cdp)->i_d.di_nlink==0;
3197
3198         /*
3199          * Take an extra ref on the child vnode so that it
3200          * does not go to xfs_inactive() from within the commit.
3201          */
3202         IHOLD(cdp);
3203
3204         /*
3205          * If this is a synchronous mount, make sure that the
3206          * rmdir transaction goes to disk before returning to
3207          * the user.
3208          */
3209         if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) {
3210                 xfs_trans_set_sync(tp);
3211         }
3212
3213         error = xfs_bmap_finish (&tp, &free_list, &committed);
3214         if (error) {
3215                 xfs_bmap_cancel(&free_list);
3216                 xfs_trans_cancel(tp, (XFS_TRANS_RELEASE_LOG_RES |
3217                                  XFS_TRANS_ABORT));
3218                 IRELE(cdp);
3219                 goto std_return;
3220         }
3221
3222         error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES);
3223         if (error) {
3224                 IRELE(cdp);
3225                 goto std_return;
3226         }
3227
3228
3229         /*
3230          * Let interposed file systems know about removed links.
3231          */
3232         bhv_vop_link_removed(XFS_ITOV(cdp), dir_vp, last_cdp_link);
3233
3234         IRELE(cdp);
3235
3236         /* Fall through to std_return with error = 0 or the errno
3237          * from xfs_trans_commit. */
3238  std_return:
3239         if (DM_EVENT_ENABLED(dir_vp->v_vfsp, dp, DM_EVENT_POSTREMOVE)) {
3240                 (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTREMOVE,
3241                                         dir_vp, DM_RIGHT_NULL,
3242                                         NULL, DM_RIGHT_NULL,
3243                                         name, NULL, dm_di_mode,
3244                                         error, 0);
3245         }
3246         return error;
3247
3248  error1:
3249         xfs_bmap_cancel(&free_list);
3250         cancel_flags |= XFS_TRANS_ABORT;
3251         /* FALLTHROUGH */
3252
3253  error_return:
3254         xfs_trans_cancel(tp, cancel_flags);
3255         goto std_return;
3256 }
3257
3258
3259 /*
3260  * Read dp's entries starting at uiop->uio_offset and translate them into
3261  * bufsize bytes worth of struct dirents starting at bufbase.
3262  */
3263 STATIC int
3264 xfs_readdir(
3265         bhv_desc_t      *dir_bdp,
3266         uio_t           *uiop,
3267         cred_t          *credp,
3268         int             *eofp)
3269 {
3270         xfs_inode_t     *dp;
3271         xfs_trans_t     *tp = NULL;
3272         int             error = 0;
3273         uint            lock_mode;
3274
3275         vn_trace_entry(BHV_TO_VNODE(dir_bdp), __FUNCTION__,
3276                                                (inst_t *)__return_address);
3277         dp = XFS_BHVTOI(dir_bdp);
3278
3279         if (XFS_FORCED_SHUTDOWN(dp->i_mount))
3280                 return XFS_ERROR(EIO);
3281
3282         lock_mode = xfs_ilock_map_shared(dp);
3283         error = xfs_dir_getdents(tp, dp, uiop, eofp);
3284         xfs_iunlock_map_shared(dp, lock_mode);
3285         return error;
3286 }
3287
3288
3289 STATIC int
3290 xfs_symlink(
3291         bhv_desc_t              *dir_bdp,
3292         bhv_vname_t             *dentry,
3293         bhv_vattr_t             *vap,
3294         char                    *target_path,
3295         bhv_vnode_t             **vpp,
3296         cred_t                  *credp)
3297 {
3298         xfs_trans_t             *tp;
3299         xfs_mount_t             *mp;
3300         xfs_inode_t             *dp;
3301         xfs_inode_t             *ip;
3302         int                     error;
3303         int                     pathlen;
3304         xfs_bmap_free_t         free_list;
3305         xfs_fsblock_t           first_block;
3306         boolean_t               dp_joined_to_trans;
3307         bhv_vnode_t             *dir_vp;
3308         uint                    cancel_flags;
3309         int                     committed;
3310         xfs_fileoff_t           first_fsb;
3311         xfs_filblks_t           fs_blocks;
3312         int                     nmaps;
3313         xfs_bmbt_irec_t         mval[SYMLINK_MAPS];
3314         xfs_daddr_t             d;
3315         char                    *cur_chunk;
3316         int                     byte_cnt;
3317         int                     n;
3318         xfs_buf_t               *bp;
3319         xfs_prid_t              prid;
3320         struct xfs_dquot        *udqp, *gdqp;
3321         uint                    resblks;
3322         char                    *link_name = VNAME(dentry);
3323         int                     link_namelen;
3324
3325         *vpp = NULL;
3326         dir_vp = BHV_TO_VNODE(dir_bdp);
3327         dp = XFS_BHVTOI(dir_bdp);
3328         dp_joined_to_trans = B_FALSE;
3329         error = 0;
3330         ip = NULL;
3331         tp = NULL;
3332
3333         vn_trace_entry(dir_vp, __FUNCTION__, (inst_t *)__return_address);
3334
3335         mp = dp->i_mount;
3336
3337         if (XFS_FORCED_SHUTDOWN(mp))
3338                 return XFS_ERROR(EIO);
3339
3340         link_namelen = VNAMELEN(dentry);
3341
3342         /*
3343          * Check component lengths of the target path name.
3344          */
3345         pathlen = strlen(target_path);
3346         if (pathlen >= MAXPATHLEN)      /* total string too long */
3347                 return XFS_ERROR(ENAMETOOLONG);
3348         if (pathlen >= MAXNAMELEN) {    /* is any component too long? */
3349                 int len, total;
3350                 char *path;
3351
3352                 for (total = 0, path = target_path; total < pathlen;) {
3353                         /*
3354                          * Skip any slashes.
3355                          */
3356                         while(*path == '/') {
3357                                 total++;
3358                                 path++;
3359                         }
3360
3361                         /*
3362                          * Count up to the next slash or end of path.
3363                          * Error out if the component is bigger than MAXNAMELEN.
3364                          */
3365                         for(len = 0; *path != '/' && total < pathlen;total++, path++) {
3366                                 if (++len >= MAXNAMELEN) {
3367                                         error = ENAMETOOLONG;
3368                                         return error;
3369                                 }
3370                         }
3371                 }
3372         }
3373
3374         if (DM_EVENT_ENABLED(dir_vp->v_vfsp, dp, DM_EVENT_SYMLINK)) {
3375                 error = XFS_SEND_NAMESP(mp, DM_EVENT_SYMLINK, dir_vp,
3376                                         DM_RIGHT_NULL, NULL, DM_RIGHT_NULL,
3377                                         link_name, target_path, 0, 0, 0);
3378                 if (error)
3379                         return error;
3380         }
3381
3382         /* Return through std_return after this point. */
3383
3384         udqp = gdqp = NULL;
3385         if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT)
3386                 prid = dp->i_d.di_projid;
3387         else if (vap->va_mask & XFS_AT_PROJID)
3388                 prid = (xfs_prid_t)vap->va_projid;
3389         else
3390                 prid = (xfs_prid_t)dfltprid;
3391
3392         /*
3393          * Make sure that we have allocated dquot(s) on disk.
3394          */
3395         error = XFS_QM_DQVOPALLOC(mp, dp,
3396                         current_fsuid(credp), current_fsgid(credp), prid,
3397                         XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, &udqp, &gdqp);
3398         if (error)
3399                 goto std_return;
3400
3401         tp = xfs_trans_alloc(mp, XFS_TRANS_SYMLINK);
3402         cancel_flags = XFS_TRANS_RELEASE_LOG_RES;
3403         /*
3404          * The symlink will fit into the inode data fork?
3405          * There can't be any attributes so we get the whole variable part.
3406          */
3407         if (pathlen <= XFS_LITINO(mp))
3408                 fs_blocks = 0;
3409         else
3410                 fs_blocks = XFS_B_TO_FSB(mp, pathlen);
3411         resblks = XFS_SYMLINK_SPACE_RES(mp, link_namelen, fs_blocks);
3412         error = xfs_trans_reserve(tp, resblks, XFS_SYMLINK_LOG_RES(mp), 0,
3413                         XFS_TRANS_PERM_LOG_RES, XFS_SYMLINK_LOG_COUNT);
3414         if (error == ENOSPC && fs_blocks == 0) {
3415                 resblks = 0;
3416                 error = xfs_trans_reserve(tp, 0, XFS_SYMLINK_LOG_RES(mp), 0,
3417                                 XFS_TRANS_PERM_LOG_RES, XFS_SYMLINK_LOG_COUNT);
3418         }
3419         if (error) {
3420                 cancel_flags = 0;
3421                 dp = NULL;
3422                 goto error_return;
3423         }
3424
3425         xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT);
3426
3427         /*
3428          * Check whether the directory allows new symlinks or not.
3429          */
3430         if (dp->i_d.di_flags & XFS_DIFLAG_NOSYMLINKS) {
3431                 error = XFS_ERROR(EPERM);
3432                 goto error_return;
3433         }
3434
3435         /*
3436          * Reserve disk quota : blocks and inode.
3437          */
3438         error = XFS_TRANS_RESERVE_QUOTA(mp, tp, udqp, gdqp, resblks, 1, 0);
3439         if (error)
3440                 goto error_return;
3441
3442         /*
3443          * Check for ability to enter directory entry, if no space reserved.
3444          */
3445         if (resblks == 0 &&
3446             (error = xfs_dir_canenter(tp, dp, link_name, link_namelen)))
3447                 goto error_return;
3448         /*
3449          * Initialize the bmap freelist prior to calling either
3450          * bmapi or the directory create code.
3451          */
3452         XFS_BMAP_INIT(&free_list, &first_block);
3453
3454         /*
3455          * Allocate an inode for the symlink.
3456          */
3457         error = xfs_dir_ialloc(&tp, dp, S_IFLNK | (vap->va_mode&~S_IFMT),
3458                                1, 0, credp, prid, resblks > 0, &ip, NULL);
3459         if (error) {
3460                 if (error == ENOSPC)
3461                         goto error_return;
3462                 goto error1;
3463         }
3464         ITRACE(ip);
3465
3466         VN_HOLD(dir_vp);
3467         xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL);
3468         dp_joined_to_trans = B_TRUE;
3469
3470         /*
3471          * Also attach the dquot(s) to it, if applicable.
3472          */
3473         XFS_QM_DQVOPCREATE(mp, tp, ip, udqp, gdqp);
3474
3475         if (resblks)
3476                 resblks -= XFS_IALLOC_SPACE_RES(mp);
3477         /*
3478          * If the symlink will fit into the inode, write it inline.
3479          */
3480         if (pathlen <= XFS_IFORK_DSIZE(ip)) {
3481                 xfs_idata_realloc(ip, pathlen, XFS_DATA_FORK);
3482                 memcpy(ip->i_df.if_u1.if_data, target_path, pathlen);
3483                 ip->i_d.di_size = pathlen;
3484
3485                 /*
3486                  * The inode was initially created in extent format.
3487                  */
3488                 ip->i_df.if_flags &= ~(XFS_IFEXTENTS | XFS_IFBROOT);
3489                 ip->i_df.if_flags |= XFS_IFINLINE;
3490
3491                 ip->i_d.di_format = XFS_DINODE_FMT_LOCAL;
3492                 xfs_trans_log_inode(tp, ip, XFS_ILOG_DDATA | XFS_ILOG_CORE);
3493
3494         } else {
3495                 first_fsb = 0;
3496                 nmaps = SYMLINK_MAPS;
3497
3498                 error = xfs_bmapi(tp, ip, first_fsb, fs_blocks,
3499                                   XFS_BMAPI_WRITE | XFS_BMAPI_METADATA,
3500                                   &first_block, resblks, mval, &nmaps,
3501                                   &free_list, NULL);
3502                 if (error) {
3503                         goto error1;
3504                 }
3505
3506                 if (resblks)
3507                         resblks -= fs_blocks;
3508                 ip->i_d.di_size = pathlen;
3509                 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
3510
3511                 cur_chunk = target_path;
3512                 for (n = 0; n < nmaps; n++) {
3513                         d = XFS_FSB_TO_DADDR(mp, mval[n].br_startblock);
3514                         byte_cnt = XFS_FSB_TO_B(mp, mval[n].br_blockcount);
3515                         bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, d,
3516                                                BTOBB(byte_cnt), 0);
3517                         ASSERT(bp && !XFS_BUF_GETERROR(bp));
3518                         if (pathlen < byte_cnt) {
3519                                 byte_cnt = pathlen;
3520                         }
3521                         pathlen -= byte_cnt;
3522
3523                         memcpy(XFS_BUF_PTR(bp), cur_chunk, byte_cnt);
3524                         cur_chunk += byte_cnt;
3525
3526                         xfs_trans_log_buf(tp, bp, 0, byte_cnt - 1);
3527                 }
3528         }
3529
3530         /*
3531          * Create the directory entry for the symlink.
3532          */
3533         error = xfs_dir_createname(tp, dp, link_name, link_namelen, ip->i_ino,
3534                                    &first_block, &free_list, resblks);
3535         if (error)
3536                 goto error1;
3537         xfs_ichgtime(dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
3538         xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE);
3539
3540         /*
3541          * Bump the in memory version number of the parent directory
3542          * so that other processes accessing it will recognize that
3543          * the directory has changed.
3544          */
3545         dp->i_gen++;
3546
3547         /*
3548          * If this is a synchronous mount, make sure that the
3549          * symlink transaction goes to disk before returning to
3550          * the user.
3551          */
3552         if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) {
3553                 xfs_trans_set_sync(tp);
3554         }
3555
3556         /*
3557          * xfs_trans_commit normally decrements the vnode ref count
3558          * when it unlocks the inode. Since we want to return the
3559          * vnode to the caller, we bump the vnode ref count now.
3560          */
3561         IHOLD(ip);
3562
3563         error = xfs_bmap_finish(&tp, &free_list, &committed);
3564         if (error) {
3565                 goto error2;
3566         }
3567         error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES);
3568         XFS_QM_DQRELE(mp, udqp);
3569         XFS_QM_DQRELE(mp, gdqp);
3570
3571         /* Fall through to std_return with error = 0 or errno from
3572          * xfs_trans_commit     */
3573 std_return:
3574         if (DM_EVENT_ENABLED(dir_vp->v_vfsp, XFS_BHVTOI(dir_bdp),
3575                              DM_EVENT_POSTSYMLINK)) {
3576                 (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTSYMLINK,
3577                                         dir_vp, DM_RIGHT_NULL,
3578                                         error ? NULL : XFS_ITOV(ip),
3579                                         DM_RIGHT_NULL, link_name, target_path,
3580                                         0, error, 0);
3581         }
3582
3583         if (!error) {
3584                 bhv_vnode_t *vp;
3585
3586                 ASSERT(ip);
3587                 vp = XFS_ITOV(ip);
3588                 *vpp = vp;
3589         }
3590         return error;
3591
3592  error2:
3593         IRELE(ip);
3594  error1:
3595         xfs_bmap_cancel(&free_list);
3596         cancel_flags |= XFS_TRANS_ABORT;
3597  error_return:
3598         xfs_trans_cancel(tp, cancel_flags);
3599         XFS_QM_DQRELE(mp, udqp);
3600         XFS_QM_DQRELE(mp, gdqp);
3601
3602         if (!dp_joined_to_trans && (dp != NULL)) {
3603                 xfs_iunlock(dp, XFS_ILOCK_EXCL);
3604         }
3605
3606         goto std_return;
3607 }
3608
3609
3610 /*
3611  * xfs_fid2
3612  *
3613  * A fid routine that takes a pointer to a previously allocated
3614  * fid structure (like xfs_fast_fid) but uses a 64 bit inode number.
3615  */
3616 STATIC int
3617 xfs_fid2(
3618         bhv_desc_t      *bdp,
3619         fid_t           *fidp)
3620 {
3621         xfs_inode_t     *ip;
3622         xfs_fid2_t      *xfid;
3623
3624         vn_trace_entry(BHV_TO_VNODE(bdp), __FUNCTION__,
3625                                        (inst_t *)__return_address);
3626         ASSERT(sizeof(fid_t) >= sizeof(xfs_fid2_t));
3627
3628         xfid = (xfs_fid2_t *)fidp;
3629         ip = XFS_BHVTOI(bdp);
3630         xfid->fid_len = sizeof(xfs_fid2_t) - sizeof(xfid->fid_len);
3631         xfid->fid_pad = 0;
3632         /*
3633          * use memcpy because the inode is a long long and there's no
3634          * assurance that xfid->fid_ino is properly aligned.
3635          */
3636         memcpy(&xfid->fid_ino, &ip->i_ino, sizeof(xfid->fid_ino));
3637         xfid->fid_gen = ip->i_d.di_gen;
3638
3639         return 0;
3640 }
3641
3642
3643 /*
3644  * xfs_rwlock
3645  */
3646 int
3647 xfs_rwlock(
3648         bhv_desc_t      *bdp,
3649         bhv_vrwlock_t   locktype)
3650 {
3651         xfs_inode_t     *ip;
3652         bhv_vnode_t     *vp;
3653
3654         vp = BHV_TO_VNODE(bdp);
3655         if (VN_ISDIR(vp))
3656                 return 1;
3657         ip = XFS_BHVTOI(bdp);
3658         if (locktype == VRWLOCK_WRITE) {
3659                 xfs_ilock(ip, XFS_IOLOCK_EXCL);
3660         } else if (locktype == VRWLOCK_TRY_READ) {
3661                 return xfs_ilock_nowait(ip, XFS_IOLOCK_SHARED);
3662         } else if (locktype == VRWLOCK_TRY_WRITE) {
3663                 return xfs_ilock_nowait(ip, XFS_IOLOCK_EXCL);
3664         } else {
3665                 ASSERT((locktype == VRWLOCK_READ) ||
3666                        (locktype == VRWLOCK_WRITE_DIRECT));
3667                 xfs_ilock(ip, XFS_IOLOCK_SHARED);
3668         }
3669
3670         return 1;
3671 }
3672
3673
3674 /*
3675  * xfs_rwunlock
3676  */
3677 void
3678 xfs_rwunlock(
3679         bhv_desc_t      *bdp,
3680         bhv_vrwlock_t   locktype)
3681 {
3682         xfs_inode_t     *ip;
3683         bhv_vnode_t     *vp;
3684
3685         vp = BHV_TO_VNODE(bdp);
3686         if (VN_ISDIR(vp))
3687                 return;
3688         ip = XFS_BHVTOI(bdp);
3689         if (locktype == VRWLOCK_WRITE) {
3690                 /*
3691                  * In the write case, we may have added a new entry to
3692                  * the reference cache.  This might store a pointer to
3693                  * an inode to be released in this inode.  If it is there,
3694                  * clear the pointer and release the inode after unlocking
3695                  * this one.
3696                  */
3697                 xfs_refcache_iunlock(ip, XFS_IOLOCK_EXCL);
3698         } else {
3699                 ASSERT((locktype == VRWLOCK_READ) ||
3700                        (locktype == VRWLOCK_WRITE_DIRECT));
3701                 xfs_iunlock(ip, XFS_IOLOCK_SHARED);
3702         }
3703         return;
3704 }
3705
3706 STATIC int
3707 xfs_inode_flush(
3708         bhv_desc_t      *bdp,
3709         int             flags)
3710 {
3711         xfs_inode_t     *ip;
3712         xfs_mount_t     *mp;
3713         xfs_inode_log_item_t *iip;
3714         int             error = 0;
3715
3716         ip = XFS_BHVTOI(bdp);
3717         mp = ip->i_mount;
3718         iip = ip->i_itemp;
3719
3720         if (XFS_FORCED_SHUTDOWN(mp))
3721                 return XFS_ERROR(EIO);
3722
3723         /*
3724          * Bypass inodes which have already been cleaned by
3725          * the inode flush clustering code inside xfs_iflush
3726          */
3727         if ((ip->i_update_core == 0) &&
3728             ((iip == NULL) || !(iip->ili_format.ilf_fields & XFS_ILOG_ALL)))
3729                 return 0;
3730
3731         if (flags & FLUSH_LOG) {
3732                 if (iip && iip->ili_last_lsn) {
3733                         xlog_t          *log = mp->m_log;
3734                         xfs_lsn_t       sync_lsn;
3735                         int             s, log_flags = XFS_LOG_FORCE;
3736
3737                         s = GRANT_LOCK(log);
3738                         sync_lsn = log->l_last_sync_lsn;
3739                         GRANT_UNLOCK(log, s);
3740
3741                         if ((XFS_LSN_CMP(iip->ili_last_lsn, sync_lsn) <= 0))
3742                                 return 0;
3743
3744                         if (flags & FLUSH_SYNC)
3745                                 log_flags |= XFS_LOG_SYNC;
3746                         return xfs_log_force(mp, iip->ili_last_lsn, log_flags);
3747                 }
3748         }
3749
3750         /*
3751          * We make this non-blocking if the inode is contended,
3752          * return EAGAIN to indicate to the caller that they
3753          * did not succeed. This prevents the flush path from
3754          * blocking on inodes inside another operation right
3755          * now, they get caught later by xfs_sync.
3756          */
3757         if (flags & FLUSH_INODE) {
3758                 int     flush_flags;
3759
3760                 if (xfs_ipincount(ip))
3761                         return EAGAIN;
3762
3763                 if (flags & FLUSH_SYNC) {
3764                         xfs_ilock(ip, XFS_ILOCK_SHARED);
3765                         xfs_iflock(ip);
3766                 } else if (xfs_ilock_nowait(ip, XFS_ILOCK_SHARED)) {
3767                         if (xfs_ipincount(ip) || !xfs_iflock_nowait(ip)) {
3768                                 xfs_iunlock(ip, XFS_ILOCK_SHARED);
3769                                 return EAGAIN;
3770                         }
3771                 } else {
3772                         return EAGAIN;
3773                 }
3774
3775                 if (flags & FLUSH_SYNC)
3776                         flush_flags = XFS_IFLUSH_SYNC;
3777                 else
3778                         flush_flags = XFS_IFLUSH_ASYNC;
3779
3780                 error = xfs_iflush(ip, flush_flags);
3781                 xfs_iunlock(ip, XFS_ILOCK_SHARED);
3782         }
3783
3784         return error;
3785 }
3786
3787 int
3788 xfs_set_dmattrs (
3789         bhv_desc_t      *bdp,
3790         u_int           evmask,
3791         u_int16_t       state,
3792         cred_t          *credp)
3793 {
3794         xfs_inode_t     *ip;
3795         xfs_trans_t     *tp;
3796         xfs_mount_t     *mp;
3797         int             error;
3798
3799         if (!capable(CAP_SYS_ADMIN))
3800                 return XFS_ERROR(EPERM);
3801
3802         ip = XFS_BHVTOI(bdp);
3803         mp = ip->i_mount;
3804
3805         if (XFS_FORCED_SHUTDOWN(mp))
3806                 return XFS_ERROR(EIO);
3807
3808         tp = xfs_trans_alloc(mp, XFS_TRANS_SET_DMATTRS);
3809         error = xfs_trans_reserve(tp, 0, XFS_ICHANGE_LOG_RES (mp), 0, 0, 0);
3810         if (error) {
3811                 xfs_trans_cancel(tp, 0);
3812                 return error;
3813         }
3814         xfs_ilock(ip, XFS_ILOCK_EXCL);
3815         xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
3816
3817         ip->i_iocore.io_dmevmask = ip->i_d.di_dmevmask = evmask;
3818         ip->i_iocore.io_dmstate  = ip->i_d.di_dmstate  = state;
3819
3820         xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
3821         IHOLD(ip);
3822         error = xfs_trans_commit(tp, 0);
3823
3824         return error;
3825 }
3826
3827 STATIC int
3828 xfs_reclaim(
3829         bhv_desc_t      *bdp)
3830 {
3831         xfs_inode_t     *ip;
3832         bhv_vnode_t     *vp;
3833
3834         vp = BHV_TO_VNODE(bdp);
3835         ip = XFS_BHVTOI(bdp);
3836
3837         vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address);
3838
3839         ASSERT(!VN_MAPPED(vp));
3840
3841         /* bad inode, get out here ASAP */
3842         if (VN_BAD(vp)) {
3843                 xfs_ireclaim(ip);
3844                 return 0;
3845         }
3846
3847         vn_iowait(vp);
3848
3849         ASSERT(XFS_FORCED_SHUTDOWN(ip->i_mount) || ip->i_delayed_blks == 0);
3850
3851         /*
3852          * Make sure the atime in the XFS inode is correct before freeing the
3853          * Linux inode.
3854          */
3855         xfs_synchronize_atime(ip);
3856
3857         /*
3858          * If we have nothing to flush with this inode then complete the
3859          * teardown now, otherwise break the link between the xfs inode and the
3860          * linux inode and clean up the xfs inode later. This avoids flushing
3861          * the inode to disk during the delete operation itself.
3862          *
3863          * When breaking the link, we need to set the XFS_IRECLAIMABLE flag
3864          * first to ensure that xfs_iunpin() will never see an xfs inode
3865          * that has a linux inode being reclaimed. Synchronisation is provided
3866          * by the i_flags_lock.
3867          */
3868         if (!ip->i_update_core && (ip->i_itemp == NULL)) {
3869                 xfs_ilock(ip, XFS_ILOCK_EXCL);
3870                 xfs_iflock(ip);
3871                 return xfs_finish_reclaim(ip, 1, XFS_IFLUSH_DELWRI_ELSE_SYNC);
3872         } else {
3873                 xfs_mount_t     *mp = ip->i_mount;
3874
3875                 /* Protect sync and unpin from us */
3876                 XFS_MOUNT_ILOCK(mp);
3877                 spin_lock(&ip->i_flags_lock);
3878                 __xfs_iflags_set(ip, XFS_IRECLAIMABLE);
3879                 vn_bhv_remove(VN_BHV_HEAD(vp), XFS_ITOBHV(ip));
3880                 spin_unlock(&ip->i_flags_lock);
3881                 list_add_tail(&ip->i_reclaim, &mp->m_del_inodes);
3882                 XFS_MOUNT_IUNLOCK(mp);
3883         }
3884         return 0;
3885 }
3886
3887 int
3888 xfs_finish_reclaim(
3889         xfs_inode_t     *ip,
3890         int             locked,
3891         int             sync_mode)
3892 {
3893         xfs_ihash_t     *ih = ip->i_hash;
3894         bhv_vnode_t     *vp = XFS_ITOV_NULL(ip);
3895         int             error;
3896
3897         if (vp && VN_BAD(vp))
3898                 goto reclaim;
3899
3900         /* The hash lock here protects a thread in xfs_iget_core from
3901          * racing with us on linking the inode back with a vnode.
3902          * Once we have the XFS_IRECLAIM flag set it will not touch
3903          * us.
3904          */
3905         write_lock(&ih->ih_lock);
3906         spin_lock(&ip->i_flags_lock);
3907         if (__xfs_iflags_test(ip, XFS_IRECLAIM) ||
3908             (!__xfs_iflags_test(ip, XFS_IRECLAIMABLE) && vp == NULL)) {
3909                 spin_unlock(&ip->i_flags_lock);
3910                 write_unlock(&ih->ih_lock);
3911                 if (locked) {
3912                         xfs_ifunlock(ip);
3913                         xfs_iunlock(ip, XFS_ILOCK_EXCL);
3914                 }
3915                 return 1;
3916         }
3917         __xfs_iflags_set(ip, XFS_IRECLAIM);
3918         spin_unlock(&ip->i_flags_lock);
3919         write_unlock(&ih->ih_lock);
3920
3921         /*
3922          * If the inode is still dirty, then flush it out.  If the inode
3923          * is not in the AIL, then it will be OK to flush it delwri as
3924          * long as xfs_iflush() does not keep any references to the inode.
3925          * We leave that decision up to xfs_iflush() since it has the
3926          * knowledge of whether it's OK to simply do a delwri flush of
3927          * the inode or whether we need to wait until the inode is
3928          * pulled from the AIL.
3929          * We get the flush lock regardless, though, just to make sure
3930          * we don't free it while it is being flushed.
3931          */
3932         if (!XFS_FORCED_SHUTDOWN(ip->i_mount)) {
3933                 if (!locked) {
3934                         xfs_ilock(ip, XFS_ILOCK_EXCL);
3935                         xfs_iflock(ip);
3936                 }
3937
3938                 if (ip->i_update_core ||
3939                     ((ip->i_itemp != NULL) &&
3940                      (ip->i_itemp->ili_format.ilf_fields != 0))) {
3941                         error = xfs_iflush(ip, sync_mode);
3942                         /*
3943                          * If we hit an error, typically because of filesystem
3944                          * shutdown, we don't need to let vn_reclaim to know
3945                          * because we're gonna reclaim the inode anyway.
3946                          */
3947                         if (error) {
3948                                 xfs_iunlock(ip, XFS_ILOCK_EXCL);
3949                                 goto reclaim;
3950                         }
3951                         xfs_iflock(ip); /* synchronize with xfs_iflush_done */
3952                 }
3953
3954                 ASSERT(ip->i_update_core == 0);
3955                 ASSERT(ip->i_itemp == NULL ||
3956                        ip->i_itemp->ili_format.ilf_fields == 0);
3957                 xfs_iunlock(ip, XFS_ILOCK_EXCL);
3958         } else if (locked) {
3959                 /*
3960                  * We are not interested in doing an iflush if we're
3961                  * in the process of shutting down the filesystem forcibly.
3962                  * So, just reclaim the inode.
3963                  */
3964                 xfs_ifunlock(ip);
3965                 xfs_iunlock(ip, XFS_ILOCK_EXCL);
3966         }
3967
3968  reclaim:
3969         xfs_ireclaim(ip);
3970         return 0;
3971 }
3972
3973 int
3974 xfs_finish_reclaim_all(xfs_mount_t *mp, int noblock)
3975 {
3976         int             purged;
3977         xfs_inode_t     *ip, *n;
3978         int             done = 0;
3979
3980         while (!done) {
3981                 purged = 0;
3982                 XFS_MOUNT_ILOCK(mp);
3983                 list_for_each_entry_safe(ip, n, &mp->m_del_inodes, i_reclaim) {
3984                         if (noblock) {
3985                                 if (xfs_ilock_nowait(ip, XFS_ILOCK_EXCL) == 0)
3986                                         continue;
3987                                 if (xfs_ipincount(ip) ||
3988                                     !xfs_iflock_nowait(ip)) {
3989                                         xfs_iunlock(ip, XFS_ILOCK_EXCL);
3990                                         continue;
3991                                 }
3992                         }
3993                         XFS_MOUNT_IUNLOCK(mp);
3994                         if (xfs_finish_reclaim(ip, noblock,
3995                                         XFS_IFLUSH_DELWRI_ELSE_ASYNC))
3996                                 delay(1);
3997                         purged = 1;
3998                         break;
3999                 }
4000
4001                 done = !purged;
4002         }
4003
4004         XFS_MOUNT_IUNLOCK(mp);
4005         return 0;
4006 }
4007
4008 /*
4009  * xfs_alloc_file_space()
4010  *      This routine allocates disk space for the given file.
4011  *
4012  *      If alloc_type == 0, this request is for an ALLOCSP type
4013  *      request which will change the file size.  In this case, no
4014  *      DMAPI event will be generated by the call.  A TRUNCATE event
4015  *      will be generated later by xfs_setattr.
4016  *
4017  *      If alloc_type != 0, this request is for a RESVSP type
4018  *      request, and a DMAPI DM_EVENT_WRITE will be generated if the
4019  *      lower block boundary byte address is less than the file's
4020  *      length.
4021  *
4022  * RETURNS:
4023  *       0 on success
4024  *      errno on error
4025  *
4026  */
4027 STATIC int
4028 xfs_alloc_file_space(
4029         xfs_inode_t             *ip,
4030         xfs_off_t               offset,
4031         xfs_off_t               len,
4032         int                     alloc_type,
4033         int                     attr_flags)
4034 {
4035         xfs_mount_t             *mp = ip->i_mount;
4036         xfs_off_t               count;
4037         xfs_filblks_t           allocated_fsb;
4038         xfs_filblks_t           allocatesize_fsb;
4039         xfs_extlen_t            extsz, temp;
4040         xfs_fileoff_t           startoffset_fsb;
4041         xfs_fsblock_t           firstfsb;
4042         int                     nimaps;
4043         int                     bmapi_flag;
4044         int                     quota_flag;
4045         int                     rt;
4046         xfs_trans_t             *tp;
4047         xfs_bmbt_irec_t         imaps[1], *imapp;
4048         xfs_bmap_free_t         free_list;
4049         uint                    qblocks, resblks, resrtextents;
4050         int                     committed;
4051         int                     error;
4052
4053         vn_trace_entry(XFS_ITOV(ip), __FUNCTION__, (inst_t *)__return_address);
4054
4055         if (XFS_FORCED_SHUTDOWN(mp))
4056                 return XFS_ERROR(EIO);
4057
4058         rt = XFS_IS_REALTIME_INODE(ip);
4059         if (unlikely(rt)) {
4060                 if (!(extsz = ip->i_d.di_extsize))
4061                         extsz = mp->m_sb.sb_rextsize;
4062         } else {
4063                 extsz = ip->i_d.di_extsize;
4064         }
4065
4066         if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
4067                 return error;
4068
4069         if (len <= 0)
4070                 return XFS_ERROR(EINVAL);
4071
4072         count = len;
4073         error = 0;
4074         imapp = &imaps[0];
4075         nimaps = 1;
4076         bmapi_flag = XFS_BMAPI_WRITE | (alloc_type ? XFS_BMAPI_PREALLOC : 0);
4077         startoffset_fsb = XFS_B_TO_FSBT(mp, offset);
4078         allocatesize_fsb = XFS_B_TO_FSB(mp, count);
4079
4080         /*      Generate a DMAPI event if needed.       */
4081         if (alloc_type != 0 && offset < ip->i_size &&
4082                         (attr_flags&ATTR_DMI) == 0  &&
4083                         DM_EVENT_ENABLED(XFS_MTOVFS(mp), ip, DM_EVENT_WRITE)) {
4084                 xfs_off_t           end_dmi_offset;
4085
4086                 end_dmi_offset = offset+len;
4087                 if (end_dmi_offset > ip->i_size)
4088                         end_dmi_offset = ip->i_size;
4089                 error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, XFS_ITOV(ip),
4090                         offset, end_dmi_offset - offset,
4091                         0, NULL);
4092                 if (error)
4093                         return error;
4094         }
4095
4096         /*
4097          * Allocate file space until done or until there is an error
4098          */
4099 retry:
4100         while (allocatesize_fsb && !error) {
4101                 xfs_fileoff_t   s, e;
4102
4103                 /*
4104                  * Determine space reservations for data/realtime.
4105                  */
4106                 if (unlikely(extsz)) {
4107                         s = startoffset_fsb;
4108                         do_div(s, extsz);
4109                         s *= extsz;
4110                         e = startoffset_fsb + allocatesize_fsb;
4111                         if ((temp = do_mod(startoffset_fsb, extsz)))
4112                                 e += temp;
4113                         if ((temp = do_mod(e, extsz)))
4114                                 e += extsz - temp;
4115                 } else {
4116                         s = 0;
4117                         e = allocatesize_fsb;
4118                 }
4119
4120                 if (unlikely(rt)) {
4121                         resrtextents = qblocks = (uint)(e - s);
4122                         resrtextents /= mp->m_sb.sb_rextsize;
4123                         resblks = XFS_DIOSTRAT_SPACE_RES(mp, 0);
4124                         quota_flag = XFS_QMOPT_RES_RTBLKS;
4125                 } else {
4126                         resrtextents = 0;
4127                         resblks = qblocks = \
4128                                 XFS_DIOSTRAT_SPACE_RES(mp, (uint)(e - s));
4129                         quota_flag = XFS_QMOPT_RES_REGBLKS;
4130                 }
4131
4132                 /*
4133                  * Allocate and setup the transaction.
4134                  */
4135                 tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT);
4136                 error = xfs_trans_reserve(tp, resblks,
4137                                           XFS_WRITE_LOG_RES(mp), resrtextents,
4138                                           XFS_TRANS_PERM_LOG_RES,
4139                                           XFS_WRITE_LOG_COUNT);
4140                 /*
4141                  * Check for running out of space
4142                  */
4143                 if (error) {
4144                         /*
4145                          * Free the transaction structure.
4146                          */
4147                         ASSERT(error == ENOSPC || XFS_FORCED_SHUTDOWN(mp));
4148                         xfs_trans_cancel(tp, 0);
4149                         break;
4150                 }
4151                 xfs_ilock(ip, XFS_ILOCK_EXCL);
4152                 error = XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip,
4153                                                       qblocks, 0, quota_flag);
4154                 if (error)
4155                         goto error1;
4156
4157                 xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
4158                 xfs_trans_ihold(tp, ip);
4159
4160                 /*
4161                  * Issue the xfs_bmapi() call to allocate the blocks
4162                  */
4163                 XFS_BMAP_INIT(&free_list, &firstfsb);
4164                 error = XFS_BMAPI(mp, tp, &ip->i_iocore, startoffset_fsb,
4165                                   allocatesize_fsb, bmapi_flag,
4166                                   &firstfsb, 0, imapp, &nimaps,
4167                                   &free_list, NULL);
4168                 if (error) {
4169                         goto error0;
4170                 }
4171
4172                 /*
4173                  * Complete the transaction
4174                  */
4175                 error = xfs_bmap_finish(&tp, &free_list, &committed);
4176                 if (error) {
4177                         goto error0;
4178                 }
4179
4180                 error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES);
4181                 xfs_iunlock(ip, XFS_ILOCK_EXCL);
4182                 if (error) {
4183                         break;
4184                 }
4185
4186                 allocated_fsb = imapp->br_blockcount;
4187
4188                 if (nimaps == 0) {
4189                         error = XFS_ERROR(ENOSPC);
4190                         break;
4191                 }
4192
4193                 startoffset_fsb += allocated_fsb;
4194                 allocatesize_fsb -= allocated_fsb;
4195         }
4196 dmapi_enospc_check:
4197         if (error == ENOSPC && (attr_flags&ATTR_DMI) == 0 &&
4198             DM_EVENT_ENABLED(XFS_MTOVFS(mp), ip, DM_EVENT_NOSPACE)) {
4199
4200                 error = XFS_SEND_NAMESP(mp, DM_EVENT_NOSPACE,
4201                                 XFS_ITOV(ip), DM_RIGHT_NULL,
4202                                 XFS_ITOV(ip), DM_RIGHT_NULL,
4203                                 NULL, NULL, 0, 0, 0); /* Delay flag intentionally unused */
4204                 if (error == 0)
4205                         goto retry;     /* Maybe DMAPI app. has made space */
4206                 /* else fall through with error from XFS_SEND_DATA */
4207         }
4208
4209         return error;
4210
4211 error0: /* Cancel bmap, unlock inode, unreserve quota blocks, cancel trans */
4212         xfs_bmap_cancel(&free_list);
4213         XFS_TRANS_UNRESERVE_QUOTA_NBLKS(mp, tp, ip, qblocks, 0, quota_flag);
4214
4215 error1: /* Just cancel transaction */
4216         xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT);
4217         xfs_iunlock(ip, XFS_ILOCK_EXCL);
4218         goto dmapi_enospc_check;
4219 }
4220
4221 /*
4222  * Zero file bytes between startoff and endoff inclusive.
4223  * The iolock is held exclusive and no blocks are buffered.
4224  */
4225 STATIC int
4226 xfs_zero_remaining_bytes(
4227         xfs_inode_t             *ip,
4228         xfs_off_t               startoff,
4229         xfs_off_t               endoff)
4230 {
4231         xfs_bmbt_irec_t         imap;
4232         xfs_fileoff_t           offset_fsb;
4233         xfs_off_t               lastoffset;
4234         xfs_off_t               offset;
4235         xfs_buf_t               *bp;
4236         xfs_mount_t             *mp = ip->i_mount;
4237         int                     nimap;
4238         int                     error = 0;
4239
4240         bp = xfs_buf_get_noaddr(mp->m_sb.sb_blocksize,
4241                                 ip->i_d.di_flags & XFS_DIFLAG_REALTIME ?
4242                                 mp->m_rtdev_targp : mp->m_ddev_targp);
4243
4244         for (offset = startoff; offset <= endoff; offset = lastoffset + 1) {
4245                 offset_fsb = XFS_B_TO_FSBT(mp, offset);
4246                 nimap = 1;
4247                 error = XFS_BMAPI(mp, NULL, &ip->i_iocore, offset_fsb, 1, 0,
4248                         NULL, 0, &imap, &nimap, NULL, NULL);
4249                 if (error || nimap < 1)
4250                         break;
4251                 ASSERT(imap.br_blockcount >= 1);
4252                 ASSERT(imap.br_startoff == offset_fsb);
4253                 lastoffset = XFS_FSB_TO_B(mp, imap.br_startoff + 1) - 1;
4254                 if (lastoffset > endoff)
4255                         lastoffset = endoff;
4256                 if (imap.br_startblock == HOLESTARTBLOCK)
4257                         continue;
4258                 ASSERT(imap.br_startblock != DELAYSTARTBLOCK);
4259                 if (imap.br_state == XFS_EXT_UNWRITTEN)
4260                         continue;
4261                 XFS_BUF_UNDONE(bp);
4262                 XFS_BUF_UNWRITE(bp);
4263                 XFS_BUF_READ(bp);
4264                 XFS_BUF_SET_ADDR(bp, XFS_FSB_TO_DB(ip, imap.br_startblock));
4265                 xfsbdstrat(mp, bp);
4266                 if ((error = xfs_iowait(bp))) {
4267                         xfs_ioerror_alert("xfs_zero_remaining_bytes(read)",
4268                                           mp, bp, XFS_BUF_ADDR(bp));
4269                         break;
4270                 }
4271                 memset(XFS_BUF_PTR(bp) +
4272                         (offset - XFS_FSB_TO_B(mp, imap.br_startoff)),
4273                       0, lastoffset - offset + 1);
4274                 XFS_BUF_UNDONE(bp);
4275                 XFS_BUF_UNREAD(bp);
4276                 XFS_BUF_WRITE(bp);
4277                 xfsbdstrat(mp, bp);
4278                 if ((error = xfs_iowait(bp))) {
4279                         xfs_ioerror_alert("xfs_zero_remaining_bytes(write)",
4280                                           mp, bp, XFS_BUF_ADDR(bp));
4281                         break;
4282                 }
4283         }
4284         xfs_buf_free(bp);
4285         return error;
4286 }
4287
4288 /*
4289  * xfs_free_file_space()
4290  *      This routine frees disk space for the given file.
4291  *
4292  *      This routine is only called by xfs_change_file_space
4293  *      for an UNRESVSP type call.
4294  *
4295  * RETURNS:
4296  *       0 on success
4297  *      errno on error
4298  *
4299  */
4300 STATIC int
4301 xfs_free_file_space(
4302         xfs_inode_t             *ip,
4303         xfs_off_t               offset,
4304         xfs_off_t               len,
4305         int                     attr_flags)
4306 {
4307         bhv_vnode_t             *vp;
4308         int                     committed;
4309         int                     done;
4310         xfs_off_t               end_dmi_offset;
4311         xfs_fileoff_t           endoffset_fsb;
4312         int                     error;
4313         xfs_fsblock_t           firstfsb;
4314         xfs_bmap_free_t         free_list;
4315         xfs_bmbt_irec_t         imap;
4316         xfs_off_t               ioffset;
4317         xfs_extlen_t            mod=0;
4318         xfs_mount_t             *mp;
4319         int                     nimap;
4320         uint                    resblks;
4321         uint                    rounding;
4322         int                     rt;
4323         xfs_fileoff_t           startoffset_fsb;
4324         xfs_trans_t             *tp;
4325         int                     need_iolock = 1;
4326
4327         vp = XFS_ITOV(ip);
4328         mp = ip->i_mount;
4329
4330         vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address);
4331
4332         if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
4333                 return error;
4334
4335         error = 0;
4336         if (len <= 0)   /* if nothing being freed */
4337                 return error;
4338         rt = (ip->i_d.di_flags & XFS_DIFLAG_REALTIME);
4339         startoffset_fsb = XFS_B_TO_FSB(mp, offset);
4340         end_dmi_offset = offset + len;
4341         endoffset_fsb = XFS_B_TO_FSBT(mp, end_dmi_offset);
4342
4343         if (offset < ip->i_size &&
4344             (attr_flags & ATTR_DMI) == 0 &&
4345             DM_EVENT_ENABLED(XFS_MTOVFS(mp), ip, DM_EVENT_WRITE)) {
4346                 if (end_dmi_offset > ip->i_size)
4347                         end_dmi_offset = ip->i_size;
4348                 error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, vp,
4349                                 offset, end_dmi_offset - offset,
4350                                 AT_DELAY_FLAG(attr_flags), NULL);
4351                 if (error)
4352                         return error;
4353         }
4354
4355         if (attr_flags & ATTR_NOLOCK)
4356                 need_iolock = 0;
4357         if (need_iolock) {
4358                 xfs_ilock(ip, XFS_IOLOCK_EXCL);
4359                 vn_iowait(vp);  /* wait for the completion of any pending DIOs */
4360         }
4361
4362         rounding = max_t(uint, 1 << mp->m_sb.sb_blocklog, NBPP);
4363         ioffset = offset & ~(rounding - 1);
4364
4365         if (VN_CACHED(vp) != 0) {
4366                 xfs_inval_cached_trace(&ip->i_iocore, ioffset, -1,
4367                                 ctooff(offtoct(ioffset)), -1);
4368                 error = bhv_vop_flushinval_pages(vp, ctooff(offtoct(ioffset)),
4369                                 -1, FI_REMAPF_LOCKED);
4370                 if (error)
4371                         goto out_unlock_iolock;
4372         }
4373
4374         /*
4375          * Need to zero the stuff we're not freeing, on disk.
4376          * If its a realtime file & can't use unwritten extents then we
4377          * actually need to zero the extent edges.  Otherwise xfs_bunmapi
4378          * will take care of it for us.
4379          */
4380         if (rt && !XFS_SB_VERSION_HASEXTFLGBIT(&mp->m_sb)) {
4381                 nimap = 1;
4382                 error = XFS_BMAPI(mp, NULL, &ip->i_iocore, startoffset_fsb,
4383                         1, 0, NULL, 0, &imap, &nimap, NULL, NULL);
4384                 if (error)
4385                         goto out_unlock_iolock;
4386                 ASSERT(nimap == 0 || nimap == 1);
4387                 if (nimap && imap.br_startblock != HOLESTARTBLOCK) {
4388                         xfs_daddr_t     block;
4389
4390                         ASSERT(imap.br_startblock != DELAYSTARTBLOCK);
4391                         block = imap.br_startblock;
4392                         mod = do_div(block, mp->m_sb.sb_rextsize);
4393                         if (mod)
4394                                 startoffset_fsb += mp->m_sb.sb_rextsize - mod;
4395                 }
4396                 nimap = 1;
4397                 error = XFS_BMAPI(mp, NULL, &ip->i_iocore, endoffset_fsb - 1,
4398                         1, 0, NULL, 0, &imap, &nimap, NULL, NULL);
4399                 if (error)
4400                         goto out_unlock_iolock;
4401                 ASSERT(nimap == 0 || nimap == 1);
4402                 if (nimap && imap.br_startblock != HOLESTARTBLOCK) {
4403                         ASSERT(imap.br_startblock != DELAYSTARTBLOCK);
4404                         mod++;
4405                         if (mod && (mod != mp->m_sb.sb_rextsize))
4406                                 endoffset_fsb -= mod;
4407                 }
4408         }
4409         if ((done = (endoffset_fsb <= startoffset_fsb)))
4410                 /*
4411                  * One contiguous piece to clear
4412                  */
4413                 error = xfs_zero_remaining_bytes(ip, offset, offset + len - 1);
4414         else {
4415                 /*
4416                  * Some full blocks, possibly two pieces to clear
4417                  */
4418                 if (offset < XFS_FSB_TO_B(mp, startoffset_fsb))
4419                         error = xfs_zero_remaining_bytes(ip, offset,
4420                                 XFS_FSB_TO_B(mp, startoffset_fsb) - 1);
4421                 if (!error &&
4422                     XFS_FSB_TO_B(mp, endoffset_fsb) < offset + len)
4423                         error = xfs_zero_remaining_bytes(ip,
4424                                 XFS_FSB_TO_B(mp, endoffset_fsb),
4425                                 offset + len - 1);
4426         }
4427
4428         /*
4429          * free file space until done or until there is an error
4430          */
4431         resblks = XFS_DIOSTRAT_SPACE_RES(mp, 0);
4432         while (!error && !done) {
4433
4434                 /*
4435                  * allocate and setup the transaction
4436                  */
4437                 tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT);
4438                 error = xfs_trans_reserve(tp,
4439                                           resblks,
4440                                           XFS_WRITE_LOG_RES(mp),
4441                                           0,
4442                                           XFS_TRANS_PERM_LOG_RES,
4443                                           XFS_WRITE_LOG_COUNT);
4444
4445                 /*
4446                  * check for running out of space
4447                  */
4448                 if (error) {
4449                         /*
4450                          * Free the transaction structure.
4451                          */
4452                         ASSERT(error == ENOSPC || XFS_FORCED_SHUTDOWN(mp));
4453                         xfs_trans_cancel(tp, 0);
4454                         break;
4455                 }
4456                 xfs_ilock(ip, XFS_ILOCK_EXCL);
4457                 error = XFS_TRANS_RESERVE_QUOTA(mp, tp,
4458                                 ip->i_udquot, ip->i_gdquot, resblks, 0,
4459                                 XFS_QMOPT_RES_REGBLKS);
4460                 if (error)
4461                         goto error1;
4462
4463                 xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
4464                 xfs_trans_ihold(tp, ip);
4465
4466                 /*
4467                  * issue the bunmapi() call to free the blocks
4468                  */
4469                 XFS_BMAP_INIT(&free_list, &firstfsb);
4470                 error = XFS_BUNMAPI(mp, tp, &ip->i_iocore, startoffset_fsb,
4471                                   endoffset_fsb - startoffset_fsb,
4472                                   0, 2, &firstfsb, &free_list, NULL, &done);
4473                 if (error) {
4474                         goto error0;
4475                 }
4476
4477                 /*
4478                  * complete the transaction
4479                  */
4480                 error = xfs_bmap_finish(&tp, &free_list, &committed);
4481                 if (error) {
4482                         goto error0;
4483                 }
4484
4485                 error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES);
4486                 xfs_iunlock(ip, XFS_ILOCK_EXCL);
4487         }
4488
4489  out_unlock_iolock:
4490         if (need_iolock)
4491                 xfs_iunlock(ip, XFS_IOLOCK_EXCL);
4492         return error;
4493
4494  error0:
4495         xfs_bmap_cancel(&free_list);
4496  error1:
4497         xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT);
4498         xfs_iunlock(ip, need_iolock ? (XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL) :
4499                     XFS_ILOCK_EXCL);
4500         return error;
4501 }
4502
4503 /*
4504  * xfs_change_file_space()
4505  *      This routine allocates or frees disk space for the given file.
4506  *      The user specified parameters are checked for alignment and size
4507  *      limitations.
4508  *
4509  * RETURNS:
4510  *       0 on success
4511  *      errno on error
4512  *
4513  */
4514 int
4515 xfs_change_file_space(
4516         bhv_desc_t      *bdp,
4517         int             cmd,
4518         xfs_flock64_t   *bf,
4519         xfs_off_t       offset,
4520         cred_t          *credp,
4521         int             attr_flags)
4522 {
4523         int             clrprealloc;
4524         int             error;
4525         xfs_fsize_t     fsize;
4526         xfs_inode_t     *ip;
4527         xfs_mount_t     *mp;
4528         int             setprealloc;
4529         xfs_off_t       startoffset;
4530         xfs_off_t       llen;
4531         xfs_trans_t     *tp;
4532         bhv_vattr_t     va;
4533         bhv_vnode_t     *vp;
4534
4535         vp = BHV_TO_VNODE(bdp);
4536         vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address);
4537
4538         ip = XFS_BHVTOI(bdp);
4539         mp = ip->i_mount;
4540
4541         /*
4542          * must be a regular file and have write permission
4543          */
4544         if (!VN_ISREG(vp))
4545                 return XFS_ERROR(EINVAL);
4546
4547         xfs_ilock(ip, XFS_ILOCK_SHARED);
4548
4549         if ((error = xfs_iaccess(ip, S_IWUSR, credp))) {
4550                 xfs_iunlock(ip, XFS_ILOCK_SHARED);
4551                 return error;
4552         }
4553
4554         xfs_iunlock(ip, XFS_ILOCK_SHARED);
4555
4556         switch (bf->l_whence) {
4557         case 0: /*SEEK_SET*/
4558                 break;
4559         case 1: /*SEEK_CUR*/
4560                 bf->l_start += offset;
4561                 break;
4562         case 2: /*SEEK_END*/
4563                 bf->l_start += ip->i_size;
4564                 break;
4565         default:
4566                 return XFS_ERROR(EINVAL);
4567         }
4568
4569         llen = bf->l_len > 0 ? bf->l_len - 1 : bf->l_len;
4570
4571         if (   (bf->l_start < 0)
4572             || (bf->l_start > XFS_MAXIOFFSET(mp))
4573             || (bf->l_start + llen < 0)
4574             || (bf->l_start + llen > XFS_MAXIOFFSET(mp)))
4575                 return XFS_ERROR(EINVAL);
4576
4577         bf->l_whence = 0;
4578
4579         startoffset = bf->l_start;
4580         fsize = ip->i_size;
4581
4582         /*
4583          * XFS_IOC_RESVSP and XFS_IOC_UNRESVSP will reserve or unreserve
4584          * file space.
4585          * These calls do NOT zero the data space allocated to the file,
4586          * nor do they change the file size.
4587          *
4588          * XFS_IOC_ALLOCSP and XFS_IOC_FREESP will allocate and free file
4589          * space.
4590          * These calls cause the new file data to be zeroed and the file
4591          * size to be changed.
4592          */
4593         setprealloc = clrprealloc = 0;
4594
4595         switch (cmd) {
4596         case XFS_IOC_RESVSP:
4597         case XFS_IOC_RESVSP64:
4598                 error = xfs_alloc_file_space(ip, startoffset, bf->l_len,
4599                                                                 1, attr_flags);
4600                 if (error)
4601                         return error;
4602                 setprealloc = 1;
4603                 break;
4604
4605         case XFS_IOC_UNRESVSP:
4606         case XFS_IOC_UNRESVSP64:
4607                 if ((error = xfs_free_file_space(ip, startoffset, bf->l_len,
4608                                                                 attr_flags)))
4609                         return error;
4610                 break;
4611
4612         case XFS_IOC_ALLOCSP:
4613         case XFS_IOC_ALLOCSP64:
4614         case XFS_IOC_FREESP:
4615         case XFS_IOC_FREESP64:
4616                 if (startoffset > fsize) {
4617                         error = xfs_alloc_file_space(ip, fsize,
4618                                         startoffset - fsize, 0, attr_flags);
4619                         if (error)
4620                                 break;
4621                 }
4622
4623                 va.va_mask = XFS_AT_SIZE;
4624                 va.va_size = startoffset;
4625
4626                 error = xfs_setattr(bdp, &va, attr_flags, credp);
4627
4628                 if (error)
4629                         return error;
4630
4631                 clrprealloc = 1;
4632                 break;
4633
4634         default:
4635                 ASSERT(0);
4636                 return XFS_ERROR(EINVAL);
4637         }
4638
4639         /*
4640          * update the inode timestamp, mode, and prealloc flag bits
4641          */
4642         tp = xfs_trans_alloc(mp, XFS_TRANS_WRITEID);
4643
4644         if ((error = xfs_trans_reserve(tp, 0, XFS_WRITEID_LOG_RES(mp),
4645                                       0, 0, 0))) {
4646                 /* ASSERT(0); */
4647                 xfs_trans_cancel(tp, 0);
4648                 return error;
4649         }
4650
4651         xfs_ilock(ip, XFS_ILOCK_EXCL);
4652
4653         xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
4654         xfs_trans_ihold(tp, ip);
4655
4656         if ((attr_flags & ATTR_DMI) == 0) {
4657                 ip->i_d.di_mode &= ~S_ISUID;
4658
4659                 /*
4660                  * Note that we don't have to worry about mandatory
4661                  * file locking being disabled here because we only
4662                  * clear the S_ISGID bit if the Group execute bit is
4663                  * on, but if it was on then mandatory locking wouldn't
4664                  * have been enabled.
4665                  */
4666                 if (ip->i_d.di_mode & S_IXGRP)
4667                         ip->i_d.di_mode &= ~S_ISGID;
4668
4669                 xfs_ichgtime(ip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
4670         }
4671         if (setprealloc)
4672                 ip->i_d.di_flags |= XFS_DIFLAG_PREALLOC;
4673         else if (clrprealloc)
4674                 ip->i_d.di_flags &= ~XFS_DIFLAG_PREALLOC;
4675
4676         xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
4677         xfs_trans_set_sync(tp);
4678
4679         error = xfs_trans_commit(tp, 0);
4680
4681         xfs_iunlock(ip, XFS_ILOCK_EXCL);
4682
4683         return error;
4684 }
4685
4686 bhv_vnodeops_t xfs_vnodeops = {
4687         BHV_IDENTITY_INIT(VN_BHV_XFS,VNODE_POSITION_XFS),
4688         .vop_open               = xfs_open,
4689         .vop_close              = xfs_close,
4690         .vop_read               = xfs_read,
4691 #ifdef HAVE_SPLICE
4692         .vop_splice_read        = xfs_splice_read,
4693         .vop_splice_write       = xfs_splice_write,
4694 #endif
4695         .vop_write              = xfs_write,
4696         .vop_ioctl              = xfs_ioctl,
4697         .vop_getattr            = xfs_getattr,
4698         .vop_setattr            = xfs_setattr,
4699         .vop_access             = xfs_access,
4700         .vop_lookup             = xfs_lookup,
4701         .vop_create             = xfs_create,
4702         .vop_remove             = xfs_remove,
4703         .vop_link               = xfs_link,
4704         .vop_rename             = xfs_rename,
4705         .vop_mkdir              = xfs_mkdir,
4706         .vop_rmdir              = xfs_rmdir,
4707         .vop_readdir            = xfs_readdir,
4708         .vop_symlink            = xfs_symlink,
4709         .vop_readlink           = xfs_readlink,
4710         .vop_fsync              = xfs_fsync,
4711         .vop_inactive           = xfs_inactive,
4712         .vop_fid2               = xfs_fid2,
4713         .vop_rwlock             = xfs_rwlock,
4714         .vop_rwunlock           = xfs_rwunlock,
4715         .vop_bmap               = xfs_bmap,
4716         .vop_reclaim            = xfs_reclaim,
4717         .vop_attr_get           = xfs_attr_get,
4718         .vop_attr_set           = xfs_attr_set,
4719         .vop_attr_remove        = xfs_attr_remove,
4720         .vop_attr_list          = xfs_attr_list,
4721         .vop_link_removed       = (vop_link_removed_t)fs_noval,
4722         .vop_vnode_change       = (vop_vnode_change_t)fs_noval,
4723         .vop_tosspages          = fs_tosspages,
4724         .vop_flushinval_pages   = fs_flushinval_pages,
4725         .vop_flush_pages        = fs_flush_pages,
4726         .vop_release            = xfs_release,
4727         .vop_iflush             = xfs_inode_flush,
4728 };