diff options
author | David S. Miller <davem@davemloft.net> | 2010-01-23 01:45:46 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-01-23 01:45:46 -0500 |
commit | 6be325719b3e54624397e413efd4b33a997e55a3 (patch) | |
tree | 57f321a56794cab2222e179b16731e0d76a4a68a /fs/xfs/xfs_vnodeops.c | |
parent | 26d92f9276a56d55511a427fb70bd70886af647a (diff) | |
parent | 92dcffb916d309aa01778bf8963a6932e4014d07 (diff) |
Merge branch 'master' of /home/davem/src/GIT/linux-2.6/
Diffstat (limited to 'fs/xfs/xfs_vnodeops.c')
-rw-r--r-- | fs/xfs/xfs_vnodeops.c | 101 |
1 files changed, 40 insertions, 61 deletions
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 578f3f59b789..6f268756bf36 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c | |||
@@ -53,6 +53,7 @@ | |||
53 | #include "xfs_log_priv.h" | 53 | #include "xfs_log_priv.h" |
54 | #include "xfs_filestream.h" | 54 | #include "xfs_filestream.h" |
55 | #include "xfs_vnodeops.h" | 55 | #include "xfs_vnodeops.h" |
56 | #include "xfs_trace.h" | ||
56 | 57 | ||
57 | int | 58 | int |
58 | xfs_setattr( | 59 | xfs_setattr( |
@@ -69,7 +70,6 @@ xfs_setattr( | |||
69 | uint commit_flags=0; | 70 | uint commit_flags=0; |
70 | uid_t uid=0, iuid=0; | 71 | uid_t uid=0, iuid=0; |
71 | gid_t gid=0, igid=0; | 72 | gid_t gid=0, igid=0; |
72 | int timeflags = 0; | ||
73 | struct xfs_dquot *udqp, *gdqp, *olddquot1, *olddquot2; | 73 | struct xfs_dquot *udqp, *gdqp, *olddquot1, *olddquot2; |
74 | int need_iolock = 1; | 74 | int need_iolock = 1; |
75 | 75 | ||
@@ -134,16 +134,13 @@ xfs_setattr( | |||
134 | if (flags & XFS_ATTR_NOLOCK) | 134 | if (flags & XFS_ATTR_NOLOCK) |
135 | need_iolock = 0; | 135 | need_iolock = 0; |
136 | if (!(mask & ATTR_SIZE)) { | 136 | if (!(mask & ATTR_SIZE)) { |
137 | if ((mask != (ATTR_CTIME|ATTR_ATIME|ATTR_MTIME)) || | 137 | tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_NOT_SIZE); |
138 | (mp->m_flags & XFS_MOUNT_WSYNC)) { | 138 | commit_flags = 0; |
139 | tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_NOT_SIZE); | 139 | code = xfs_trans_reserve(tp, 0, XFS_ICHANGE_LOG_RES(mp), |
140 | commit_flags = 0; | 140 | 0, 0, 0); |
141 | if ((code = xfs_trans_reserve(tp, 0, | 141 | if (code) { |
142 | XFS_ICHANGE_LOG_RES(mp), 0, | 142 | lock_flags = 0; |
143 | 0, 0))) { | 143 | goto error_return; |
144 | lock_flags = 0; | ||
145 | goto error_return; | ||
146 | } | ||
147 | } | 144 | } |
148 | } else { | 145 | } else { |
149 | if (DM_EVENT_ENABLED(ip, DM_EVENT_TRUNCATE) && | 146 | if (DM_EVENT_ENABLED(ip, DM_EVENT_TRUNCATE) && |
@@ -294,15 +291,23 @@ xfs_setattr( | |||
294 | * or we are explicitly asked to change it. This handles | 291 | * or we are explicitly asked to change it. This handles |
295 | * the semantic difference between truncate() and ftruncate() | 292 | * the semantic difference between truncate() and ftruncate() |
296 | * as implemented in the VFS. | 293 | * as implemented in the VFS. |
294 | * | ||
295 | * The regular truncate() case without ATTR_CTIME and ATTR_MTIME | ||
296 | * is a special case where we need to update the times despite | ||
297 | * not having these flags set. For all other operations the | ||
298 | * VFS set these flags explicitly if it wants a timestamp | ||
299 | * update. | ||
297 | */ | 300 | */ |
298 | if (iattr->ia_size != ip->i_size || (mask & ATTR_CTIME)) | 301 | if (iattr->ia_size != ip->i_size && |
299 | timeflags |= XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG; | 302 | (!(mask & (ATTR_CTIME | ATTR_MTIME)))) { |
303 | iattr->ia_ctime = iattr->ia_mtime = | ||
304 | current_fs_time(inode->i_sb); | ||
305 | mask |= ATTR_CTIME | ATTR_MTIME; | ||
306 | } | ||
300 | 307 | ||
301 | if (iattr->ia_size > ip->i_size) { | 308 | if (iattr->ia_size > ip->i_size) { |
302 | ip->i_d.di_size = iattr->ia_size; | 309 | ip->i_d.di_size = iattr->ia_size; |
303 | ip->i_size = iattr->ia_size; | 310 | ip->i_size = iattr->ia_size; |
304 | if (!(flags & XFS_ATTR_DMI)) | ||
305 | xfs_ichgtime(ip, XFS_ICHGTIME_CHG); | ||
306 | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); | 311 | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); |
307 | } else if (iattr->ia_size <= ip->i_size || | 312 | } else if (iattr->ia_size <= ip->i_size || |
308 | (iattr->ia_size == 0 && ip->i_d.di_nextents)) { | 313 | (iattr->ia_size == 0 && ip->i_d.di_nextents)) { |
@@ -373,9 +378,6 @@ xfs_setattr( | |||
373 | ip->i_d.di_gid = gid; | 378 | ip->i_d.di_gid = gid; |
374 | inode->i_gid = gid; | 379 | inode->i_gid = gid; |
375 | } | 380 | } |
376 | |||
377 | xfs_trans_log_inode (tp, ip, XFS_ILOG_CORE); | ||
378 | timeflags |= XFS_ICHGTIME_CHG; | ||
379 | } | 381 | } |
380 | 382 | ||
381 | /* | 383 | /* |
@@ -392,51 +394,37 @@ xfs_setattr( | |||
392 | 394 | ||
393 | inode->i_mode &= S_IFMT; | 395 | inode->i_mode &= S_IFMT; |
394 | inode->i_mode |= mode & ~S_IFMT; | 396 | inode->i_mode |= mode & ~S_IFMT; |
395 | |||
396 | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); | ||
397 | timeflags |= XFS_ICHGTIME_CHG; | ||
398 | } | 397 | } |
399 | 398 | ||
400 | /* | 399 | /* |
401 | * Change file access or modified times. | 400 | * Change file access or modified times. |
402 | */ | 401 | */ |
403 | if (mask & (ATTR_ATIME|ATTR_MTIME)) { | 402 | if (mask & ATTR_ATIME) { |
404 | if (mask & ATTR_ATIME) { | 403 | inode->i_atime = iattr->ia_atime; |
405 | inode->i_atime = iattr->ia_atime; | 404 | ip->i_d.di_atime.t_sec = iattr->ia_atime.tv_sec; |
406 | ip->i_d.di_atime.t_sec = iattr->ia_atime.tv_sec; | 405 | ip->i_d.di_atime.t_nsec = iattr->ia_atime.tv_nsec; |
407 | ip->i_d.di_atime.t_nsec = iattr->ia_atime.tv_nsec; | 406 | ip->i_update_core = 1; |
408 | ip->i_update_core = 1; | ||
409 | } | ||
410 | if (mask & ATTR_MTIME) { | ||
411 | inode->i_mtime = iattr->ia_mtime; | ||
412 | ip->i_d.di_mtime.t_sec = iattr->ia_mtime.tv_sec; | ||
413 | ip->i_d.di_mtime.t_nsec = iattr->ia_mtime.tv_nsec; | ||
414 | timeflags &= ~XFS_ICHGTIME_MOD; | ||
415 | timeflags |= XFS_ICHGTIME_CHG; | ||
416 | } | ||
417 | if (tp && (mask & (ATTR_MTIME_SET|ATTR_ATIME_SET))) | ||
418 | xfs_trans_log_inode (tp, ip, XFS_ILOG_CORE); | ||
419 | } | 407 | } |
420 | 408 | if (mask & ATTR_CTIME) { | |
421 | /* | ||
422 | * Change file inode change time only if ATTR_CTIME set | ||
423 | * AND we have been called by a DMI function. | ||
424 | */ | ||
425 | |||
426 | if ((flags & XFS_ATTR_DMI) && (mask & ATTR_CTIME)) { | ||
427 | inode->i_ctime = iattr->ia_ctime; | 409 | inode->i_ctime = iattr->ia_ctime; |
428 | ip->i_d.di_ctime.t_sec = iattr->ia_ctime.tv_sec; | 410 | ip->i_d.di_ctime.t_sec = iattr->ia_ctime.tv_sec; |
429 | ip->i_d.di_ctime.t_nsec = iattr->ia_ctime.tv_nsec; | 411 | ip->i_d.di_ctime.t_nsec = iattr->ia_ctime.tv_nsec; |
430 | ip->i_update_core = 1; | 412 | ip->i_update_core = 1; |
431 | timeflags &= ~XFS_ICHGTIME_CHG; | 413 | } |
414 | if (mask & ATTR_MTIME) { | ||
415 | inode->i_mtime = iattr->ia_mtime; | ||
416 | ip->i_d.di_mtime.t_sec = iattr->ia_mtime.tv_sec; | ||
417 | ip->i_d.di_mtime.t_nsec = iattr->ia_mtime.tv_nsec; | ||
418 | ip->i_update_core = 1; | ||
432 | } | 419 | } |
433 | 420 | ||
434 | /* | 421 | /* |
435 | * Send out timestamp changes that need to be set to the | 422 | * And finally, log the inode core if any attribute in it |
436 | * current time. Not done when called by a DMI function. | 423 | * has been changed. |
437 | */ | 424 | */ |
438 | if (timeflags && !(flags & XFS_ATTR_DMI)) | 425 | if (mask & (ATTR_UID|ATTR_GID|ATTR_MODE| |
439 | xfs_ichgtime(ip, timeflags); | 426 | ATTR_ATIME|ATTR_CTIME|ATTR_MTIME)) |
427 | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); | ||
440 | 428 | ||
441 | XFS_STATS_INC(xs_ig_attrchg); | 429 | XFS_STATS_INC(xs_ig_attrchg); |
442 | 430 | ||
@@ -451,12 +439,10 @@ xfs_setattr( | |||
451 | * mix so this probably isn't worth the trouble to optimize. | 439 | * mix so this probably isn't worth the trouble to optimize. |
452 | */ | 440 | */ |
453 | code = 0; | 441 | code = 0; |
454 | if (tp) { | 442 | if (mp->m_flags & XFS_MOUNT_WSYNC) |
455 | if (mp->m_flags & XFS_MOUNT_WSYNC) | 443 | xfs_trans_set_sync(tp); |
456 | xfs_trans_set_sync(tp); | ||
457 | 444 | ||
458 | code = xfs_trans_commit(tp, commit_flags); | 445 | code = xfs_trans_commit(tp, commit_flags); |
459 | } | ||
460 | 446 | ||
461 | xfs_iunlock(ip, lock_flags); | 447 | xfs_iunlock(ip, lock_flags); |
462 | 448 | ||
@@ -1397,7 +1383,6 @@ xfs_lookup( | |||
1397 | if (error) | 1383 | if (error) |
1398 | goto out_free_name; | 1384 | goto out_free_name; |
1399 | 1385 | ||
1400 | xfs_itrace_ref(*ipp); | ||
1401 | return 0; | 1386 | return 0; |
1402 | 1387 | ||
1403 | out_free_name: | 1388 | out_free_name: |
@@ -1543,7 +1528,6 @@ xfs_create( | |||
1543 | * At this point, we've gotten a newly allocated inode. | 1528 | * At this point, we've gotten a newly allocated inode. |
1544 | * It is locked (and joined to the transaction). | 1529 | * It is locked (and joined to the transaction). |
1545 | */ | 1530 | */ |
1546 | xfs_itrace_ref(ip); | ||
1547 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); | 1531 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
1548 | 1532 | ||
1549 | /* | 1533 | /* |
@@ -2003,9 +1987,6 @@ xfs_remove( | |||
2003 | if (!is_dir && link_zero && xfs_inode_is_filestream(ip)) | 1987 | if (!is_dir && link_zero && xfs_inode_is_filestream(ip)) |
2004 | xfs_filestream_deassociate(ip); | 1988 | xfs_filestream_deassociate(ip); |
2005 | 1989 | ||
2006 | xfs_itrace_exit(ip); | ||
2007 | xfs_itrace_exit(dp); | ||
2008 | |||
2009 | std_return: | 1990 | std_return: |
2010 | if (DM_EVENT_ENABLED(dp, DM_EVENT_POSTREMOVE)) { | 1991 | if (DM_EVENT_ENABLED(dp, DM_EVENT_POSTREMOVE)) { |
2011 | XFS_SEND_NAMESP(mp, DM_EVENT_POSTREMOVE, dp, DM_RIGHT_NULL, | 1992 | XFS_SEND_NAMESP(mp, DM_EVENT_POSTREMOVE, dp, DM_RIGHT_NULL, |
@@ -2302,7 +2283,6 @@ xfs_symlink( | |||
2302 | goto error_return; | 2283 | goto error_return; |
2303 | goto error1; | 2284 | goto error1; |
2304 | } | 2285 | } |
2305 | xfs_itrace_ref(ip); | ||
2306 | 2286 | ||
2307 | /* | 2287 | /* |
2308 | * An error after we've joined dp to the transaction will result in the | 2288 | * An error after we've joined dp to the transaction will result in the |
@@ -2845,7 +2825,6 @@ xfs_free_file_space( | |||
2845 | ioffset = offset & ~(rounding - 1); | 2825 | ioffset = offset & ~(rounding - 1); |
2846 | 2826 | ||
2847 | if (VN_CACHED(VFS_I(ip)) != 0) { | 2827 | if (VN_CACHED(VFS_I(ip)) != 0) { |
2848 | xfs_inval_cached_trace(ip, ioffset, -1, ioffset, -1); | ||
2849 | error = xfs_flushinval_pages(ip, ioffset, -1, FI_REMAPF_LOCKED); | 2828 | error = xfs_flushinval_pages(ip, ioffset, -1, FI_REMAPF_LOCKED); |
2850 | if (error) | 2829 | if (error) |
2851 | goto out_unlock_iolock; | 2830 | goto out_unlock_iolock; |