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