mm, fs: get rid of PAGE_CACHE_* and page_cache_{get,release} macros
[deliverable/linux.git] / fs / orangefs / inode.c
index 040cd95b51c2c6e08897c318b0fe13cd86fdd3e5..0166faabf8f2980f0c4e1cecfbdbd439a5c54c15 100644 (file)
@@ -18,8 +18,8 @@ static int read_one_page(struct page *page)
        int max_block;
        ssize_t bytes_read = 0;
        struct inode *inode = page->mapping->host;
-       const __u32 blocksize = PAGE_CACHE_SIZE;        /* inode->i_blksize */
-       const __u32 blockbits = PAGE_CACHE_SHIFT;       /* inode->i_blkbits */
+       const __u32 blocksize = PAGE_SIZE;      /* inode->i_blksize */
+       const __u32 blockbits = PAGE_SHIFT;     /* inode->i_blkbits */
        struct iov_iter to;
        struct bio_vec bv = {.bv_page = page, .bv_len = PAGE_SIZE};
 
@@ -86,7 +86,7 @@ static int orangefs_readpages(struct file *file,
                                "failure adding page to cache, read_one_page returned: %d\n",
                                ret);
              } else {
-                       page_cache_release(page);
+                       put_page(page);
              }
        }
        BUG_ON(!list_empty(pages));
@@ -157,7 +157,7 @@ static int orangefs_setattr_size(struct inode *inode, struct iattr *iattr)
 {
        struct orangefs_inode_s *orangefs_inode = ORANGEFS_I(inode);
        struct orangefs_kernel_op_s *new_op;
-       loff_t orig_size = i_size_read(inode);
+       loff_t orig_size;
        int ret = -EINVAL;
 
        gossip_debug(GOSSIP_INODE_DEBUG,
@@ -168,6 +168,17 @@ static int orangefs_setattr_size(struct inode *inode, struct iattr *iattr)
                     orangefs_inode->refn.fs_id,
                     iattr->ia_size);
 
+       /* Ensure that we have a up to date size, so we know if it changed. */
+       ret = orangefs_inode_getattr(inode, 0, 1);
+       if (ret == -ESTALE)
+               ret = -EIO;
+       if (ret) {
+               gossip_err("%s: orangefs_inode_getattr failed, ret:%d:.\n",
+                   __func__, ret);
+               return ret;
+       }
+       orig_size = i_size_read(inode);
+
        truncate_setsize(inode, iattr->ia_size);
 
        new_op = op_alloc(ORANGEFS_VFS_OP_TRUNCATE);
@@ -268,29 +279,34 @@ int orangefs_getattr(struct vfsmount *mnt,
                     "orangefs_getattr: called on %s\n",
                     dentry->d_name.name);
 
-       /*
-        * Similar to the above comment, a getattr also expects that all
-        * fields/attributes of the inode would be refreshed. So again, we
-        * dont have too much of a choice but refresh all the attributes.
-        */
-       ret = orangefs_inode_getattr(inode, ORANGEFS_ATTR_SYS_ALL_NOHINT, 0);
+       ret = orangefs_inode_getattr(inode, 0, 1);
        if (ret == 0) {
                generic_fillattr(inode, kstat);
+
                /* override block size reported to stat */
                orangefs_inode = ORANGEFS_I(inode);
                kstat->blksize = orangefs_inode->blksize;
-       } else {
-               /* assume an I/O error and flag inode as bad */
-               gossip_debug(GOSSIP_INODE_DEBUG,
-                            "%s:%s:%d calling make bad inode\n",
-                            __FILE__,
-                            __func__,
-                            __LINE__);
-               orangefs_make_bad_inode(inode);
        }
        return ret;
 }
 
