X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fsmfs%2Ffile.c;h=d7806bb70bf6b34d8a82d51e0144728c1f7b5de5;hb=44812e65dc5ce1c8b8667b30fbb2f766ed87f17d;hp=c6ccadb03a0271508097943b5b71a87a950c2bb1;hpb=5428cad9926a27d5a4dd73740534924029a2317a;p=fs%2Flustre-release.git diff --git a/lustre/smfs/file.c b/lustre/smfs/file.c index c6ccadb..d7806bb 100644 --- a/lustre/smfs/file.c +++ b/lustre/smfs/file.c @@ -46,7 +46,7 @@ static ssize_t smfs_write(struct file *filp, const char *buf, size_t count, loff_t *ppos) { - struct inode *cache_inode; + struct inode *cache_inode = I2CI(filp->f_dentry->d_inode); struct smfs_file_info *sfi; loff_t *cache_ppos = NULL; int rc = 0; @@ -58,38 +58,24 @@ static ssize_t smfs_write(struct file *filp, const char *buf, size_t count, ENTRY; - cache_inode = I2CI(filp->f_dentry->d_inode); - if (!cache_inode || !cache_inode->i_fop->write) - RETURN(-ENOENT); + LASSERT(cache_inode); + LASSERT(cache_inode->i_fop->write); sfi = F2SMFI(filp); - - if (sfi->magic != SMFS_FILE_MAGIC) - LBUG(); + LASSERT(sfi->magic == SMFS_FILE_MAGIC); if (filp->f_flags & O_APPEND) msg.pos = filp->f_dentry->d_inode->i_size; - pre_smfs_inode(filp->f_dentry->d_inode, cache_inode); - + pre_smfs_file(filp, &msg.pos, &cache_ppos); SMFS_PRE_HOOK(filp->f_dentry->d_inode, HOOK_WRITE, &msg); - if (ppos != &(filp->f_pos)) { - cache_ppos = &msg.pos; - } else { - cache_ppos = &sfi->c_file->f_pos; - } - - *cache_ppos = *ppos; - rc = cache_inode->i_fop->write(sfi->c_file, buf, count, cache_ppos); SMFS_POST_HOOK(filp->f_dentry->d_inode, HOOK_WRITE, &msg, rc); - - post_smfs_inode(filp->f_dentry->d_inode, cache_inode); + post_smfs_file(filp); *ppos = *cache_ppos; - duplicate_file(filp, sfi->c_file); RETURN(rc); } @@ -97,22 +83,21 @@ static ssize_t smfs_write(struct file *filp, const char *buf, size_t count, int smfs_ioctl(struct inode * inode, struct file * filp, unsigned int cmd, unsigned long arg) { - struct inode *cache_inode; + struct inode *cache_inode = I2CI(filp->f_dentry->d_inode); struct smfs_file_info *sfi; ssize_t rc = 0; ENTRY; - cache_inode = I2CI(filp->f_dentry->d_inode); - if (!cache_inode || !cache_inode->i_fop->ioctl) - RETURN(-ENOENT); + LASSERT(cache_inode); + LASSERT(cache_inode->i_fop->ioctl); sfi = F2SMFI(filp); if (sfi->magic != SMFS_FILE_MAGIC) LBUG(); pre_smfs_inode(inode, cache_inode); - + rc = cache_inode->i_fop->ioctl(cache_inode, sfi->c_file, cmd, arg); post_smfs_inode(inode, cache_inode); @@ -124,53 +109,37 @@ int smfs_ioctl(struct inode * inode, struct file * filp, static ssize_t smfs_read(struct file *filp, char *buf, size_t count, loff_t *ppos) { - struct inode *cache_inode; + struct inode *cache_inode = I2CI(filp->f_dentry->d_inode); struct smfs_file_info *sfi; - loff_t tmp_ppos; loff_t *cache_ppos = NULL; ssize_t rc = 0; ENTRY; - cache_inode = I2CI(filp->f_dentry->d_inode); - if (!cache_inode || !cache_inode->i_fop->read) - RETURN(-ENOENT); + LASSERT(cache_inode); + LASSERT(cache_inode->i_fop->read); sfi = F2SMFI(filp); if (sfi->magic != SMFS_FILE_MAGIC) LBUG(); - if (ppos != &(filp->f_pos)) { - cache_ppos = &tmp_ppos; - } else { - cache_ppos = &sfi->c_file->f_pos; - } - *cache_ppos = *ppos; - - pre_smfs_inode(filp->f_dentry->d_inode, cache_inode); - + pre_smfs_file(filp, ppos, &cache_ppos); rc = cache_inode->i_fop->read(sfi->c_file, buf, count, cache_ppos); + post_smfs_file(filp); - *ppos = *cache_ppos; - post_smfs_inode(filp->f_dentry->d_inode, cache_inode); - duplicate_file(filp, sfi->c_file); - RETURN(rc); } -static loff_t smfs_llseek(struct file *file, - loff_t offset, - int origin) +static loff_t smfs_llseek(struct file *file, loff_t offset, int origin) { - struct inode *cache_inode; + struct inode *cache_inode = I2CI(file->f_dentry->d_inode); struct smfs_file_info *sfi; ssize_t rc = 0; ENTRY; - cache_inode = I2CI(file->f_dentry->d_inode); - if (!cache_inode || !cache_inode->i_fop->llseek) - RETURN(-ENOENT); + LASSERT(cache_inode); + LASSERT(cache_inode->i_fop->llseek); sfi = F2SMFI(file); if (sfi->magic != SMFS_FILE_MAGIC) @@ -190,14 +159,12 @@ static int smfs_mmap(struct file *file, struct vm_area_struct *vma) { struct inode *inode = file->f_dentry->d_inode; struct smfs_file_info *sfi; - struct inode *cache_inode = NULL; + struct inode *cache_inode = I2CI(inode); int rc = 0; ENTRY; - cache_inode = I2CI(inode); - if (!cache_inode) - RETURN(-ENOENT); - + LASSERT(cache_inode); + sfi = F2SMFI(file); if (sfi->magic != SMFS_FILE_MAGIC) LBUG(); @@ -284,18 +251,17 @@ static int smfs_cleanup_cache_file(struct file *filp) int smfs_open(struct inode *inode, struct file *filp) { - struct inode *cache_inode = NULL; + struct inode *cache_inode = I2CI(inode); int rc = 0; ENTRY; - cache_inode = I2CI(inode); - if (!cache_inode) - RETURN(-ENOENT); + LASSERT(cache_inode); if ((rc = smfs_init_cache_file(inode, filp))) RETURN(rc); - + //it possible that backstore fs has no open(), + //but we need it to init cache filp if (cache_inode->i_fop->open) { rc = cache_inode->i_fop->open(cache_inode, F2CF(filp)); duplicate_file(filp, F2CF(filp)); @@ -306,15 +272,14 @@ int smfs_open(struct inode *inode, struct file *filp) int smfs_release(struct inode *inode, struct file *filp) { - struct inode *cache_inode = NULL; + struct inode *cache_inode = I2CI(inode); struct file *cache_file = NULL; struct smfs_file_info *sfi = NULL; int rc = 0; + ENTRY; - cache_inode = I2CI(inode); - if (!cache_inode) - RETURN(-ENOENT); + LASSERT(cache_inode); if (filp) { sfi = F2SMFI(filp); @@ -338,12 +303,13 @@ int smfs_fsync(struct file *file, struct dentry *dentry, int datasync) struct smfs_file_info *sfi = NULL; struct dentry *cache_dentry = NULL; struct file *cache_file = NULL; - struct inode *cache_inode; + struct inode *cache_inode = I2CI(dentry->d_inode); int rc = 0; - cache_inode = I2CI(dentry->d_inode); - if (!cache_inode || !cache_inode->i_fop->fsync) - RETURN(-ENOENT); + ENTRY; + + LASSERT(cache_inode); + LASSERT(cache_inode->i_fop->fsync); cache_dentry = pre_smfs_dentry(NULL, cache_inode, dentry); if (!cache_dentry) @@ -397,19 +363,19 @@ static void smfs_truncate(struct inode *inode) int smfs_setattr(struct dentry *dentry, struct iattr *attr) { - struct inode *cache_inode; + struct inode *cache_inode = I2CI(dentry->d_inode); struct dentry *cache_dentry; void *handle = NULL; int rc = 0; - struct hook_setattr_msg msg = { + struct hook_attr_msg msg = { .dentry = dentry, - .attr = attr + .attr = attr, }; - - cache_inode = I2CI(dentry->d_inode); - if (!cache_inode || !cache_inode->i_op->setattr) - RETURN(-ENOENT); + ENTRY; + + LASSERT(cache_inode); + LASSERT(cache_inode->i_op->setattr); cache_dentry = pre_smfs_dentry(NULL, cache_inode, dentry); if (!cache_dentry) @@ -436,25 +402,32 @@ exit: RETURN(rc); } -int smfs_setxattr(struct dentry *dentry, const char *name, const void *value, - size_t size, int flags) +int smfs_setxattr(struct dentry *dentry, const char *name, + const void *value, size_t size, int flags) { - struct inode *cache_inode; - struct dentry *cache_dentry; + struct inode *cache_inode = I2CI(dentry->d_inode); + struct dentry *cache_dentry = NULL; + struct hook_xattr_msg msg = { + .name = (char*)name, + }; int rc = 0; - cache_inode = I2CI(dentry->d_inode); - if (!cache_inode || !cache_inode->i_op->setxattr) - RETURN(-ENOENT); - + ENTRY; + + LASSERT(cache_inode); + LASSERT(cache_inode->i_op->setxattr); + cache_dentry = pre_smfs_dentry(NULL, cache_inode, dentry); if (!cache_dentry) RETURN(-ENOMEM); pre_smfs_inode(dentry->d_inode, cache_inode); + SMFS_PRE_HOOK(dentry->d_inode, HOOK_SETXATTR, &msg); rc = cache_inode->i_op->setxattr(cache_dentry, name, value, size, flags); + + SMFS_POST_HOOK(dentry->d_inode, HOOK_SETXATTR, &msg, rc); post_smfs_inode(dentry->d_inode, cache_inode); post_smfs_dentry(cache_dentry); @@ -462,26 +435,30 @@ int smfs_setxattr(struct dentry *dentry, const char *name, const void *value, RETURN(rc); } -int smfs_getxattr(struct dentry *dentry, const char *name, void *buffer, - size_t size) +int smfs_getxattr(struct dentry *dentry, const char *name, + void *buffer, size_t size) { - struct inode *cache_inode; + struct inode *cache_inode = I2CI(dentry->d_inode); struct dentry *cache_dentry; + struct hook_xattr_msg msg = { + .name = (char*)name, + }; int rc = 0; - cache_inode = I2CI(dentry->d_inode); - if (!cache_inode || !cache_inode->i_op->getattr) - RETURN(-ENOENT); - + ENTRY; + + LASSERT(cache_inode); + LASSERT(cache_inode->i_op->getxattr); + cache_dentry = pre_smfs_dentry(NULL, cache_inode, dentry); if (!cache_dentry) RETURN(-ENOMEM); pre_smfs_inode(dentry->d_inode, cache_inode); - + SMFS_PRE_HOOK(dentry->d_inode, HOOK_GETXATTR, &msg); rc = cache_inode->i_op->getxattr(cache_dentry, name, buffer, size); - + SMFS_POST_HOOK(dentry->d_inode, HOOK_GETXATTR, &msg, rc); post_smfs_inode(dentry->d_inode, cache_inode); post_smfs_dentry(cache_dentry); @@ -490,22 +467,28 @@ int smfs_getxattr(struct dentry *dentry, const char *name, void *buffer, ssize_t smfs_listxattr(struct dentry *dentry, char *buffer, size_t size) { - struct inode *cache_inode; + struct inode *cache_inode = I2CI(dentry->d_inode); struct dentry *cache_dentry; int rc = 0; - - cache_inode = I2CI(dentry->d_inode); - if (!cache_inode || !cache_inode->i_op->listxattr) - RETURN(-ENOENT); + struct hook_xattr_msg msg = { + .name = NULL, + }; + + ENTRY; + + LASSERT(cache_inode); + LASSERT(cache_inode->i_op->listxattr); cache_dentry = pre_smfs_dentry(NULL, cache_inode, dentry); if (!cache_dentry) RETURN(-ENOMEM); pre_smfs_inode(dentry->d_inode, cache_inode); + SMFS_PRE_HOOK(dentry->d_inode, HOOK_LISTXATTR, &msg); rc = cache_inode->i_op->listxattr(cache_dentry, buffer, size); + SMFS_POST_HOOK(dentry->d_inode, HOOK_LISTXATTR, &msg, rc); post_smfs_inode(dentry->d_inode, cache_inode); post_smfs_dentry(cache_dentry); @@ -514,34 +497,68 @@ ssize_t smfs_listxattr(struct dentry *dentry, char *buffer, size_t size) int smfs_removexattr(struct dentry *dentry, const char *name) { - struct inode *cache_inode; + struct inode *cache_inode = I2CI(dentry->d_inode); struct dentry *cache_dentry; int rc = 0; - - cache_inode = I2CI(dentry->d_inode); - if (!cache_inode || !cache_inode->i_op->removexattr) - RETURN(-ENOENT); + struct hook_xattr_msg msg = { + .name = (char*)name, + }; + ENTRY; + + LASSERT(cache_inode); + LASSERT(cache_inode->i_op->removexattr); cache_dentry = pre_smfs_dentry(NULL, cache_inode, dentry); if (!cache_dentry) RETURN(-ENOMEM); pre_smfs_inode(dentry->d_inode, cache_inode); + SMFS_PRE_HOOK(dentry->d_inode, HOOK_REMOVEXATTR, &msg); rc = cache_inode->i_op->removexattr(cache_dentry, name); + SMFS_POST_HOOK(dentry->d_inode, HOOK_REMOVEXATTR, &msg, rc); post_smfs_inode(dentry->d_inode, cache_inode); post_smfs_dentry(cache_dentry); RETURN(rc); } +int smfs_permission(struct inode *inode, int mask, struct nameidata *nd) +{ + struct inode *cache_inode = I2CI(inode); + int rc = 0; + + ENTRY; + + LASSERT(cache_inode); + LASSERT(cache_inode->i_op->permission); + + pre_smfs_inode(inode, cache_inode); + + rc = cache_inode->i_op->permission(cache_inode, mask, nd); + + post_smfs_inode(inode, cache_inode); + + RETURN(rc); +} + struct inode_operations smfs_file_iops = { .truncate = smfs_truncate, /* BKL held */ .setattr = smfs_setattr, /* BKL held */ - .setxattr = smfs_setxattr, /* BKL held */ - .getxattr = smfs_getxattr, /* BKL held */ - .listxattr = smfs_listxattr, /* BKL held */ - .removexattr = smfs_removexattr, /* BKL held */ + .setxattr = smfs_setxattr, + .getxattr = smfs_getxattr, + .listxattr = smfs_listxattr, + .removexattr = smfs_removexattr, + .permission = smfs_permission, +}; + +struct inode_operations smfs_special_iops = { + .setattr = smfs_setattr, /* BKL held */ + .setxattr = smfs_setxattr, + .getxattr = smfs_getxattr, + .listxattr = smfs_listxattr, + .removexattr = smfs_removexattr, + .permission = smfs_permission, };