Whamcloud - gitweb
1. Replace i_mapping with the bottom inode imapping in mmap method according to peter...
authorwangdi <wangdi>
Wed, 18 Feb 2004 15:55:12 +0000 (15:55 +0000)
committerwangdi <wangdi>
Wed, 18 Feb 2004 15:55:12 +0000 (15:55 +0000)
lustre/smfs/cache.c
lustre/smfs/file.c
lustre/smfs/smfs_internal.h
lustre/smfs/super.c

index f08eb41..c4bfa27 100644 (file)
@@ -15,7 +15,6 @@ struct sm_ops smfs_operations;
  
 extern struct inode_operations smfs_file_iops;
 extern struct file_operations  smfs_file_fops;
-extern struct address_space_operations smfs_file_aops;
 extern struct inode_operations smfs_sym_iops; 
 extern struct file_operations smfs_sym_fops;
 extern struct super_operations smfs_super_ops;
@@ -50,11 +49,6 @@ inline struct file_operations *cache_ffops(struct sm_ops *smfs_ops)
        return &smfs_ops->sm_file_fops;
 }
 
-inline struct address_space_operations *cache_faops(struct sm_ops *smfs_ops) 
-{
-       return &smfs_ops->sm_file_aops;
-}
-
 inline struct file_operations *cache_sfops(struct sm_ops *smfs_ops)
 {
        return &smfs_ops->sm_sym_fops;
@@ -187,47 +181,14 @@ static void setup_fops(struct inode *cache_inode,
                        fops->get_unmapped_area = cache_fops->get_unmapped_area;                                                                                        
        }
 }
-static void setup_aops(struct inode *cache_inode,
-                      struct address_space_operations *aops,
-                      struct address_space_operations *cache_aops)
-{
-       if (cache_inode && cache_inode->i_mapping && 
-           aops && cache_aops) {
-               struct address_space_operations *caops = cache_inode->i_mapping->a_ops;
-
-               if (caops->writepage) 
-                       aops->writepage = cache_aops->writepage;
-               if (caops->readpage)
-                       aops->readpage = cache_aops->readpage;
-               if (caops->sync_page)
-                       aops->sync_page = cache_aops->sync_page;
-               if (caops->prepare_write)
-                       aops->prepare_write = cache_aops->prepare_write;
-               if (caops->commit_write)
-                       aops->commit_write = cache_aops->commit_write;
-               if (caops->bmap)
-                       aops->bmap = cache_aops->bmap;
-               if (caops->flushpage)
-                       aops->flushpage = cache_aops->flushpage;
-               if (caops->releasepage)
-                       aops->releasepage = cache_aops->releasepage;
-               if (caops->direct_IO)
-                       aops->direct_IO = cache_aops->direct_IO;
-               if (caops->removepage)
-                       aops->removepage = cache_aops->removepage;
-       }                                                                       
-};
-               
 static void setup_sm_file_ops(struct inode *cache_inode, 
                              struct inode *inode,
                              struct inode_operations *cache_iops,
-                             struct file_operations *cache_fops,
-                             struct address_space_operations *cache_aops)
+                             struct file_operations *cache_fops)
 {
        struct smfs_super_info *smb;
        struct inode_operations *iops;
        struct file_operations *fops;
-        struct address_space_operations *aops;
 
        smb = S2SMI(inode->i_sb); 
        
@@ -237,15 +198,12 @@ static void setup_sm_file_ops(struct inode *cache_inode,
 
        iops = cache_fiops(&smfs_operations);
        fops = cache_ffops(&smfs_operations);
-       aops = cache_faops(&smfs_operations);
 
        memset(iops , 0 , sizeof (struct inode_operations));    
        memset(fops , 0 , sizeof (struct file_operations));     
-       memset(aops , 0 , sizeof (struct address_space_operations));    
 
        setup_iops(cache_inode, iops, cache_iops);      
        setup_fops(cache_inode, fops, cache_fops);
-       setup_aops(cache_inode, aops, cache_aops);
 
        return;
 }
@@ -372,14 +330,11 @@ void sm_set_inode_ops(struct inode *cache_inode, struct inode *inode)
         } else if (S_ISREG(inode->i_mode)) {
                setup_sm_file_ops(cache_inode, inode,
                                   &smfs_file_iops,
-                                  &smfs_file_fops,
-                                  &smfs_file_aops);
+                                  &smfs_file_fops);
                 CDEBUG(D_INODE, "inode %lu, i_op at %p\n",
                        inode->i_ino, inode->i_op);
                 inode->i_fop = cache_ffops(&smfs_operations);
                 inode->i_op = cache_fiops(&smfs_operations);
