From 9498dc0f1cc03d132d3b2096f017d0d660753d81 Mon Sep 17 00:00:00 2001 From: Derrick Brashear Date: Tue, 1 Jul 2003 23:24:14 +0000 Subject: [PATCH] STABLE12-linux-i-alloc-sem-usage-20030701 modern kernels appear to use i_alloc_sem around truncation (cherry picked from commit 239067b1476801254c502c348893bb49553b5e74) --- acconfig.h | 1 + acinclude.m4 | 4 ++++ src/afs/LINUX/osi_file.c | 6 ++++++ src/afs/afs_vcache.c | 3 +++ src/cf/linux-test2.m4 | 15 +++++++++++++++ 5 files changed, 29 insertions(+) diff --git a/acconfig.h b/acconfig.h index 970984a4d..075dca23b 100644 --- a/acconfig.h +++ b/acconfig.h @@ -45,6 +45,7 @@ static /**/const char *const rcsid[] = { (char *)rcsid, "\100(#)" msg } #undef STRUCT_FS_HAS_FS_ROLLED #undef STRUCT_INODE_HAS_I_DEVICES #undef STRUCT_INODE_HAS_I_DIRTY_DATA_BUFFERS +#undef STRUCT_INODE_HAS_I_ALLOC_SEM #undef STRUCT_INODE_HAS_I_TRUNCATE_SEM #undef STRUCT_TASK_STRUCT_HAS_PARENT #undef STRUCT_TASK_STRUCT_HAS_REAL_PARENT diff --git a/acinclude.m4 b/acinclude.m4 index 58671e89d..a16d87633 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -151,6 +151,7 @@ case $system in LINUX_EXPORTS_TASKLIST_LOCK LINUX_FS_STRUCT_ADDRESS_SPACE_HAS_PAGE_LOCK LINUX_FS_STRUCT_ADDRESS_SPACE_HAS_GFP_MASK + LINUX_FS_STRUCT_INODE_HAS_I_ALLOC_SEM LINUX_FS_STRUCT_INODE_HAS_I_TRUNCATE_SEM LINUX_FS_STRUCT_INODE_HAS_I_DIRTY_DATA_BUFFERS LINUX_FS_STRUCT_INODE_HAS_I_DEVICES @@ -240,6 +241,9 @@ case $system in if test "x$ac_cv_linux_fs_struct_inode_has_i_truncate_sem" = "xyes"; then AC_DEFINE(STRUCT_INODE_HAS_I_TRUNCATE_SEM, 1, [define if your struct inode has truncate_sem]) fi + if test "x$ac_cv_linux_fs_struct_inode_has_i_alloc_sem" = "xyes"; then + AC_DEFINE(STRUCT_INODE_HAS_I_ALLOC_SEM, 1, [define if your struct inode has alloc_sem]) + fi if test "x$ac_cv_linux_fs_struct_inode_has_i_devices" = "xyes"; then AC_DEFINE(STRUCT_INODE_HAS_I_DEVICES, 1, [define if you struct inode has i_devices]) fi diff --git a/src/afs/LINUX/osi_file.c b/src/afs/LINUX/osi_file.c index f11d94c60..c5ddd9a15 100644 --- a/src/afs/LINUX/osi_file.c +++ b/src/afs/LINUX/osi_file.c @@ -126,6 +126,9 @@ osi_UFSTruncate(afile, asize) if (code || tstat.size <= asize) return code; MObtainWriteLock(&afs_xosi,321); AFS_GUNLOCK(); +#ifdef STRUCT_INODE_HAS_I_ALLOC_SEM + down_write(&inode->i_alloc_sem); +#endif down(&inode->i_sem); inode->i_size = newattrs.ia_size = asize; newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME; @@ -156,6 +159,9 @@ osi_UFSTruncate(afile, asize) #endif code = -code; up(&inode->i_sem); +#ifdef STRUCT_INODE_HAS_I_ALLOC_SEM + up_write(&inode->i_alloc_sem); +#endif AFS_GLOCK(); MReleaseWriteLock(&afs_xosi); return code; diff --git a/src/afs/afs_vcache.c b/src/afs/afs_vcache.c index f91daeb61..58bdfb4fb 100644 --- a/src/afs/afs_vcache.c +++ b/src/afs/afs_vcache.c @@ -1062,6 +1062,9 @@ struct vcache *afs_NewVCache(struct VenusFid *afid, struct server *serverp, #ifdef STRUCT_INODE_HAS_I_TRUNCATE_SEM init_rwsem(&ip->i_truncate_sem); #endif +#ifdef STRUCT_INODE_HAS_I_ALLOC_SEM + init_rwsem(&ip->i_alloc_sem); +#endif #else sema_init(&ip->i_atomic_write, 1); init_waitqueue(&ip->i_wait); diff --git a/src/cf/linux-test2.m4 b/src/cf/linux-test2.m4 index 17b34bf6b..49ceb11a1 100644 --- a/src/cf/linux-test2.m4 +++ b/src/cf/linux-test2.m4 @@ -28,6 +28,21 @@ ac_cv_linux_fs_struct_inode_has_i_bytes=no)]) AC_MSG_RESULT($ac_cv_linux_fs_struct_inode_has_i_bytes) CPPFLAGS="$save_CPPFLAGS"]) +AC_DEFUN(LINUX_FS_STRUCT_INODE_HAS_I_ALLOC_SEM, [ +AC_MSG_CHECKING(for i_alloc_sem in struct inode) +save_CPPFLAGS="$CPPFLAGS" +CPPFLAGS="-I${LINUX_KERNEL_PATH}/include -D__KERNEL__ $CPPFLAGS" +AC_CACHE_VAL(ac_cv_linux_fs_struct_inode_has_i_alloc_sem, +[ +AC_TRY_COMPILE( +[#include ], +[struct inode _i; +printf("%x\n", _i.i_alloc_sem);], +ac_cv_linux_fs_struct_inode_has_i_alloc_sem=yes, +ac_cv_linux_fs_struct_inode_has_i_alloc_sem=no)]) +AC_MSG_RESULT($ac_cv_linux_fs_struct_inode_has_i_alloc_sem) +CPPFLAGS="$save_CPPFLAGS"]) + AC_DEFUN(LINUX_FS_STRUCT_INODE_HAS_I_TRUNCATE_SEM, [ AC_MSG_CHECKING(for i_truncate_sem in struct inode) save_CPPFLAGS="$CPPFLAGS" -- 2.39.5