Linux: Use positional r/w, not llseek
[openafs.git] / src / afs / LINUX / osi_compat.h
index b973186..7088625 100644 (file)
@@ -9,7 +9,11 @@
 #ifndef AFS_LINUX_OSI_COMPAT_H
 #define AFS_LINUX_OSI_COMPAT_H
 
-#ifndef DO_SYNC_READ
+#if defined(HAVE_LINUX_FREEZER_H)
+# include <linux/freezer.h>
+#endif
+
+#ifndef HAVE_LINUX_DO_SYNC_READ
 static inline int
 do_sync_read(struct file *fp, char *buf, size_t count, loff_t *offp) {
     return generic_file_read(fp, buf, count, offp);
@@ -65,12 +69,18 @@ afs_linux_set_nfsfs_renamed(struct dentry *dp) {
     dp->d_flags |= DCACHE_NFSFS_RENAMED;
     spin_unlock(&dp->d_lock);
 }
+
+static inline int
+afs_linux_nfsfs_renamed(struct dentry *dp) {
+    return dp->d_flags & DCACHE_NFSFS_RENAMED;
+}
+
 #else
 static inline void afs_linux_clear_nfsfs_renamed(void) { return; }
 static inline void afs_linux_set_nfsfs_renamed(void) { return; }
 #endif
 
-#ifndef HAVE_KERNEL_HLIST_UNHASHED
+#ifndef HAVE_LINUX_HLIST_UNHASHED
 static void
 hlist_unhashed(const struct hlist_node *h) {
     return (!h->pprev == NULL);
@@ -81,7 +91,7 @@ hlist_unhashed(const struct hlist_node *h) {
 #define AOP_WRITEPAGE_ACTIVATE WRITEPAGE_ACTIVATE
 #endif
 
-#if defined(HAVE_WRITE_BEGIN) && !defined(HAVE_GRAB_CACHE_PAGE_WRITE_BEGIN)
+#if defined(STRUCT_ADDRESS_SPACE_OPERATIONS_HAS_WRITE_BEGIN) && !defined(HAVE_LINUX_GRAB_CACHE_PAGE_WRITE_BEGIN)
 static inline struct page *
 grab_cache_page_write_begin(struct address_space *mapping, pgoff_t index,
                            unsigned int flags) {
@@ -149,7 +159,7 @@ afs_linux_key_alloc(struct key_type *type, const char *desc, uid_t uid,
 #endif
 }
 
-#if defined(STRUCT_TASK_HAS_CRED)
+#if defined(STRUCT_TASK_STRUCT_HAS_CRED)
 static inline struct key*
 afs_linux_search_keyring(afs_ucred_t *cred, struct key_type *type)
 {
@@ -188,4 +198,98 @@ afs_linux_cred_is_current(afs_ucred_t *cred)
 }
 #endif
 
+#ifdef LINUX_KEYRING_SUPPORT
+# ifndef KEY_ALLOC_NOT_IN_QUOTA
+#  define KEY_ALLOC_NOT_IN_QUOTA 1
+# endif
+# ifndef KEY_ALLOC_IN_QUOTA
+#  define KEY_ALLOC_IN_QUOTA 0
+# endif
+#endif
+#endif
+
+#ifndef HAVE_LINUX_PAGE_OFFSET
+static inline loff_t
+page_offset(struct page *pp)
+{
+    return (((loff_t) pp->index) << PAGE_CACHE_SHIFT);
+}
+#endif
+
+#ifndef HAVE_LINUX_ZERO_USER_SEGMENTS
+static inline void
+zero_user_segments(struct page *pp, unsigned int from1, unsigned int to1,
+                  unsigned int from2, unsigned int to2)
+{
+    void *base = kmap_atomic(pp, KM_USER0);
+
+    if (to1 > from1)
+       memset(base + from1, 0, to1 - from1);
+
+    if (to2 > from2)
+       memset(base + from2, 0, to2 - from2);
+
+    flush_dcache_page(pp);
+    kunmap_atomic(base, KM_USER0);
+}
+#endif
+
+#ifndef HAVE_LINUX_KERNEL_SETSOCKOPT
+/* Available from 2.6.19 */
+
+static inline int
+kernel_setsockopt(struct socket *sockp, int level, int name, char *val,
+                 unsigned int len) {
+    mm_segment_t old_fs = get_fs();
+    int ret;
+
+    set_fs(get_ds());
+    ret = sockp->ops->setsockopt(sockp, level, name, val, len);
+    set_fs(old_fs);
+
+    return ret;
+}
+
+static inline int
+kernel_getsockopt(struct socket *sockp, int level, int name, char *val,
+                 int *len) {
+    mm_segment_t old_fs = get_fs();
+    int ret;
+
+    set_fs(get_ds());
+    ret = sockp->ops->setsockopt(sockp, level, name, val, len);
+    set_fs(old_fs);
+
+    return ret;
+}
+#endif
+
+#ifdef HAVE_TRY_TO_FREEZE
+static inline void
+afs_try_to_freeze(void) {
+# ifdef LINUX_REFRIGERATOR_TAKES_PF_FREEZE
+    try_to_freeze(PF_FREEZE);
+# else
+    try_to_freeze();
+# endif
+}
+#else
+static inline void
+afs_try_to_freeze(void) {
+# ifdef CONFIG_PM
+    if (current->flags & PF_FREEZE) {
+       refrigerator(PF_FREEZE);
+# endif
+}
+#endif
+
+#if !defined(HAVE_LINUX_PAGECHECKED)
+# if defined(HAVE_LINUX_PAGEFSMISC)
+#  include <linux/page-flags.h>
+
+#  define PageChecked(p)            PageFsMisc((p))
+#  define SetPageChecked(p)         SetPageFsMisc((p))
+#  define ClearPageChecked(p)       ClearPageFsMisc((p))
+
+# endif
 #endif