diff --git a/lustre/smfs/file.c b/lustre/smfs/file.c index 3175c564baf309ecef13bb447c3c779c98559004..fce003a593c6481f16b52ea280f83cd8dbaf230b 100644 --- a/lustre/smfs/file.c +++ b/lustre/smfs/file.c @@ -82,9 +82,137 @@ static int smfs_writepage(struct page *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, + 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 */ @@ -169,6 +297,7 @@ static ssize_t smfs_write (struct file *filp, const char *buf, RETURN(rc); } + int smfs_ioctl(struct inode * inode, struct file * filp, unsigned int cmd, unsigned long arg) { @@ -417,7 +546,7 @@ int smfs_setattr(struct dentry *dentry, struct iattr *attr) if (cache_inode->i_op->setattr) rc = cache_inode->i_op->setattr(&open_dentry, attr); - duplicate_inode(inode, cache_inode); + duplicate_inode(cache_inode, dentry->d_inode); RETURN(rc); } @@ -439,7 +568,7 @@ int smfs_setxattr(struct dentry *dentry, const char *name, if (cache_inode->i_op->setattr) rc = cache_inode->i_op->setxattr(&open_dentry, name, value, size, flags); - duplicate_inode(inode, cache_inode); + duplicate_inode(cache_inode, dentry->d_inode); RETURN(rc); } @@ -460,7 +589,7 @@ int smfs_getxattr(struct dentry *dentry, const char *name, if (cache_inode->i_op->setattr) rc = cache_inode->i_op->getxattr(&open_dentry, name, buffer, size); - duplicate_inode(inode, cache_inode); + duplicate_inode(cache_inode, dentry->d_inode); RETURN(rc); } @@ -480,6 +609,7 @@ ssize_t smfs_listxattr(struct dentry *dentry, char *buffer, size_t size) if (cache_inode->i_op->listxattr) rc = cache_inode->i_op->listxattr(&open_dentry, buffer, size); + duplicate_inode(cache_inode, dentry->d_inode); RETURN(rc); } @@ -499,7 +629,7 @@ int smfs_removexattr(struct dentry *dentry, const char *name) if (cache_inode->i_op->removexattr) rc = cache_inode->i_op->removexattr(&open_dentry, name); - duplicate_inode(inode, cache_inode); + duplicate_inode(cache_inode, dentry->d_inode); RETURN(rc); }