#endif
extern struct vcache *afs_globalVp;
+extern int afs_notify_change(struct dentry *dp, struct iattr *iattrp);
#if defined(AFS_LINUX26_ENV)
/* Some uses of BKL are perhaps not needed for bypass or memcache--
* why don't we try it out? */
return -code;
}
-#if defined(AFS_LINUX24_ENV)
+#if defined(AFS_LINUX24_ENV) && !defined(HAVE_WRITE_BEGIN)
static int
afs_linux_commit_write(struct file *file, struct page *page, unsigned offset,
unsigned to)
#endif
return 0;
}
+#endif
-extern int afs_notify_change(struct dentry *dp, struct iattr *iattrp);
+#if defined(HAVE_WRITE_BEGIN)
+static int
+afs_linux_write_end(struct file *file, struct address_space *mapping,
+ loff_t pos, unsigned len, unsigned copied,
+ struct page *page, void *fsdata)
+{
+ int code;
+ pgoff_t index = pos >> PAGE_CACHE_SHIFT;
+ unsigned from = pos & (PAGE_CACHE_SIZE - 1);
+
+ code = afs_linux_writepage_sync(file->f_dentry->d_inode, page,
+ from, copied);
+ unlock_page(page);
+ page_cache_release(page);
+ return code;
+}
+
+static int
+afs_linux_write_begin(struct file *file, struct address_space *mapping,
+ loff_t pos, unsigned len, unsigned flags,
+ struct page **pagep, void **fsdata)
+{
+ struct page *page;
+ pgoff_t index = pos >> PAGE_CACHE_SHIFT;
+ page = __grab_cache_page(mapping, index);
+ *pagep = page;
+
+ return 0;
+}
#endif
+
static struct inode_operations afs_file_iops = {
#if defined(AFS_LINUX26_ENV)
.permission = afs_linux_permission,
.readpages = afs_linux_readpages,
#endif
.writepage = afs_linux_writepage,
- .commit_write = afs_linux_commit_write,
- .prepare_write = afs_linux_prepare_write,
+#if defined (HAVE_WRITE_BEGIN)
+ .write_begin = afs_linux_write_begin,
+ .write_end = afs_linux_write_end,
+#else
+ .commit_write = afs_linux_commit_write,
+ .prepare_write = afs_linux_prepare_write,
+#endif
};
#endif
if test "x$ac_cv_linux_bdi_init" = "xyes"; then
AC_DEFINE([HAVE_BDI_INIT], 1, [define if your kernel has a bdi_init()])
fi])
+
+AC_DEFUN([LINUX_HAVE_WRITE_BEGIN_AOP], [
+ AC_MSG_CHECKING([for linux write_begin() address space op])
+ AC_CACHE_VAL([ac_cv_linux_write_begin], [
+ AC_TRY_KBUILD(
+[#include <linux/fs.h>],
+[simple_write_begin(NULL, NULL, 0, 0, 0, NULL, NULL);],
+ ac_cv_linux_write_begin=yes,
+ ac_cv_linux_write_begin=no)])
+ AC_MSG_RESULT($ac_cv_linux_write_begin)
+ if test "x$ac_cv_linux_write_begin" = "xyes"; then
+ AC_DEFINE([HAVE_WRITE_BEGIN], 1, [define if your kernel has a write_begin() address space op])
+ fi])