-                if (inode->i_mapping)
-                        inode->i_mapping->a_ops = cache_faops(&smfs_operations);
         
        } else if (S_ISLNK(inode->i_mode)) {
                 setup_sm_symlink_ops(cache_inode, inode,
index fce003a..6235235 100644 (file)
 #include <linux/unistd.h>
 #include <linux/pagemap.h>
 #include "smfs_internal.h" 
-
-static int smfs_readpage(struct file *file, 
-                        struct page *page)
-{
-       struct  inode *inode = page->mapping->host;
-       struct  inode *cache_inode;
-       struct page *cache_page = NULL;
-       int rc = 0; 
-
-       ENTRY;
-       
-       cache_inode = I2CI(inode);
-        if (!cache_inode)
-                RETURN(-ENOENT);
-       
-       cache_page = grab_cache_page(cache_inode->i_mapping, page->index);
-
-       if (!cache_page) 
-               GOTO(exit_release, rc = -ENOMEM);
-
-       if ((rc = cache_inode->i_mapping->a_ops->readpage(file, cache_page)))
-               GOTO(exit_release, 0);
-       
-       wait_on_page(cache_page);
-
-       if (!Page_Uptodate(cache_page))
-               GOTO(exit_release, rc = -EIO);
-
-       memcpy(kmap(page), kmap(cache_page), PAGE_CACHE_SIZE);
-
-       flush_dcache_page(page);
-
-       kunmap(cache_page);
-       page_cache_release(cache_page);
-
-exit:  
-       kunmap(page);
-       SetPageUptodate(page);
-       UnlockPage(page);
-
-       RETURN(rc);
-
-exit_release:
-       if (cache_page) 
-               page_cache_release(cache_page);
-       UnlockPage(page);
-       RETURN(rc);
-}
-
-static int smfs_writepage(struct page *page)
-{
-
-       struct  inode *inode = page->mapping->host;
-       struct  inode *cache_inode;
-       int     rc;
-       
-       ENTRY;
-       
-       cache_inode = I2CI(inode);
-        if (!cache_inode)
-                RETURN(-ENOENT);
-
-       if (cache_inode->i_mapping->a_ops->writepage)
-               rc = cache_inode->i_mapping->a_ops->writepage(page);
-               
-        RETURN(rc);
-}
-
-static int smfs_sync_page(struct page *page)
-{
-       struct inode *inode = page->mapping->host;
-       struct inode *cache_inode;
-       int    rc = 0;
-               
-       cache_inode = I2CI(inode);
-        if (!cache_inode)
-                RETURN(-ENOENT);
-
-       if (cache_inode->i_mapping->a_ops->sync_page)
-               rc = cache_inode->i_mapping->a_ops->sync_page(page);
-
-        RETURN(rc);
-}
-
-static int smfs_prepare_write(struct file *file, struct page *page,
-                              unsigned from, unsigned to)
-{
-       struct inode *inode = page->mapping->host;
-       struct inode *cache_inode;
-       int    rc = 0;
-               
-       cache_inode = I2CI(inode);
-        if (!cache_inode)
-                RETURN(-ENOENT);
-
-       if (cache_inode->i_mapping->a_ops->prepare_write)
-               rc = cache_inode->i_mapping->a_ops->prepare_write(file, page, from, to);
-
-        RETURN(rc);
-}
-
-static int smfs_commit_write(struct file *file, struct page *page,
-                             unsigned from, unsigned to)
-{
-       struct inode *inode = page->mapping->host;
-       struct inode *cache_inode;
-       int    rc = 0;
-               
-       cache_inode = I2CI(inode);
-        if (!cache_inode)
-                RETURN(-ENOENT);
-
-       if (cache_inode->i_mapping->a_ops->commit_write)
-               rc = cache_inode->i_mapping->a_ops->commit_write(file, page, from, to);
-
-        RETURN(rc);
-}
-
-static int smfs_bmap(struct address_space *mapping, long block)
-{
-       struct inode *inode = mapping->host;
-       struct inode *cache_inode;
-       int    rc = 0;
-               
-       cache_inode = I2CI(inode);
-        if (!cache_inode)
-                RETURN(-ENOENT);
-
-       if (cache_inode->i_mapping->a_ops->bmap)
-               rc = cache_inode->i_mapping->a_ops->bmap(mapping, block);
-
-        RETURN(rc);
-}
-
-static int smfs_flushpage(struct page *page, unsigned long offset) 
-{
-       struct inode *inode = page->mapping->host;
-       struct inode *cache_inode;
-       int    rc = 0;
-               
-       cache_inode = I2CI(inode);
-        if (!cache_inode)
-                RETURN(-ENOENT);
-
-       if (cache_inode->i_mapping->a_ops->flushpage)
-               rc = cache_inode->i_mapping->a_ops->flushpage(page, offset);
-
-        RETURN(rc);
-}
-
-static int smfs_releasepage(struct page *page, int wait) 
-{
-       struct inode *inode = page->mapping->host;
-       struct inode *cache_inode;
-       int    rc = 0;
-               
-       cache_inode = I2CI(inode);
-        if (!cache_inode)
-                RETURN(-ENOENT);
-
-       if (cache_inode->i_mapping->a_ops->releasepage)
-               rc = cache_inode->i_mapping->a_ops->releasepage(page, wait);
-
-        RETURN(rc);
-}
-
-static int smfs_direct_IO(int rw, struct inode *inode, struct kiobuf *iobuf,
-                unsigned long blocknr, int blocksize) 
-{
-       struct inode *cache_inode;
-       int    rc = 0;
-               
-       cache_inode = I2CI(inode);
-        if (!cache_inode)
-                RETURN(-ENOENT);
-
-       if (cache_inode->i_mapping->a_ops->direct_IO)
-               rc = cache_inode->i_mapping->a_ops->direct_IO(rw, cache_inode, iobuf,
-                                                             blocknr, blocksize);
-        RETURN(rc);
-}
-
-struct address_space_operations smfs_file_aops = {
-       readpage:       smfs_readpage,
-       writepage:      smfs_writepage,
-       sync_page:      smfs_sync_page,
-       prepare_write:  smfs_prepare_write,
-       commit_write:   smfs_commit_write,
-       bmap:           smfs_bmap,
-       flushpage:      smfs_flushpage,
-       releasepage:    smfs_releasepage,
-       direct_IO:      smfs_direct_IO, 
-};
         
 /* instantiate a file handle to the cache file */
 void smfs_prepare_cachefile(struct inode *inode,
@@ -393,8 +191,7 @@ static loff_t smfs_llseek(struct file *file,
 
 static int smfs_mmap(struct file * file, struct vm_area_struct * vma)
 {
-       struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
-        struct inode *inode = mapping->host;
+        struct inode *inode = file->f_dentry->d_inode;
         struct inode *cache_inode = NULL;
         struct  file open_file;
        struct  dentry open_dentry;
@@ -406,10 +203,13 @@ static int smfs_mmap(struct file * file, struct vm_area_struct * vma)
 
        smfs_prepare_cachefile(inode, file, cache_inode, 
                               &open_file, &open_dentry);
-       
+  
+       if (cache_inode->i_mapping == &cache_inode->i_data)
+                inode->i_mapping = cache_inode->i_mapping;
+
        if (cache_inode->i_fop->mmap)
                rc = cache_inode->i_fop->mmap(&open_file, vma);
-       
+      
        duplicate_inode(cache_inode, inode);
        smfs_update_file(file, &open_file);
        
index a84ec67..964db50 100644 (file)
@@ -37,7 +37,6 @@ struct sm_ops {
         struct file_operations sm_file_fops;
         struct file_operations sm_sym_fops;
                                                                                                                                                                                                      
-        struct address_space_operations sm_file_aops;
         struct dentry_operations sm_dentry_ops;
 };
 
index 58dfcd3..be0e745 100644 (file)
@@ -45,18 +45,7 @@ static char *smfs_options(char *options, char **devstr, char **namestr)
        }
        return pos;
 }
-static int close_fd(int fd)
-{
-       struct files_struct *files = current->files;    
-        
-       write_lock(&files->file_lock);
-       
-       files->fd[fd] = NULL;
-        __put_unused_fd(files, fd); 
-       
-       write_unlock(&files->file_lock);
-       return 0;
-}
+
 static int set_loop_fd(char *dev_path, char *loop_dev)
 {
         struct loop_info loopinfo;
@@ -190,7 +179,7 @@ static char *parse_path2dev(struct super_block *sb, char *dev_path)
        memcpy(name, dev_path, strlen(dev_path) + 1);
        RETURN(name);
 }
-static void duplicate_sb(struct super_block *csb, 
+void duplicate_sb(struct super_block *csb, 
                         struct super_block *sb)
 {
        sb->s_blocksize = csb->s_blocksize;
@@ -224,7 +213,7 @@ static int sm_mount_cache(struct super_block *sb,
         free_page(page);
        
        if (IS_ERR(mnt)) {
-                CERROR("do_kern_mount failed: rc = %d\n", PTR_ERR(mnt));
+                CERROR("do_kern_mount failed: rc = %ld\n", PTR_ERR(mnt));
                 GOTO(err_out, err = PTR_ERR(mnt));
         }
        smb = S2SMI(sb);