+int orangefs_permission(struct inode *inode, int mask)
+{
+       int ret;
+
+       if (mask & MAY_NOT_BLOCK)
+               return -ECHILD;
+
+       gossip_debug(GOSSIP_INODE_DEBUG, "%s: refreshing\n", __func__);
+
+       /* Make sure the permission (and other common attrs) are up to date. */
+       ret = orangefs_inode_getattr(inode, 0, 0);
+       if (ret < 0)
+               return ret;
+
+       return generic_permission(inode, mask);
+}
+
 /* ORANGEDS2 implementation of VFS inode operations for files */
 struct inode_operations orangefs_file_inode_operations = {
        .get_acl = orangefs_get_acl,
@@ -301,6 +317,7 @@ struct inode_operations orangefs_file_inode_operations = {
        .getxattr = generic_getxattr,
        .listxattr = orangefs_listxattr,
        .removexattr = generic_removexattr,
+       .permission = orangefs_permission,
 };
 
 static int orangefs_init_iops(struct inode *inode)
@@ -311,7 +328,7 @@ static int orangefs_init_iops(struct inode *inode)
        case S_IFREG:
                inode->i_op = &orangefs_file_inode_operations;
                inode->i_fop = &orangefs_file_operations;
-               inode->i_blkbits = PAGE_CACHE_SHIFT;
+               inode->i_blkbits = PAGE_SHIFT;
                break;
        case S_IFLNK:
                inode->i_op = &orangefs_symlink_inode_operations;
@@ -348,16 +365,8 @@ static inline ino_t orangefs_handle_hash(struct orangefs_object_kref *ref)
 static int orangefs_set_inode(struct inode *inode, void *data)
 {
        struct orangefs_object_kref *ref = (struct orangefs_object_kref *) data;
-       struct orangefs_inode_s *orangefs_inode = NULL;
-
-       /* Make sure that we have sane parameters */
-       if (!data || !inode)
-               return 0;
-       orangefs_inode = ORANGEFS_I(inode);
-       if (!orangefs_inode)
-               return 0;
-       orangefs_inode->refn.fs_id = ref->fs_id;
-       orangefs_inode->refn.khandle = ref->khandle;
+       ORANGEFS_I(inode)->refn.fs_id = ref->fs_id;
+       ORANGEFS_I(inode)->refn.khandle = ref->khandle;
        return 0;
 }
 
@@ -392,7 +401,7 @@ struct inode *orangefs_iget(struct super_block *sb, struct orangefs_object_kref
        if (!inode || !(inode->i_state & I_NEW))
                return inode;
 
-       error = orangefs_inode_getattr(inode, ORANGEFS_ATTR_SYS_ALL_NOHINT, 0);
+       error = orangefs_inode_getattr(inode, 1, 0);
        if (error) {
                iget_failed(inode);
                return ERR_PTR(error);
@@ -423,8 +432,8 @@ struct inode *orangefs_new_inode(struct super_block *sb, struct inode *dir,
        int error;
 
        gossip_debug(GOSSIP_INODE_DEBUG,
-                    "orangefs_get_custom_inode_common: called\n"
-                    "(sb is %p | MAJOR(dev)=%u | MINOR(dev)=%u mode=%o)\n",
+                    "%s:(sb is %p | MAJOR(dev)=%u | MINOR(dev)=%u mode=%o)\n",
+                    __func__,
                     sb,
                     MAJOR(dev),
                     MINOR(dev),
@@ -437,7 +446,7 @@ struct inode *orangefs_new_inode(struct super_block *sb, struct inode *dir,
        orangefs_set_inode(inode, ref);
        inode->i_ino = hash;    /* needed for stat etc */
 
-       error = orangefs_inode_getattr(inode, ORANGEFS_ATTR_SYS_ALL_NOHINT, 0);
+       error = orangefs_inode_getattr(inode, 1, 0);
        if (error)
                goto out_iput;
 
@@ -447,7 +456,7 @@ struct inode *orangefs_new_inode(struct super_block *sb, struct inode *dir,
        inode->i_uid = current_fsuid();
        inode->i_gid = current_fsgid();
        inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
-       inode->i_size = PAGE_CACHE_SIZE;
+       inode->i_size = PAGE_SIZE;
        inode->i_rdev = dev;
 
        error = insert_inode_locked4(inode, hash, orangefs_test_inode, ref);
This page took 0.030035 seconds and 5 git commands to generate.